ERC-721
NFT
Overview
Max Total Supply
4,457 JBAS
Holders
1,167
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 JBASLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
This contract contains unverified libraries: Raffle
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
JapaneseBoredApeSociety
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-20 */ // Sources flattened with hardhat v2.8.3 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File erc721a/contracts/[email protected] // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File contracts/interfaces/IRandomNumberGenerator.sol pragma solidity 0.8.11; interface IRandomNumberGenerator { function getRandomNumber() external; function randomNumber() external view returns (uint256); } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } } // File hardhat/[email protected] pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } } // File contracts/libs/Raffle.sol pragma solidity 0.8.11; library Raffle { struct State { uint256 raffleStartTs; uint256 raffleEndTs; uint256 raffleCap; bytes32 raffleMerkleRoot; address[] registeredUsers; mapping(address => uint256) raffleMap; } function initialize( State storage self, uint256 raffleStartTs, uint256 raffleEndTs, uint256 raffleCap ) public { self.raffleStartTs = raffleStartTs; self.raffleEndTs = raffleEndTs; self.raffleCap = raffleCap; } function getRaffleInfo( State storage self, uint256 skip, uint256 size ) view public returns(uint256, uint256, uint256, uint256, address[] memory, uint256[] memory) { uint256 count = size; uint256[] memory numOfNfts = new uint256[](count); uint256 iterations = skip + size; for (uint256 i = skip; i < iterations; i++) { numOfNfts[i] = self.raffleMap[self.registeredUsers[i]]; } return ( self.raffleStartTs, self.raffleEndTs, self.raffleCap, self.registeredUsers.length, self.registeredUsers, numOfNfts ); } function setRaffleMerkleRoot( State storage self, bytes32 raffleMerkleRoot ) public { self.raffleMerkleRoot = raffleMerkleRoot; } function verifyMerklePath( State storage, address account, bytes32 merkleRoot, bytes32[] memory proof, uint256 alloc ) pure public returns(bool) { return MerkleProof.verify(proof, merkleRoot, keccak256(abi.encodePacked(keccak256(abi.encodePacked(account, alloc))))); } function registerRaffle( State storage self, address user, uint256 qty, uint256 publicPrice ) public { require(block.timestamp >= self.raffleStartTs, "raffle reg not open"); require(block.timestamp <= self.raffleEndTs, "raffle reg closed"); require(qty <= self.raffleCap, "raffle cap"); require(self.raffleMap[user] == 0, "already registered"); require(user.balance >= qty * publicPrice, "not enough funds"); self.raffleMap[user] = qty; self.registeredUsers.push(user); } function buy( State storage self, address user, bytes32[] memory proof, uint256 qty ) public { uint256 alloc = self.raffleMap[user]; require(alloc > 0, "not registered or already claimed"); self.raffleMap[user] = 0; require( verifyMerklePath(self, user, self.raffleMerkleRoot, proof, qty), "not a winner" ); } } // File contracts/JapaneseBoredApeSociety.sol pragma solidity 0.8.11; contract JapaneseBoredApeSociety is Ownable, Pausable, ReentrancyGuard, ERC721A { using Strings for uint256; using Raffle for Raffle.State; Raffle.State private raffleState; string public baseURI; address[2] public treasury; uint256 public immutable teamAllocation; uint256 public immutable personalCap; uint256 public immutable preSaleEndTs; uint256 public immutable publicStartTs; uint256 public maxSupply; uint256 public revealTimestamp; uint256 public whitelistSold; uint256 public presalePrice; uint256 public publicPrice; bytes32 public provenanceHash; bytes32 public whitelistMerkleRoot; IRandomNumberGenerator public randomGenerator; bool private randomNumberReqSent; mapping(address => uint256) public userCount; mapping (address => uint256) public whitelistAccounts; event Presale(address indexed user, uint256 amount); event Registered(address indexed user, uint256 qty); constructor( string memory name, string memory symbol, address[2] memory _treasury, address _randomGenerator, uint256[2] memory _maxSupplyAndTeamAlloc, uint256 _raffleCap, uint256 _personalCap, uint256[2] memory prices, uint256[5] memory _timestamps, bytes32[2] memory provenanceAndMerkeRoot ) ERC721A(name, symbol) { treasury = _treasury; randomGenerator = IRandomNumberGenerator(_randomGenerator); maxSupply = _maxSupplyAndTeamAlloc[0]; teamAllocation = _maxSupplyAndTeamAlloc[1]; personalCap = _personalCap; presalePrice = prices[0]; publicPrice = prices[1]; preSaleEndTs = _timestamps[0]; publicStartTs = _timestamps[3]; revealTimestamp = _timestamps[4]; provenanceHash = provenanceAndMerkeRoot[0]; whitelistMerkleRoot = provenanceAndMerkeRoot[1]; raffleState.initialize( _timestamps[1], _timestamps[2], _raffleCap ); _mint(teamAllocation, treasury[0]); } function setMaxSupply(uint256 _maxSupply) external onlyOwner { maxSupply = _maxSupply; } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function setWhitelistMerkleRoot(bytes32 _whitelistMerkleRoot) external onlyOwner { whitelistMerkleRoot = _whitelistMerkleRoot; } function setRaffleMerkleRoot(bytes32 raffleMerkleRoot) external onlyOwner { raffleState.setRaffleMerkleRoot(raffleMerkleRoot); } function setPrices(uint256 _presalePrice, uint256 _publicPrice) external onlyOwner { presalePrice = _presalePrice; publicPrice = _publicPrice; } function startingIndex() public view returns(uint256) { return randomGenerator.randomNumber(); } function setBaseURI(string memory _baseUri) external onlyOwner { baseURI = _baseUri; } // return the re function getRaffleInfo(uint256 skip, uint256 size) view external returns( uint256, uint256, uint256, uint256, address[] memory, uint256[] memory ) { return raffleState.getRaffleInfo(skip, size); } function tokenURI(uint256 tokenId) public view override returns (string memory) { if(randomGenerator.randomNumber() == 0){ return baseURI; } require(_exists(tokenId), "nonexistent token"); uint256 tokenPath = (startingIndex() + tokenId) % maxSupply; return string(abi.encodePacked(baseURI, tokenPath.toString())); } function verifyMerklePath( address account, bytes32 merkleRoot, bytes32[] memory proof, uint256 alloc ) view public returns(bool) { return raffleState.verifyMerklePath(account, merkleRoot, proof, alloc); } function transferFunds(uint256 totalCost) private { require(msg.value == totalCost, "wrong amount"); // send the purchase price to treausury uint256 amountA = (totalCost * 7000) / 10_000; (bool success, ) = payable(treasury[0]).call{value: amountA}(""); require(success, "transfer failed"); (bool success2, ) = payable(treasury[1]).call{value: totalCost - amountA}(""); require(success2, "transfer failed"); } /// @notice Allows whitelisted addresses to participate in the presale /// @param proof the merkle proof that the given user with the provided allocation is in the merke tree /// @param alloc the initial allocation to this whitelisted account /// @param amount the amount of NFTs to mint function presale( bytes32[] memory proof, uint256 alloc, uint256 amount ) payable external nonReentrant whenNotPaused { require( verifyMerklePath(_msgSender(), whitelistMerkleRoot, proof, alloc), "not whitelisted" ); require(whitelistAccounts[_msgSender()] + amount <= alloc, "all NFTs purchased"); require(block.timestamp <= preSaleEndTs, "presale finished"); whitelistSold += amount; whitelistAccounts[_msgSender()] += amount; // send the purchase price to treausury transferFunds(amount * presalePrice); _mint(amount, _msgSender()); emit Presale(_msgSender(), amount); } function registerRaffle(uint256 qty) external nonReentrant whenNotPaused { require(qty + userCount[_msgSender()] <= personalCap, "too many mints"); raffleState.registerRaffle(_msgSender(), qty, publicPrice); emit Registered(_msgSender(), qty); } function raffleWinnerBuy(bytes32[] memory proof, uint256 qty) external payable { raffleState.buy(_msgSender(), proof, qty); // send the purchase price to treausury transferFunds(qty * publicPrice); _mint(qty, _msgSender()); } function _mint(uint256 qty, address recipient) private { require(totalSupply() + qty <= maxSupply, "max supply"); if(qty > 0) { _safeMint(recipient, qty); userCount[recipient] += qty; } } function publicSale(uint256 qty) external payable nonReentrant whenNotPaused { require(block.timestamp > publicStartTs, "public sale not open"); require(qty + userCount[_msgSender()] <= personalCap, "too many mints"); transferFunds(qty * publicPrice); _mint(qty, _msgSender()); } function reveal() external onlyOwner { if (!randomNumberReqSent && block.timestamp >= revealTimestamp) { randomNumberReqSent = true; randomGenerator.getRandomNumber(); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address[2]","name":"_treasury","type":"address[2]"},{"internalType":"address","name":"_randomGenerator","type":"address"},{"internalType":"uint256[2]","name":"_maxSupplyAndTeamAlloc","type":"uint256[2]"},{"internalType":"uint256","name":"_raffleCap","type":"uint256"},{"internalType":"uint256","name":"_personalCap","type":"uint256"},{"internalType":"uint256[2]","name":"prices","type":"uint256[2]"},{"internalType":"uint256[5]","name":"_timestamps","type":"uint256[5]"},{"internalType":"bytes32[2]","name":"provenanceAndMerkeRoot","type":"bytes32[2]"}],"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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Presale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"qty","type":"uint256"}],"name":"Registered","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"skip","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"}],"name":"getRaffleInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"personalCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleEndTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"alloc","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"presale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenanceHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"publicSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicStartTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"raffleWinnerBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"randomGenerator","outputs":[{"internalType":"contract IRandomNumberGenerator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"registerRaffle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealTimestamp","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presalePrice","type":"uint256"},{"internalType":"uint256","name":"_publicPrice","type":"uint256"}],"name":"setPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"raffleMerkleRoot","type":"bytes32"}],"name":"setRaffleMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_whitelistMerkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamAllocation","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"alloc","type":"uint256"}],"name":"verifyMerklePath","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistAccounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101006040523480156200001257600080fd5b5060405162006e7d38038062006e7d8339818101604052810190620000389190620011a8565b89896200005a6200004e6200035e60201b60201c565b6200036660201b60201c565b60008060146101000a81548160ff0219169083151502179055506001808190555081600490805190602001906200009392919062000ae9565b508060059080519060200190620000ac92919062000ae9565b50620000bd6200042a60201b60201c565b6002819055505050876011906002620000d892919062000b7a565b5086601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600060028110620001315762000130620012de565b5b602002015160138190555085600160028110620001535762000152620012de565b5b6020020151608081815250508360a08181525050826000600281106200017e576200017d620012de565b5b602002015160168190555082600160028110620001a0576200019f620012de565b5b602002015160178190555081600060058110620001c257620001c1620012de565b5b602002015160c0818152505081600360058110620001e557620001e4620012de565b5b602002015160e0818152505081600460058110620002085762000207620012de565b5b6020020151601481905550806000600281106200022a5762000229620012de565b5b6020020151601881905550806001600281106200024c576200024b620012de565b5b6020020151601981905550600a739b401e1461280a0865a9c687cafd8bd71e799c60639e3b28509091846001600581106200028c576200028b620012de565b5b602002015185600260058110620002a857620002a7620012de565b5b6020020151896040518563ffffffff1660e01b8152600401620002cf949392919062001325565b60006040518083038186803b158015620002e857600080fd5b505af4158015620002fd573d6000803e3d6000fd5b505050506200034e608051601160006002811062000320576200031f620012de565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166200042f60201b60201c565b5050505050505050505062001648565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b60135482620004436200050c60201b60201c565b6200044f9190620013a1565b111562000493576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200048a906200145f565b60405180910390fd5b60008211156200050857620004af81836200052b60201b60201c565b81601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620005009190620013a1565b925050819055505b5050565b60006200051e6200042a60201b60201c565b6003546002540303905090565b6200054d8282604051806020016040528060008152506200055160201b60201c565b5050565b6200056683838360016200056b60201b60201c565b505050565b60006002549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415620005da576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141562000616576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200062b60008683876200096860201b60201c565b83600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846006600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426006600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015620008035750620008028773ffffffffffffffffffffffffffffffffffffffff166200096e60201b620026761760201c565b5b15620008d6575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46200088160008884806001019550886200098160201b60201c565b620008b8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156200080a578260025414620008d057600080fd5b62000943565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415620008d7575b81600281905550505062000961600086838762000ae360201b60201c565b5050505050565b50505050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620009af6200035e60201b60201c565b8786866040518563ffffffff1660e01b8152600401620009d3949392919062001500565b6020604051808303816000875af192505050801562000a1257506040513d601f19601f8201168201806040525081019062000a0f9190620015b1565b60015b62000a90573d806000811462000a45576040519150601f19603f3d011682016040523d82523d6000602084013e62000a4a565b606091505b5060008151141562000a88576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b82805462000af79062001612565b90600052602060002090601f01602090048101928262000b1b576000855562000b67565b82601f1062000b3657805160ff191683800117855562000b67565b8280016001018555821562000b67579182015b8281111562000b6657825182559160200191906001019062000b49565b5b50905062000b76919062000bfc565b5090565b826002810192821562000be9579160200282015b8281111562000be85782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000b8e565b5b50905062000bf8919062000bfc565b5090565b5b8082111562000c1757600081600090555060010162000bfd565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000c848262000c39565b810181811067ffffffffffffffff8211171562000ca65762000ca562000c4a565b5b80604052505050565b600062000cbb62000c1b565b905062000cc9828262000c79565b919050565b600067ffffffffffffffff82111562000cec5762000ceb62000c4a565b5b62000cf78262000c39565b9050602081019050919050565b60005b8381101562000d2457808201518184015260208101905062000d07565b8381111562000d34576000848401525b50505050565b600062000d5162000d4b8462000cce565b62000caf565b90508281526020810184848401111562000d705762000d6f62000c34565b5b62000d7d84828562000d04565b509392505050565b600082601f83011262000d9d5762000d9c62000c2f565b5b815162000daf84826020860162000d3a565b91505092915050565b600067ffffffffffffffff82111562000dd65762000dd562000c4a565b5b602082029050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000e138262000de6565b9050919050565b62000e258162000e06565b811462000e3157600080fd5b50565b60008151905062000e458162000e1a565b92915050565b600062000e6262000e5c8462000db8565b62000caf565b9050806020840283018581111562000e7f5762000e7e62000de1565b5b835b8181101562000eac578062000e97888262000e34565b84526020840193505060208101905062000e81565b5050509392505050565b600082601f83011262000ece5762000ecd62000c2f565b5b600262000edd84828562000e4b565b91505092915050565b600067ffffffffffffffff82111562000f045762000f0362000c4a565b5b602082029050919050565b6000819050919050565b62000f248162000f0f565b811462000f3057600080fd5b50565b60008151905062000f448162000f19565b92915050565b600062000f6162000f5b8462000ee6565b62000caf565b9050806020840283018581111562000f7e5762000f7d62000de1565b5b835b8181101562000fab578062000f96888262000f33565b84526020840193505060208101905062000f80565b5050509392505050565b600082601f83011262000fcd5762000fcc62000c2f565b5b600262000fdc84828562000f4a565b91505092915050565b600067ffffffffffffffff82111562001003576200100262000c4a565b5b602082029050919050565b6000620010256200101f8462000fe5565b62000caf565b9050806020840283018581111562001042576200104162000de1565b5b835b818110156200106f57806200105a888262000f33565b84526020840193505060208101905062001044565b5050509392505050565b600082601f83011262001091576200109062000c2f565b5b6005620010a08482856200100e565b91505092915050565b600067ffffffffffffffff821115620010c757620010c662000c4a565b5b602082029050919050565b6000819050919050565b620010e781620010d2565b8114620010f357600080fd5b50565b6000815190506200110781620010dc565b92915050565b6000620011246200111e84620010a9565b62000caf565b9050806020840283018581111562001141576200114062000de1565b5b835b818110156200116e5780620011598882620010f6565b84526020840193505060208101905062001143565b5050509392505050565b600082601f83011262001190576200118f62000c2f565b5b60026200119f8482856200110d565b91505092915050565b6000806000806000806000806000806102408b8d031215620011cf57620011ce62000c25565b5b60008b015167ffffffffffffffff811115620011f057620011ef62000c2a565b5b620011fe8d828e0162000d85565b9a505060208b015167ffffffffffffffff81111562001222576200122162000c2a565b5b620012308d828e0162000d85565b9950506040620012438d828e0162000eb6565b9850506080620012568d828e0162000e34565b97505060a0620012698d828e0162000fb5565b96505060e06200127c8d828e0162000f33565b955050610100620012908d828e0162000f33565b945050610120620012a48d828e0162000fb5565b935050610160620012b88d828e0162001079565b925050610200620012cc8d828e0162001178565b9150509295989b9194979a5092959850565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8082525050565b6200131f8162000f0f565b82525050565b60006080820190506200133c60008301876200130d565b6200134b602083018662001314565b6200135a604083018562001314565b62001369606083018462001314565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620013ae8262000f0f565b9150620013bb8362000f0f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620013f357620013f262001372565b5b828201905092915050565b600082825260208201905092915050565b7f6d617820737570706c7900000000000000000000000000000000000000000000600082015250565b600062001447600a83620013fe565b915062001454826200140f565b602082019050919050565b600060208201905081810360008301526200147a8162001438565b9050919050565b6200148c8162000e06565b82525050565b6200149d8162000f0f565b82525050565b600081519050919050565b600082825260208201905092915050565b6000620014cc82620014a3565b620014d88185620014ae565b9350620014ea81856020860162000d04565b620014f58162000c39565b840191505092915050565b600060808201905062001517600083018762001481565b62001526602083018662001481565b62001535604083018562001492565b8181036060830152620015498184620014bf565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6200158b8162001554565b81146200159757600080fd5b50565b600081519050620015ab8162001580565b92915050565b600060208284031215620015ca57620015c962000c25565b5b6000620015da848285016200159a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200162b57607f821691505b60208210811415620016425762001641620015e3565b5b50919050565b60805160a05160c05160e0516157df6200169e60003960008181611b340152611f5a015260008181611a7a0152611df90152600081816114d101528181611b9601526121710152600061111c01526157df6000f3fe6080604052600436106102ad5760003560e01c806395d89b4111610175578063c0f728ad116100dc578063cb774d4711610095578063e78b9d0b1161006f578063e78b9d0b14610a67578063e985e9c514610a92578063f2fde38b14610acf578063f62f3c1114610af8576102ad565b8063cb774d47146109e6578063d5abeb0114610a11578063dcbad90d14610a3c576102ad565b8063c0f728ad146108d1578063c6ab67a3146108fa578063c7c2aee314610925578063c87b56dd14610950578063c8df13a21461098d578063cafb1522146109ca576102ad565b8063acd302b91161012e578063acd302b9146107f1578063b287c8ed1461081c578063b3fee00f14610838578063b7719e1814610854578063b88d4fde1461087f578063bd32fb66146108a8576102ad565b806395d89b41146106f3578063a22cb4651461071e578063a348056914610747578063a475b5dd14610784578063a945bf801461079b578063aa98e0c6146107c6576102ad565b806355f804b31161021957806370a08231116101d257806370a08231146105f7578063715018a61461063457806376ed7fa41461064b57806383d7e11d146106885780638456cb59146106b15780638da5cb5b146106c8576102ad565b806355f804b3146104e75780635c975abb146105105780636352211e1461053b5780636816521a146105785780636c0360eb146105a35780636f8b44b0146105ce576102ad565b8063131bfe931161026b578063131bfe93146103d457806318160ddd1461041657806323b872dd146104415780633f4ba83a1461046a57806342842e0e146104815780634c5430a0146104aa576102ad565b80620e7fa8146102b257806301ffc9a7146102dd57806305fefda71461031a57806306fdde0314610343578063081812fc1461036e578063095ea7b3146103ab575b600080fd5b3480156102be57600080fd5b506102c7610b23565b6040516102d49190613c04565b60405180910390f35b3480156102e957600080fd5b5061030460048036038101906102ff9190613c8b565b610b29565b6040516103119190613cd3565b60405180910390f35b34801561032657600080fd5b50610341600480360381019061033c9190613d1a565b610c0b565b005b34801561034f57600080fd5b50610358610c99565b6040516103659190613df3565b60405180910390f35b34801561037a57600080fd5b5061039560048036038101906103909190613e15565b610d2b565b6040516103a29190613e83565b60405180910390f35b3480156103b757600080fd5b506103d260048036038101906103cd9190613eca565b610da7565b005b3480156103e057600080fd5b506103fb60048036038101906103f69190613d1a565b610eb2565b60405161040d96959493929190614086565b60405180910390f35b34801561042257600080fd5b5061042b610f55565b6040516104389190613c04565b60405180910390f35b34801561044d57600080fd5b50610468600480360381019061046391906140f5565b610f6c565b005b34801561047657600080fd5b5061047f610f7c565b005b34801561048d57600080fd5b506104a860048036038101906104a391906140f5565b611002565b005b3480156104b657600080fd5b506104d160048036038101906104cc9190613e15565b611022565b6040516104de9190613e83565b60405180910390f35b3480156104f357600080fd5b5061050e6004803603810190610509919061427d565b611058565b005b34801561051c57600080fd5b506105256110ee565b6040516105329190613cd3565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190613e15565b611104565b60405161056f9190613e83565b60405180910390f35b34801561058457600080fd5b5061058d61111a565b60405161059a9190613c04565b60405180910390f35b3480156105af57600080fd5b506105b861113e565b6040516105c59190613df3565b60405180910390f35b3480156105da57600080fd5b506105f560048036038101906105f09190613e15565b6111cc565b005b34801561060357600080fd5b5061061e600480360381019061061991906142c6565b611252565b60405161062b9190613c04565b60405180910390f35b34801561064057600080fd5b50610649611322565b005b34801561065757600080fd5b50610672600480360381019061066d91906143f1565b6113aa565b60405161067f9190613cd3565b60405180910390f35b34801561069457600080fd5b506106af60048036038101906106aa9190613e15565b611439565b005b3480156106bd57600080fd5b506106c661165b565b005b3480156106d457600080fd5b506106dd6116e1565b6040516106ea9190613e83565b60405180910390f35b3480156106ff57600080fd5b5061070861170a565b6040516107159190613df3565b60405180910390f35b34801561072a57600080fd5b50610745600480360381019061074091906144a0565b61179c565b005b34801561075357600080fd5b5061076e600480360381019061076991906142c6565b611914565b60405161077b9190613c04565b60405180910390f35b34801561079057600080fd5b5061079961192c565b005b3480156107a757600080fd5b506107b0611a6c565b6040516107bd9190613c04565b60405180910390f35b3480156107d257600080fd5b506107db611a72565b6040516107e891906144ef565b60405180910390f35b3480156107fd57600080fd5b50610806611a78565b6040516108139190613c04565b60405180910390f35b61083660048036038101906108319190613e15565b611a9c565b005b610852600480360381019061084d919061450a565b611c79565b005b34801561086057600080fd5b50610869611f58565b6040516108769190613c04565b60405180910390f35b34801561088b57600080fd5b506108a660048036038101906108a1919061461a565b611f7c565b005b3480156108b457600080fd5b506108cf60048036038101906108ca919061469d565b611ff8565b005b3480156108dd57600080fd5b506108f860048036038101906108f3919061469d565b61207e565b005b34801561090657600080fd5b5061090f612169565b60405161091c91906144ef565b60405180910390f35b34801561093157600080fd5b5061093a61216f565b6040516109479190613c04565b60405180910390f35b34801561095c57600080fd5b5061097760048036038101906109729190613e15565b612193565b6040516109849190613df3565b60405180910390f35b34801561099957600080fd5b506109b460048036038101906109af91906142c6565b612360565b6040516109c19190613c04565b60405180910390f35b6109e460048036038101906109df91906146ca565b612378565b005b3480156109f257600080fd5b506109fb61241a565b604051610a089190613c04565b60405180910390f35b348015610a1d57600080fd5b50610a266124b2565b604051610a339190613c04565b60405180910390f35b348015610a4857600080fd5b50610a516124b8565b604051610a5e9190614785565b60405180910390f35b348015610a7357600080fd5b50610a7c6124de565b604051610a899190613c04565b60405180910390f35b348015610a9e57600080fd5b50610ab96004803603810190610ab491906147a0565b6124e4565b604051610ac69190613cd3565b60405180910390f35b348015610adb57600080fd5b50610af66004803603810190610af191906142c6565b612578565b005b348015610b0457600080fd5b50610b0d612670565b604051610b1a9190613c04565b60405180910390f35b60165481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bf457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c045750610c0382612689565b5b9050919050565b610c136126f3565b73ffffffffffffffffffffffffffffffffffffffff16610c316116e1565b73ffffffffffffffffffffffffffffffffffffffff1614610c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7e9061482c565b60405180910390fd5b81601681905550806017819055505050565b606060048054610ca89061487b565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd49061487b565b8015610d215780601f10610cf657610100808354040283529160200191610d21565b820191906000526020600020905b815481529060010190602001808311610d0457829003601f168201915b5050505050905090565b6000610d36826126fb565b610d6c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610db282611104565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e1a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e396126f3565b73ffffffffffffffffffffffffffffffffffffffff1614158015610e6b5750610e6981610e646126f3565b6124e4565b155b15610ea2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ead838383612749565b505050565b600080600080606080600a739b401e1461280a0865a9c687cafd8bd71e799c60634b2446e190918a8a6040518463ffffffff1660e01b8152600401610ef9939291906148c3565b600060405180830381865af4158015610f16573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610f3f9190614aaa565b9550955095509550955095509295509295509295565b6000610f5f6127fb565b6003546002540303905090565b610f77838383612800565b505050565b610f846126f3565b73ffffffffffffffffffffffffffffffffffffffff16610fa26116e1565b73ffffffffffffffffffffffffffffffffffffffff1614610ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fef9061482c565b60405180910390fd5b611000612cb6565b565b61101d83838360405180602001604052806000815250611f7c565b505050565b6011816002811061103257600080fd5b016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110606126f3565b73ffffffffffffffffffffffffffffffffffffffff1661107e6116e1565b73ffffffffffffffffffffffffffffffffffffffff16146110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb9061482c565b60405180910390fd5b80601090805190602001906110ea929190613b05565b5050565b60008060149054906101000a900460ff16905090565b600061110f82612d57565b600001519050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6010805461114b9061487b565b80601f01602080910402602001604051908101604052809291908181526020018280546111779061487b565b80156111c45780601f10611199576101008083540402835291602001916111c4565b820191906000526020600020905b8154815290600101906020018083116111a757829003601f168201915b505050505081565b6111d46126f3565b73ffffffffffffffffffffffffffffffffffffffff166111f26116e1565b73ffffffffffffffffffffffffffffffffffffffff1614611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123f9061482c565b60405180910390fd5b8060138190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ba576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61132a6126f3565b73ffffffffffffffffffffffffffffffffffffffff166113486116e1565b73ffffffffffffffffffffffffffffffffffffffff161461139e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113959061482c565b60405180910390fd5b6113a86000612fe6565b565b6000600a739b401e1461280a0865a9c687cafd8bd71e799c6063ac97aea09091878787876040518663ffffffff1660e01b81526004016113ee959493929190614c4b565b602060405180830381865af415801561140b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142f9190614cba565b9050949350505050565b6002600154141561147f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147690614d33565b60405180910390fd5b600260018190555061148f6110ee565b156114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c690614d9f565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000601b60006114fc6126f3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826115429190614dee565b1115611583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157a90614e90565b60405180910390fd5b600a739b401e1461280a0865a9c687cafd8bd71e799c6063931ca15090916115a96126f3565b846017546040518563ffffffff1660e01b81526004016115cc9493929190614eb0565b60006040518083038186803b1580156115e457600080fd5b505af41580156115f8573d6000803e3d6000fd5b505050506116046126f3565b73ffffffffffffffffffffffffffffffffffffffff167f6f3bf3fa84e4763a43b3d23f9d79be242d6d5c834941ff4c1111b67469e1150c826040516116499190613c04565b60405180910390a26001808190555050565b6116636126f3565b73ffffffffffffffffffffffffffffffffffffffff166116816116e1565b73ffffffffffffffffffffffffffffffffffffffff16146116d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ce9061482c565b60405180910390fd5b6116df6130aa565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600580546117199061487b565b80601f01602080910402602001604051908101604052809291908181526020018280546117459061487b565b80156117925780601f1061176757610100808354040283529160200191611792565b820191906000526020600020905b81548152906001019060200180831161177557829003601f168201915b5050505050905090565b6117a46126f3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611809576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600960006118166126f3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118c36126f3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119089190613cd3565b60405180910390a35050565b601b6020528060005260406000206000915090505481565b6119346126f3565b73ffffffffffffffffffffffffffffffffffffffff166119526116e1565b73ffffffffffffffffffffffffffffffffffffffff16146119a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199f9061482c565b60405180910390fd5b601a60149054906101000a900460ff161580156119c757506014544210155b15611a6a576001601a60146101000a81548160ff021916908315150217905550601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dbdff2c16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a5157600080fd5b505af1158015611a65573d6000803e3d6000fd5b505050505b565b60175481565b60195481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60026001541415611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad990614d33565b60405180910390fd5b6002600181905550611af26110ee565b15611b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2990614d9f565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000004211611b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8b90614f41565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000601b6000611bc16126f3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611c079190614dee565b1115611c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3f90614e90565b60405180910390fd5b611c5e60175482611c599190614f61565b61314d565b611c6f81611c6a6126f3565b613383565b6001808190555050565b60026001541415611cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb690614d33565b60405180910390fd5b6002600181905550611ccf6110ee565b15611d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0690614d9f565b60405180910390fd5b611d24611d1a6126f3565b60195485856113aa565b611d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5a90615007565b60405180910390fd5b8181601c6000611d716126f3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611db69190614dee565b1115611df7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dee90615073565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000421115611e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e51906150df565b60405180910390fd5b8060156000828254611e6c9190614dee565b9250508190555080601c6000611e806126f3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ec99190614dee565b92505081905550611ee660165482611ee19190614f61565b61314d565b611ef781611ef26126f3565b613383565b611eff6126f3565b73ffffffffffffffffffffffffffffffffffffffff167f10fcc92ce3ae296b6d2813de054ab2cf2d6dd59a1eed235681bc8bf6c36a5cb782604051611f449190613c04565b60405180910390a260018081905550505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611f87848484612800565b611fa68373ffffffffffffffffffffffffffffffffffffffff16612676565b8015611fbb5750611fb984848484613448565b155b15611ff2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6120006126f3565b73ffffffffffffffffffffffffffffffffffffffff1661201e6116e1565b73ffffffffffffffffffffffffffffffffffffffff1614612074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206b9061482c565b60405180910390fd5b8060198190555050565b6120866126f3565b73ffffffffffffffffffffffffffffffffffffffff166120a46116e1565b73ffffffffffffffffffffffffffffffffffffffff16146120fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f19061482c565b60405180910390fd5b600a739b401e1461280a0865a9c687cafd8bd71e799c6063c83e1e319091836040518363ffffffff1660e01b81526004016121369291906150ff565b60006040518083038186803b15801561214e57600080fd5b505af4158015612162573d6000803e3d6000fd5b5050505050565b60185481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ccbac9f56040518163ffffffff1660e01b8152600401602060405180830381865afa158015612204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122289190615128565b14156122c0576010805461223b9061487b565b80601f01602080910402602001604051908101604052809291908181526020018280546122679061487b565b80156122b45780601f10612289576101008083540402835291602001916122b4565b820191906000526020600020905b81548152906001019060200180831161229757829003601f168201915b5050505050905061235b565b6122c9826126fb565b612308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ff906151a1565b60405180910390fd5b60006013548361231661241a565b6123209190614dee565b61232a91906151f0565b9050601061233782613599565b6040516020016123489291906152f1565b6040516020818303038152906040529150505b919050565b601c6020528060005260406000206000915090505481565b600a739b401e1461280a0865a9c687cafd8bd71e799c6063fb653759909161239e6126f3565b85856040518563ffffffff1660e01b81526004016123bf9493929190615315565b60006040518083038186803b1580156123d757600080fd5b505af41580156123eb573d6000803e3d6000fd5b50505050612405601754826124009190614f61565b61314d565b612416816124116126f3565b613383565b5050565b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ccbac9f56040518163ffffffff1660e01b8152600401602060405180830381865afa158015612489573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ad9190615128565b905090565b60135481565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60155481565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125806126f3565b73ffffffffffffffffffffffffffffffffffffffff1661259e6116e1565b73ffffffffffffffffffffffffffffffffffffffff16146125f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125eb9061482c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265b906153d3565b60405180910390fd5b61266d81612fe6565b50565b60145481565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000816127066127fb565b11158015612715575060025482105b8015612742575060066000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061280b82612d57565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612876576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166128976126f3565b73ffffffffffffffffffffffffffffffffffffffff1614806128c657506128c5856128c06126f3565b6124e4565b5b8061290b57506128d46126f3565b73ffffffffffffffffffffffffffffffffffffffff166128f384610d2b565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612944576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156129ab576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129b885858560016136fa565b6129c460008487612749565b6001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600660008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600660008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c44576002548214612c4357878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612caf8585856001613700565b5050505050565b612cbe6110ee565b612cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf49061543f565b60405180910390fd5b60008060146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612d406126f3565b604051612d4d9190613e83565b60405180910390a1565b612d5f613b8b565b600082905080612d6d6127fb565b11158015612d7c575060025481105b15612faf576000600660008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612fad57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e91578092505050612fe1565b5b600115612fac57818060019003925050600660008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612fa7578092505050612fe1565b612e92565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6130b26110ee565b156130f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e990614d9f565b60405180910390fd5b6001600060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586131366126f3565b6040516131439190613e83565b60405180910390a1565b80341461318f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613186906154ab565b60405180910390fd5b6000612710611b58836131a29190614f61565b6131ac91906154cb565b9050600060116000600281106131c5576131c46154fc565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161320a9061555c565b60006040518083038185875af1925050503d8060008114613247576040519150601f19603f3d011682016040523d82523d6000602084013e61324c565b606091505b5050905080613290576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613287906155bd565b60405180910390fd5b600060116001600281106132a7576132a66154fc565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1683856132eb91906155dd565b6040516132f79061555c565b60006040518083038185875af1925050503d8060008114613334576040519150601f19603f3d011682016040523d82523d6000602084013e613339565b606091505b505090508061337d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613374906155bd565b60405180910390fd5b50505050565b6013548261338f610f55565b6133999190614dee565b11156133da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d19061565d565b60405180910390fd5b6000821115613444576133ed8183613706565b81601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461343c9190614dee565b925050819055505b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261346e6126f3565b8786866040518563ffffffff1660e01b815260040161349094939291906156d2565b6020604051808303816000875af19250505080156134cc57506040513d601f19601f820116820180604052508101906134c99190615733565b60015b613546573d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b5060008151141561353e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008214156135e1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506136f5565b600082905060005b600082146136135780806135fc90615760565b915050600a8261360c91906154cb565b91506135e9565b60008167ffffffffffffffff81111561362f5761362e614152565b5b6040519080825280601f01601f1916602001820160405280156136615781602001600182028036833780820191505090505b5090505b600085146136ee5760018261367a91906155dd565b9150600a8561368991906151f0565b60306136959190614dee565b60f81b8183815181106136ab576136aa6154fc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856136e791906154cb565b9450613665565b8093505050505b919050565b50505050565b50505050565b613720828260405180602001604052806000815250613724565b5050565b6137318383836001613736565b505050565b60006002549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156137a4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156137df576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6137ec60008683876136fa565b83600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846006600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426006600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156139b657506139b58773ffffffffffffffffffffffffffffffffffffffff16612676565b5b15613a7c575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613a2b6000888480600101955088613448565b613a61576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156139bc578260025414613a7757600080fd5b613ae8565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613a7d575b816002819055505050613afe6000868387613700565b5050505050565b828054613b119061487b565b90600052602060002090601f016020900481019282613b335760008555613b7a565b82601f10613b4c57805160ff1916838001178555613b7a565b82800160010185558215613b7a579182015b82811115613b79578251825591602001919060010190613b5e565b5b509050613b879190613bce565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613be7576000816000905550600101613bcf565b5090565b6000819050919050565b613bfe81613beb565b82525050565b6000602082019050613c196000830184613bf5565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c6881613c33565b8114613c7357600080fd5b50565b600081359050613c8581613c5f565b92915050565b600060208284031215613ca157613ca0613c29565b5b6000613caf84828501613c76565b91505092915050565b60008115159050919050565b613ccd81613cb8565b82525050565b6000602082019050613ce86000830184613cc4565b92915050565b613cf781613beb565b8114613d0257600080fd5b50565b600081359050613d1481613cee565b92915050565b60008060408385031215613d3157613d30613c29565b5b6000613d3f85828601613d05565b9250506020613d5085828601613d05565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d94578082015181840152602081019050613d79565b83811115613da3576000848401525b50505050565b6000601f19601f8301169050919050565b6000613dc582613d5a565b613dcf8185613d65565b9350613ddf818560208601613d76565b613de881613da9565b840191505092915050565b60006020820190508181036000830152613e0d8184613dba565b905092915050565b600060208284031215613e2b57613e2a613c29565b5b6000613e3984828501613d05565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e6d82613e42565b9050919050565b613e7d81613e62565b82525050565b6000602082019050613e986000830184613e74565b92915050565b613ea781613e62565b8114613eb257600080fd5b50565b600081359050613ec481613e9e565b92915050565b60008060408385031215613ee157613ee0613c29565b5b6000613eef85828601613eb5565b9250506020613f0085828601613d05565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613f3f81613e62565b82525050565b6000613f518383613f36565b60208301905092915050565b6000602082019050919050565b6000613f7582613f0a565b613f7f8185613f15565b9350613f8a83613f26565b8060005b83811015613fbb578151613fa28882613f45565b9750613fad83613f5d565b925050600181019050613f8e565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613ffd81613beb565b82525050565b600061400f8383613ff4565b60208301905092915050565b6000602082019050919050565b600061403382613fc8565b61403d8185613fd3565b935061404883613fe4565b8060005b838110156140795781516140608882614003565b975061406b8361401b565b92505060018101905061404c565b5085935050505092915050565b600060c08201905061409b6000830189613bf5565b6140a86020830188613bf5565b6140b56040830187613bf5565b6140c26060830186613bf5565b81810360808301526140d48185613f6a565b905081810360a08301526140e88184614028565b9050979650505050505050565b60008060006060848603121561410e5761410d613c29565b5b600061411c86828701613eb5565b935050602061412d86828701613eb5565b925050604061413e86828701613d05565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61418a82613da9565b810181811067ffffffffffffffff821117156141a9576141a8614152565b5b80604052505050565b60006141bc613c1f565b90506141c88282614181565b919050565b600067ffffffffffffffff8211156141e8576141e7614152565b5b6141f182613da9565b9050602081019050919050565b82818337600083830152505050565b600061422061421b846141cd565b6141b2565b90508281526020810184848401111561423c5761423b61414d565b5b6142478482856141fe565b509392505050565b600082601f83011261426457614263614148565b5b813561427484826020860161420d565b91505092915050565b60006020828403121561429357614292613c29565b5b600082013567ffffffffffffffff8111156142b1576142b0613c2e565b5b6142bd8482850161424f565b91505092915050565b6000602082840312156142dc576142db613c29565b5b60006142ea84828501613eb5565b91505092915050565b6000819050919050565b614306816142f3565b811461431157600080fd5b50565b600081359050614323816142fd565b92915050565b600067ffffffffffffffff82111561434457614343614152565b5b602082029050602081019050919050565b600080fd5b600061436d61436884614329565b6141b2565b905080838252602082019050602084028301858111156143905761438f614355565b5b835b818110156143b957806143a58882614314565b845260208401935050602081019050614392565b5050509392505050565b600082601f8301126143d8576143d7614148565b5b81356143e884826020860161435a565b91505092915050565b6000806000806080858703121561440b5761440a613c29565b5b600061441987828801613eb5565b945050602061442a87828801614314565b935050604085013567ffffffffffffffff81111561444b5761444a613c2e565b5b614457878288016143c3565b925050606061446887828801613d05565b91505092959194509250565b61447d81613cb8565b811461448857600080fd5b50565b60008135905061449a81614474565b92915050565b600080604083850312156144b7576144b6613c29565b5b60006144c585828601613eb5565b92505060206144d68582860161448b565b9150509250929050565b6144e9816142f3565b82525050565b600060208201905061450460008301846144e0565b92915050565b60008060006060848603121561452357614522613c29565b5b600084013567ffffffffffffffff81111561454157614540613c2e565b5b61454d868287016143c3565b935050602061455e86828701613d05565b925050604061456f86828701613d05565b9150509250925092565b600067ffffffffffffffff82111561459457614593614152565b5b61459d82613da9565b9050602081019050919050565b60006145bd6145b884614579565b6141b2565b9050828152602081018484840111156145d9576145d861414d565b5b6145e48482856141fe565b509392505050565b600082601f83011261460157614600614148565b5b81356146118482602086016145aa565b91505092915050565b6000806000806080858703121561463457614633613c29565b5b600061464287828801613eb5565b945050602061465387828801613eb5565b935050604061466487828801613d05565b925050606085013567ffffffffffffffff81111561468557614684613c2e565b5b614691878288016145ec565b91505092959194509250565b6000602082840312156146b3576146b2613c29565b5b60006146c184828501614314565b91505092915050565b600080604083850312156146e1576146e0613c29565b5b600083013567ffffffffffffffff8111156146ff576146fe613c2e565b5b61470b858286016143c3565b925050602061471c85828601613d05565b9150509250929050565b6000819050919050565b600061474b61474661474184613e42565b614726565b613e42565b9050919050565b600061475d82614730565b9050919050565b600061476f82614752565b9050919050565b61477f81614764565b82525050565b600060208201905061479a6000830184614776565b92915050565b600080604083850312156147b7576147b6613c29565b5b60006147c585828601613eb5565b92505060206147d685828601613eb5565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614816602083613d65565b9150614821826147e0565b602082019050919050565b6000602082019050818103600083015261484581614809565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061489357607f821691505b602082108114156148a7576148a661484c565b5b50919050565b8082525050565b6148bd81613beb565b82525050565b60006060820190506148d860008301866148ad565b6148e560208301856148b4565b6148f260408301846148b4565b949350505050565b60008151905061490981613cee565b92915050565b600067ffffffffffffffff82111561492a57614929614152565b5b602082029050602081019050919050565b60008151905061494a81613e9e565b92915050565b600061496361495e8461490f565b6141b2565b9050808382526020820190506020840283018581111561498657614985614355565b5b835b818110156149af578061499b888261493b565b845260208401935050602081019050614988565b5050509392505050565b600082601f8301126149ce576149cd614148565b5b81516149de848260208601614950565b91505092915050565b600067ffffffffffffffff821115614a0257614a01614152565b5b602082029050602081019050919050565b6000614a26614a21846149e7565b6141b2565b90508083825260208201905060208402830185811115614a4957614a48614355565b5b835b81811015614a725780614a5e88826148fa565b845260208401935050602081019050614a4b565b5050509392505050565b600082601f830112614a9157614a90614148565b5b8151614aa1848260208601614a13565b91505092915050565b60008060008060008060c08789031215614ac757614ac6613c29565b5b6000614ad589828a016148fa565b9650506020614ae689828a016148fa565b9550506040614af789828a016148fa565b9450506060614b0889828a016148fa565b935050608087015167ffffffffffffffff811115614b2957614b28613c2e565b5b614b3589828a016149b9565b92505060a087015167ffffffffffffffff811115614b5657614b55613c2e565b5b614b6289828a01614a7c565b9150509295509295509295565b614b7881613e62565b82525050565b614b87816142f3565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614bc2816142f3565b82525050565b6000614bd48383614bb9565b60208301905092915050565b6000602082019050919050565b6000614bf882614b8d565b614c028185614b98565b9350614c0d83614ba9565b8060005b83811015614c3e578151614c258882614bc8565b9750614c3083614be0565b925050600181019050614c11565b5085935050505092915050565b600060a082019050614c6060008301886148ad565b614c6d6020830187614b6f565b614c7a6040830186614b7e565b8181036060830152614c8c8185614bed565b9050614c9b60808301846148b4565b9695505050505050565b600081519050614cb481614474565b92915050565b600060208284031215614cd057614ccf613c29565b5b6000614cde84828501614ca5565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614d1d601f83613d65565b9150614d2882614ce7565b602082019050919050565b60006020820190508181036000830152614d4c81614d10565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614d89601083613d65565b9150614d9482614d53565b602082019050919050565b60006020820190508181036000830152614db881614d7c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614df982613beb565b9150614e0483613beb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e3957614e38614dbf565b5b828201905092915050565b7f746f6f206d616e79206d696e7473000000000000000000000000000000000000600082015250565b6000614e7a600e83613d65565b9150614e8582614e44565b602082019050919050565b60006020820190508181036000830152614ea981614e6d565b9050919050565b6000608082019050614ec560008301876148ad565b614ed26020830186614b6f565b614edf60408301856148b4565b614eec60608301846148b4565b95945050505050565b7f7075626c69632073616c65206e6f74206f70656e000000000000000000000000600082015250565b6000614f2b601483613d65565b9150614f3682614ef5565b602082019050919050565b60006020820190508181036000830152614f5a81614f1e565b9050919050565b6000614f6c82613beb565b9150614f7783613beb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fb057614faf614dbf565b5b828202905092915050565b7f6e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b6000614ff1600f83613d65565b9150614ffc82614fbb565b602082019050919050565b6000602082019050818103600083015261502081614fe4565b9050919050565b7f616c6c204e465473207075726368617365640000000000000000000000000000600082015250565b600061505d601283613d65565b915061506882615027565b602082019050919050565b6000602082019050818103600083015261508c81615050565b9050919050565b7f70726573616c652066696e697368656400000000000000000000000000000000600082015250565b60006150c9601083613d65565b91506150d482615093565b602082019050919050565b600060208201905081810360008301526150f8816150bc565b9050919050565b600060408201905061511460008301856148ad565b6151216020830184614b7e565b9392505050565b60006020828403121561513e5761513d613c29565b5b600061514c848285016148fa565b91505092915050565b7f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b600061518b601183613d65565b915061519682615155565b602082019050919050565b600060208201905081810360008301526151ba8161517e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006151fb82613beb565b915061520683613beb565b925082615216576152156151c1565b5b828206905092915050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461524e8161487b565b6152588186615221565b945060018216600081146152735760018114615284576152b7565b60ff198316865281860193506152b7565b61528d8561522c565b60005b838110156152af57815481890152600182019150602081019050615290565b838801955050505b50505092915050565b60006152cb82613d5a565b6152d58185615221565b93506152e5818560208601613d76565b80840191505092915050565b60006152fd8285615241565b915061530982846152c0565b91508190509392505050565b600060808201905061532a60008301876148ad565b6153376020830186614b6f565b81810360408301526153498185614bed565b905061535860608301846148b4565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006153bd602683613d65565b91506153c882615361565b604082019050919050565b600060208201905081810360008301526153ec816153b0565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000615429601483613d65565b9150615434826153f3565b602082019050919050565b600060208201905081810360008301526154588161541c565b9050919050565b7f77726f6e6720616d6f756e740000000000000000000000000000000000000000600082015250565b6000615495600c83613d65565b91506154a08261545f565b602082019050919050565b600060208201905081810360008301526154c481615488565b9050919050565b60006154d682613beb565b91506154e183613beb565b9250826154f1576154f06151c1565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b50565b600061554660008361552b565b915061555182615536565b600082019050919050565b600061556782615539565b9150819050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006155a7600f83613d65565b91506155b282615571565b602082019050919050565b600060208201905081810360008301526155d68161559a565b9050919050565b60006155e882613beb565b91506155f383613beb565b92508282101561560657615605614dbf565b5b828203905092915050565b7f6d617820737570706c7900000000000000000000000000000000000000000000600082015250565b6000615647600a83613d65565b915061565282615611565b602082019050919050565b600060208201905081810360008301526156768161563a565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006156a48261567d565b6156ae8185615688565b93506156be818560208601613d76565b6156c781613da9565b840191505092915050565b60006080820190506156e76000830187613e74565b6156f46020830186613e74565b6157016040830185613bf5565b81810360608301526157138184615699565b905095945050505050565b60008151905061572d81613c5f565b92915050565b60006020828403121561574957615748613c29565b5b60006157578482850161571e565b91505092915050565b600061576b82613beb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561579e5761579d614dbf565b5b60018201905091905056fea264697066735822122070e2c34271438a3fe1326bb57cc5d7347375598ac9ec495a535e6c2e31c07c7764736f6c634300080b00330000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000028000000000000000000000000083f31e00d605e5acc819b334d46de329ab173f9f0000000000000000000000000676ad830718f8a723f6897a2ca9c9bc6e5a3108000000000000000000000000c29b9f3f6f8ee0ab036376baad72dd007f665a6b000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000013fbe85edc90000000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000628a17b000000000000000000000000000000000000000000000000000000000628a25c000000000000000000000000000000000000000000000000000000000628aeaa0000000000000000000000000000000000000000000000000000000007556077500000000000000000000000000000000000000000000000000000000628bcba0ec8a1aedac7521becc66be4da21c9cdaa09fe8d4d3856139bb6fc1cbfa55d707d37a23c4c654dc47c889f37c53ccaa8b5b56266a7732e0edc8240e3193a1d5c600000000000000000000000000000000000000000000000000000000000000194a6170616e65736520426f726e2041706520536f63696574790000000000000000000000000000000000000000000000000000000000000000000000000000044a42415300000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102ad5760003560e01c806395d89b4111610175578063c0f728ad116100dc578063cb774d4711610095578063e78b9d0b1161006f578063e78b9d0b14610a67578063e985e9c514610a92578063f2fde38b14610acf578063f62f3c1114610af8576102ad565b8063cb774d47146109e6578063d5abeb0114610a11578063dcbad90d14610a3c576102ad565b8063c0f728ad146108d1578063c6ab67a3146108fa578063c7c2aee314610925578063c87b56dd14610950578063c8df13a21461098d578063cafb1522146109ca576102ad565b8063acd302b91161012e578063acd302b9146107f1578063b287c8ed1461081c578063b3fee00f14610838578063b7719e1814610854578063b88d4fde1461087f578063bd32fb66146108a8576102ad565b806395d89b41146106f3578063a22cb4651461071e578063a348056914610747578063a475b5dd14610784578063a945bf801461079b578063aa98e0c6146107c6576102ad565b806355f804b31161021957806370a08231116101d257806370a08231146105f7578063715018a61461063457806376ed7fa41461064b57806383d7e11d146106885780638456cb59146106b15780638da5cb5b146106c8576102ad565b806355f804b3146104e75780635c975abb146105105780636352211e1461053b5780636816521a146105785780636c0360eb146105a35780636f8b44b0146105ce576102ad565b8063131bfe931161026b578063131bfe93146103d457806318160ddd1461041657806323b872dd146104415780633f4ba83a1461046a57806342842e0e146104815780634c5430a0146104aa576102ad565b80620e7fa8146102b257806301ffc9a7146102dd57806305fefda71461031a57806306fdde0314610343578063081812fc1461036e578063095ea7b3146103ab575b600080fd5b3480156102be57600080fd5b506102c7610b23565b6040516102d49190613c04565b60405180910390f35b3480156102e957600080fd5b5061030460048036038101906102ff9190613c8b565b610b29565b6040516103119190613cd3565b60405180910390f35b34801561032657600080fd5b50610341600480360381019061033c9190613d1a565b610c0b565b005b34801561034f57600080fd5b50610358610c99565b6040516103659190613df3565b60405180910390f35b34801561037a57600080fd5b5061039560048036038101906103909190613e15565b610d2b565b6040516103a29190613e83565b60405180910390f35b3480156103b757600080fd5b506103d260048036038101906103cd9190613eca565b610da7565b005b3480156103e057600080fd5b506103fb60048036038101906103f69190613d1a565b610eb2565b60405161040d96959493929190614086565b60405180910390f35b34801561042257600080fd5b5061042b610f55565b6040516104389190613c04565b60405180910390f35b34801561044d57600080fd5b50610468600480360381019061046391906140f5565b610f6c565b005b34801561047657600080fd5b5061047f610f7c565b005b34801561048d57600080fd5b506104a860048036038101906104a391906140f5565b611002565b005b3480156104b657600080fd5b506104d160048036038101906104cc9190613e15565b611022565b6040516104de9190613e83565b60405180910390f35b3480156104f357600080fd5b5061050e6004803603810190610509919061427d565b611058565b005b34801561051c57600080fd5b506105256110ee565b6040516105329190613cd3565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190613e15565b611104565b60405161056f9190613e83565b60405180910390f35b34801561058457600080fd5b5061058d61111a565b60405161059a9190613c04565b60405180910390f35b3480156105af57600080fd5b506105b861113e565b6040516105c59190613df3565b60405180910390f35b3480156105da57600080fd5b506105f560048036038101906105f09190613e15565b6111cc565b005b34801561060357600080fd5b5061061e600480360381019061061991906142c6565b611252565b60405161062b9190613c04565b60405180910390f35b34801561064057600080fd5b50610649611322565b005b34801561065757600080fd5b50610672600480360381019061066d91906143f1565b6113aa565b60405161067f9190613cd3565b60405180910390f35b34801561069457600080fd5b506106af60048036038101906106aa9190613e15565b611439565b005b3480156106bd57600080fd5b506106c661165b565b005b3480156106d457600080fd5b506106dd6116e1565b6040516106ea9190613e83565b60405180910390f35b3480156106ff57600080fd5b5061070861170a565b6040516107159190613df3565b60405180910390f35b34801561072a57600080fd5b50610745600480360381019061074091906144a0565b61179c565b005b34801561075357600080fd5b5061076e600480360381019061076991906142c6565b611914565b60405161077b9190613c04565b60405180910390f35b34801561079057600080fd5b5061079961192c565b005b3480156107a757600080fd5b506107b0611a6c565b6040516107bd9190613c04565b60405180910390f35b3480156107d257600080fd5b506107db611a72565b6040516107e891906144ef565b60405180910390f35b3480156107fd57600080fd5b50610806611a78565b6040516108139190613c04565b60405180910390f35b61083660048036038101906108319190613e15565b611a9c565b005b610852600480360381019061084d919061450a565b611c79565b005b34801561086057600080fd5b50610869611f58565b6040516108769190613c04565b60405180910390f35b34801561088b57600080fd5b506108a660048036038101906108a1919061461a565b611f7c565b005b3480156108b457600080fd5b506108cf60048036038101906108ca919061469d565b611ff8565b005b3480156108dd57600080fd5b506108f860048036038101906108f3919061469d565b61207e565b005b34801561090657600080fd5b5061090f612169565b60405161091c91906144ef565b60405180910390f35b34801561093157600080fd5b5061093a61216f565b6040516109479190613c04565b60405180910390f35b34801561095c57600080fd5b5061097760048036038101906109729190613e15565b612193565b6040516109849190613df3565b60405180910390f35b34801561099957600080fd5b506109b460048036038101906109af91906142c6565b612360565b6040516109c19190613c04565b60405180910390f35b6109e460048036038101906109df91906146ca565b612378565b005b3480156109f257600080fd5b506109fb61241a565b604051610a089190613c04565b60405180910390f35b348015610a1d57600080fd5b50610a266124b2565b604051610a339190613c04565b60405180910390f35b348015610a4857600080fd5b50610a516124b8565b604051610a5e9190614785565b60405180910390f35b348015610a7357600080fd5b50610a7c6124de565b604051610a899190613c04565b60405180910390f35b348015610a9e57600080fd5b50610ab96004803603810190610ab491906147a0565b6124e4565b604051610ac69190613cd3565b60405180910390f35b348015610adb57600080fd5b50610af66004803603810190610af191906142c6565b612578565b005b348015610b0457600080fd5b50610b0d612670565b604051610b1a9190613c04565b60405180910390f35b60165481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bf457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c045750610c0382612689565b5b9050919050565b610c136126f3565b73ffffffffffffffffffffffffffffffffffffffff16610c316116e1565b73ffffffffffffffffffffffffffffffffffffffff1614610c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7e9061482c565b60405180910390fd5b81601681905550806017819055505050565b606060048054610ca89061487b565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd49061487b565b8015610d215780601f10610cf657610100808354040283529160200191610d21565b820191906000526020600020905b815481529060010190602001808311610d0457829003601f168201915b5050505050905090565b6000610d36826126fb565b610d6c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610db282611104565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e1a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e396126f3565b73ffffffffffffffffffffffffffffffffffffffff1614158015610e6b5750610e6981610e646126f3565b6124e4565b155b15610ea2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ead838383612749565b505050565b600080600080606080600a739b401e1461280a0865a9c687cafd8bd71e799c60634b2446e190918a8a6040518463ffffffff1660e01b8152600401610ef9939291906148c3565b600060405180830381865af4158015610f16573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610f3f9190614aaa565b9550955095509550955095509295509295509295565b6000610f5f6127fb565b6003546002540303905090565b610f77838383612800565b505050565b610f846126f3565b73ffffffffffffffffffffffffffffffffffffffff16610fa26116e1565b73ffffffffffffffffffffffffffffffffffffffff1614610ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fef9061482c565b60405180910390fd5b611000612cb6565b565b61101d83838360405180602001604052806000815250611f7c565b505050565b6011816002811061103257600080fd5b016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110606126f3565b73ffffffffffffffffffffffffffffffffffffffff1661107e6116e1565b73ffffffffffffffffffffffffffffffffffffffff16146110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb9061482c565b60405180910390fd5b80601090805190602001906110ea929190613b05565b5050565b60008060149054906101000a900460ff16905090565b600061110f82612d57565b600001519050919050565b7f00000000000000000000000000000000000000000000000000000000000001f481565b6010805461114b9061487b565b80601f01602080910402602001604051908101604052809291908181526020018280546111779061487b565b80156111c45780601f10611199576101008083540402835291602001916111c4565b820191906000526020600020905b8154815290600101906020018083116111a757829003601f168201915b505050505081565b6111d46126f3565b73ffffffffffffffffffffffffffffffffffffffff166111f26116e1565b73ffffffffffffffffffffffffffffffffffffffff1614611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123f9061482c565b60405180910390fd5b8060138190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ba576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61132a6126f3565b73ffffffffffffffffffffffffffffffffffffffff166113486116e1565b73ffffffffffffffffffffffffffffffffffffffff161461139e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113959061482c565b60405180910390fd5b6113a86000612fe6565b565b6000600a739b401e1461280a0865a9c687cafd8bd71e799c6063ac97aea09091878787876040518663ffffffff1660e01b81526004016113ee959493929190614c4b565b602060405180830381865af415801561140b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142f9190614cba565b9050949350505050565b6002600154141561147f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147690614d33565b60405180910390fd5b600260018190555061148f6110ee565b156114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c690614d9f565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000007601b60006114fc6126f3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826115429190614dee565b1115611583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157a90614e90565b60405180910390fd5b600a739b401e1461280a0865a9c687cafd8bd71e799c6063931ca15090916115a96126f3565b846017546040518563ffffffff1660e01b81526004016115cc9493929190614eb0565b60006040518083038186803b1580156115e457600080fd5b505af41580156115f8573d6000803e3d6000fd5b505050506116046126f3565b73ffffffffffffffffffffffffffffffffffffffff167f6f3bf3fa84e4763a43b3d23f9d79be242d6d5c834941ff4c1111b67469e1150c826040516116499190613c04565b60405180910390a26001808190555050565b6116636126f3565b73ffffffffffffffffffffffffffffffffffffffff166116816116e1565b73ffffffffffffffffffffffffffffffffffffffff16146116d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ce9061482c565b60405180910390fd5b6116df6130aa565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600580546117199061487b565b80601f01602080910402602001604051908101604052809291908181526020018280546117459061487b565b80156117925780601f1061176757610100808354040283529160200191611792565b820191906000526020600020905b81548152906001019060200180831161177557829003601f168201915b5050505050905090565b6117a46126f3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611809576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600960006118166126f3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118c36126f3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119089190613cd3565b60405180910390a35050565b601b6020528060005260406000206000915090505481565b6119346126f3565b73ffffffffffffffffffffffffffffffffffffffff166119526116e1565b73ffffffffffffffffffffffffffffffffffffffff16146119a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199f9061482c565b60405180910390fd5b601a60149054906101000a900460ff161580156119c757506014544210155b15611a6a576001601a60146101000a81548160ff021916908315150217905550601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dbdff2c16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a5157600080fd5b505af1158015611a65573d6000803e3d6000fd5b505050505b565b60175481565b60195481565b7f00000000000000000000000000000000000000000000000000000000628a17b081565b60026001541415611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad990614d33565b60405180910390fd5b6002600181905550611af26110ee565b15611b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2990614d9f565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000755607754211611b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8b90614f41565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000007601b6000611bc16126f3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611c079190614dee565b1115611c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3f90614e90565b60405180910390fd5b611c5e60175482611c599190614f61565b61314d565b611c6f81611c6a6126f3565b613383565b6001808190555050565b60026001541415611cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb690614d33565b60405180910390fd5b6002600181905550611ccf6110ee565b15611d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0690614d9f565b60405180910390fd5b611d24611d1a6126f3565b60195485856113aa565b611d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5a90615007565b60405180910390fd5b8181601c6000611d716126f3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611db69190614dee565b1115611df7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dee90615073565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000628a17b0421115611e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e51906150df565b60405180910390fd5b8060156000828254611e6c9190614dee565b9250508190555080601c6000611e806126f3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ec99190614dee565b92505081905550611ee660165482611ee19190614f61565b61314d565b611ef781611ef26126f3565b613383565b611eff6126f3565b73ffffffffffffffffffffffffffffffffffffffff167f10fcc92ce3ae296b6d2813de054ab2cf2d6dd59a1eed235681bc8bf6c36a5cb782604051611f449190613c04565b60405180910390a260018081905550505050565b7f000000000000000000000000000000000000000000000000000000007556077581565b611f87848484612800565b611fa68373ffffffffffffffffffffffffffffffffffffffff16612676565b8015611fbb5750611fb984848484613448565b155b15611ff2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6120006126f3565b73ffffffffffffffffffffffffffffffffffffffff1661201e6116e1565b73ffffffffffffffffffffffffffffffffffffffff1614612074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206b9061482c565b60405180910390fd5b8060198190555050565b6120866126f3565b73ffffffffffffffffffffffffffffffffffffffff166120a46116e1565b73ffffffffffffffffffffffffffffffffffffffff16146120fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f19061482c565b60405180910390fd5b600a739b401e1461280a0865a9c687cafd8bd71e799c6063c83e1e319091836040518363ffffffff1660e01b81526004016121369291906150ff565b60006040518083038186803b15801561214e57600080fd5b505af4158015612162573d6000803e3d6000fd5b5050505050565b60185481565b7f000000000000000000000000000000000000000000000000000000000000000781565b60606000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ccbac9f56040518163ffffffff1660e01b8152600401602060405180830381865afa158015612204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122289190615128565b14156122c0576010805461223b9061487b565b80601f01602080910402602001604051908101604052809291908181526020018280546122679061487b565b80156122b45780601f10612289576101008083540402835291602001916122b4565b820191906000526020600020905b81548152906001019060200180831161229757829003601f168201915b5050505050905061235b565b6122c9826126fb565b612308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ff906151a1565b60405180910390fd5b60006013548361231661241a565b6123209190614dee565b61232a91906151f0565b9050601061233782613599565b6040516020016123489291906152f1565b6040516020818303038152906040529150505b919050565b601c6020528060005260406000206000915090505481565b600a739b401e1461280a0865a9c687cafd8bd71e799c6063fb653759909161239e6126f3565b85856040518563ffffffff1660e01b81526004016123bf9493929190615315565b60006040518083038186803b1580156123d757600080fd5b505af41580156123eb573d6000803e3d6000fd5b50505050612405601754826124009190614f61565b61314d565b612416816124116126f3565b613383565b5050565b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ccbac9f56040518163ffffffff1660e01b8152600401602060405180830381865afa158015612489573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ad9190615128565b905090565b60135481565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60155481565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125806126f3565b73ffffffffffffffffffffffffffffffffffffffff1661259e6116e1565b73ffffffffffffffffffffffffffffffffffffffff16146125f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125eb9061482c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265b906153d3565b60405180910390fd5b61266d81612fe6565b50565b60145481565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000816127066127fb565b11158015612715575060025482105b8015612742575060066000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061280b82612d57565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612876576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166128976126f3565b73ffffffffffffffffffffffffffffffffffffffff1614806128c657506128c5856128c06126f3565b6124e4565b5b8061290b57506128d46126f3565b73ffffffffffffffffffffffffffffffffffffffff166128f384610d2b565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612944576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156129ab576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129b885858560016136fa565b6129c460008487612749565b6001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600660008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600660008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c44576002548214612c4357878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612caf8585856001613700565b5050505050565b612cbe6110ee565b612cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf49061543f565b60405180910390fd5b60008060146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612d406126f3565b604051612d4d9190613e83565b60405180910390a1565b612d5f613b8b565b600082905080612d6d6127fb565b11158015612d7c575060025481105b15612faf576000600660008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612fad57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e91578092505050612fe1565b5b600115612fac57818060019003925050600660008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612fa7578092505050612fe1565b612e92565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6130b26110ee565b156130f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e990614d9f565b60405180910390fd5b6001600060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586131366126f3565b6040516131439190613e83565b60405180910390a1565b80341461318f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613186906154ab565b60405180910390fd5b6000612710611b58836131a29190614f61565b6131ac91906154cb565b9050600060116000600281106131c5576131c46154fc565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161320a9061555c565b60006040518083038185875af1925050503d8060008114613247576040519150601f19603f3d011682016040523d82523d6000602084013e61324c565b606091505b5050905080613290576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613287906155bd565b60405180910390fd5b600060116001600281106132a7576132a66154fc565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1683856132eb91906155dd565b6040516132f79061555c565b60006040518083038185875af1925050503d8060008114613334576040519150601f19603f3d011682016040523d82523d6000602084013e613339565b606091505b505090508061337d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613374906155bd565b60405180910390fd5b50505050565b6013548261338f610f55565b6133999190614dee565b11156133da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d19061565d565b60405180910390fd5b6000821115613444576133ed8183613706565b81601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461343c9190614dee565b925050819055505b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261346e6126f3565b8786866040518563ffffffff1660e01b815260040161349094939291906156d2565b6020604051808303816000875af19250505080156134cc57506040513d601f19601f820116820180604052508101906134c99190615733565b60015b613546573d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b5060008151141561353e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008214156135e1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506136f5565b600082905060005b600082146136135780806135fc90615760565b915050600a8261360c91906154cb565b91506135e9565b60008167ffffffffffffffff81111561362f5761362e614152565b5b6040519080825280601f01601f1916602001820160405280156136615781602001600182028036833780820191505090505b5090505b600085146136ee5760018261367a91906155dd565b9150600a8561368991906151f0565b60306136959190614dee565b60f81b8183815181106136ab576136aa6154fc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856136e791906154cb565b9450613665565b8093505050505b919050565b50505050565b50505050565b613720828260405180602001604052806000815250613724565b5050565b6137318383836001613736565b505050565b60006002549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156137a4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156137df576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6137ec60008683876136fa565b83600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846006600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426006600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156139b657506139b58773ffffffffffffffffffffffffffffffffffffffff16612676565b5b15613a7c575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613a2b6000888480600101955088613448565b613a61576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156139bc578260025414613a7757600080fd5b613ae8565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613a7d575b816002819055505050613afe6000868387613700565b5050505050565b828054613b119061487b565b90600052602060002090601f016020900481019282613b335760008555613b7a565b82601f10613b4c57805160ff1916838001178555613b7a565b82800160010185558215613b7a579182015b82811115613b79578251825591602001919060010190613b5e565b5b509050613b879190613bce565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613be7576000816000905550600101613bcf565b5090565b6000819050919050565b613bfe81613beb565b82525050565b6000602082019050613c196000830184613bf5565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c6881613c33565b8114613c7357600080fd5b50565b600081359050613c8581613c5f565b92915050565b600060208284031215613ca157613ca0613c29565b5b6000613caf84828501613c76565b91505092915050565b60008115159050919050565b613ccd81613cb8565b82525050565b6000602082019050613ce86000830184613cc4565b92915050565b613cf781613beb565b8114613d0257600080fd5b50565b600081359050613d1481613cee565b92915050565b60008060408385031215613d3157613d30613c29565b5b6000613d3f85828601613d05565b9250506020613d5085828601613d05565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d94578082015181840152602081019050613d79565b83811115613da3576000848401525b50505050565b6000601f19601f8301169050919050565b6000613dc582613d5a565b613dcf8185613d65565b9350613ddf818560208601613d76565b613de881613da9565b840191505092915050565b60006020820190508181036000830152613e0d8184613dba565b905092915050565b600060208284031215613e2b57613e2a613c29565b5b6000613e3984828501613d05565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e6d82613e42565b9050919050565b613e7d81613e62565b82525050565b6000602082019050613e986000830184613e74565b92915050565b613ea781613e62565b8114613eb257600080fd5b50565b600081359050613ec481613e9e565b92915050565b60008060408385031215613ee157613ee0613c29565b5b6000613eef85828601613eb5565b9250506020613f0085828601613d05565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613f3f81613e62565b82525050565b6000613f518383613f36565b60208301905092915050565b6000602082019050919050565b6000613f7582613f0a565b613f7f8185613f15565b9350613f8a83613f26565b8060005b83811015613fbb578151613fa28882613f45565b9750613fad83613f5d565b925050600181019050613f8e565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613ffd81613beb565b82525050565b600061400f8383613ff4565b60208301905092915050565b6000602082019050919050565b600061403382613fc8565b61403d8185613fd3565b935061404883613fe4565b8060005b838110156140795781516140608882614003565b975061406b8361401b565b92505060018101905061404c565b5085935050505092915050565b600060c08201905061409b6000830189613bf5565b6140a86020830188613bf5565b6140b56040830187613bf5565b6140c26060830186613bf5565b81810360808301526140d48185613f6a565b905081810360a08301526140e88184614028565b9050979650505050505050565b60008060006060848603121561410e5761410d613c29565b5b600061411c86828701613eb5565b935050602061412d86828701613eb5565b925050604061413e86828701613d05565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61418a82613da9565b810181811067ffffffffffffffff821117156141a9576141a8614152565b5b80604052505050565b60006141bc613c1f565b90506141c88282614181565b919050565b600067ffffffffffffffff8211156141e8576141e7614152565b5b6141f182613da9565b9050602081019050919050565b82818337600083830152505050565b600061422061421b846141cd565b6141b2565b90508281526020810184848401111561423c5761423b61414d565b5b6142478482856141fe565b509392505050565b600082601f83011261426457614263614148565b5b813561427484826020860161420d565b91505092915050565b60006020828403121561429357614292613c29565b5b600082013567ffffffffffffffff8111156142b1576142b0613c2e565b5b6142bd8482850161424f565b91505092915050565b6000602082840312156142dc576142db613c29565b5b60006142ea84828501613eb5565b91505092915050565b6000819050919050565b614306816142f3565b811461431157600080fd5b50565b600081359050614323816142fd565b92915050565b600067ffffffffffffffff82111561434457614343614152565b5b602082029050602081019050919050565b600080fd5b600061436d61436884614329565b6141b2565b905080838252602082019050602084028301858111156143905761438f614355565b5b835b818110156143b957806143a58882614314565b845260208401935050602081019050614392565b5050509392505050565b600082601f8301126143d8576143d7614148565b5b81356143e884826020860161435a565b91505092915050565b6000806000806080858703121561440b5761440a613c29565b5b600061441987828801613eb5565b945050602061442a87828801614314565b935050604085013567ffffffffffffffff81111561444b5761444a613c2e565b5b614457878288016143c3565b925050606061446887828801613d05565b91505092959194509250565b61447d81613cb8565b811461448857600080fd5b50565b60008135905061449a81614474565b92915050565b600080604083850312156144b7576144b6613c29565b5b60006144c585828601613eb5565b92505060206144d68582860161448b565b9150509250929050565b6144e9816142f3565b82525050565b600060208201905061450460008301846144e0565b92915050565b60008060006060848603121561452357614522613c29565b5b600084013567ffffffffffffffff81111561454157614540613c2e565b5b61454d868287016143c3565b935050602061455e86828701613d05565b925050604061456f86828701613d05565b9150509250925092565b600067ffffffffffffffff82111561459457614593614152565b5b61459d82613da9565b9050602081019050919050565b60006145bd6145b884614579565b6141b2565b9050828152602081018484840111156145d9576145d861414d565b5b6145e48482856141fe565b509392505050565b600082601f83011261460157614600614148565b5b81356146118482602086016145aa565b91505092915050565b6000806000806080858703121561463457614633613c29565b5b600061464287828801613eb5565b945050602061465387828801613eb5565b935050604061466487828801613d05565b925050606085013567ffffffffffffffff81111561468557614684613c2e565b5b614691878288016145ec565b91505092959194509250565b6000602082840312156146b3576146b2613c29565b5b60006146c184828501614314565b91505092915050565b600080604083850312156146e1576146e0613c29565b5b600083013567ffffffffffffffff8111156146ff576146fe613c2e565b5b61470b858286016143c3565b925050602061471c85828601613d05565b9150509250929050565b6000819050919050565b600061474b61474661474184613e42565b614726565b613e42565b9050919050565b600061475d82614730565b9050919050565b600061476f82614752565b9050919050565b61477f81614764565b82525050565b600060208201905061479a6000830184614776565b92915050565b600080604083850312156147b7576147b6613c29565b5b60006147c585828601613eb5565b92505060206147d685828601613eb5565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614816602083613d65565b9150614821826147e0565b602082019050919050565b6000602082019050818103600083015261484581614809565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061489357607f821691505b602082108114156148a7576148a661484c565b5b50919050565b8082525050565b6148bd81613beb565b82525050565b60006060820190506148d860008301866148ad565b6148e560208301856148b4565b6148f260408301846148b4565b949350505050565b60008151905061490981613cee565b92915050565b600067ffffffffffffffff82111561492a57614929614152565b5b602082029050602081019050919050565b60008151905061494a81613e9e565b92915050565b600061496361495e8461490f565b6141b2565b9050808382526020820190506020840283018581111561498657614985614355565b5b835b818110156149af578061499b888261493b565b845260208401935050602081019050614988565b5050509392505050565b600082601f8301126149ce576149cd614148565b5b81516149de848260208601614950565b91505092915050565b600067ffffffffffffffff821115614a0257614a01614152565b5b602082029050602081019050919050565b6000614a26614a21846149e7565b6141b2565b90508083825260208201905060208402830185811115614a4957614a48614355565b5b835b81811015614a725780614a5e88826148fa565b845260208401935050602081019050614a4b565b5050509392505050565b600082601f830112614a9157614a90614148565b5b8151614aa1848260208601614a13565b91505092915050565b60008060008060008060c08789031215614ac757614ac6613c29565b5b6000614ad589828a016148fa565b9650506020614ae689828a016148fa565b9550506040614af789828a016148fa565b9450506060614b0889828a016148fa565b935050608087015167ffffffffffffffff811115614b2957614b28613c2e565b5b614b3589828a016149b9565b92505060a087015167ffffffffffffffff811115614b5657614b55613c2e565b5b614b6289828a01614a7c565b9150509295509295509295565b614b7881613e62565b82525050565b614b87816142f3565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614bc2816142f3565b82525050565b6000614bd48383614bb9565b60208301905092915050565b6000602082019050919050565b6000614bf882614b8d565b614c028185614b98565b9350614c0d83614ba9565b8060005b83811015614c3e578151614c258882614bc8565b9750614c3083614be0565b925050600181019050614c11565b5085935050505092915050565b600060a082019050614c6060008301886148ad565b614c6d6020830187614b6f565b614c7a6040830186614b7e565b8181036060830152614c8c8185614bed565b9050614c9b60808301846148b4565b9695505050505050565b600081519050614cb481614474565b92915050565b600060208284031215614cd057614ccf613c29565b5b6000614cde84828501614ca5565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614d1d601f83613d65565b9150614d2882614ce7565b602082019050919050565b60006020820190508181036000830152614d4c81614d10565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614d89601083613d65565b9150614d9482614d53565b602082019050919050565b60006020820190508181036000830152614db881614d7c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614df982613beb565b9150614e0483613beb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e3957614e38614dbf565b5b828201905092915050565b7f746f6f206d616e79206d696e7473000000000000000000000000000000000000600082015250565b6000614e7a600e83613d65565b9150614e8582614e44565b602082019050919050565b60006020820190508181036000830152614ea981614e6d565b9050919050565b6000608082019050614ec560008301876148ad565b614ed26020830186614b6f565b614edf60408301856148b4565b614eec60608301846148b4565b95945050505050565b7f7075626c69632073616c65206e6f74206f70656e000000000000000000000000600082015250565b6000614f2b601483613d65565b9150614f3682614ef5565b602082019050919050565b60006020820190508181036000830152614f5a81614f1e565b9050919050565b6000614f6c82613beb565b9150614f7783613beb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fb057614faf614dbf565b5b828202905092915050565b7f6e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b6000614ff1600f83613d65565b9150614ffc82614fbb565b602082019050919050565b6000602082019050818103600083015261502081614fe4565b9050919050565b7f616c6c204e465473207075726368617365640000000000000000000000000000600082015250565b600061505d601283613d65565b915061506882615027565b602082019050919050565b6000602082019050818103600083015261508c81615050565b9050919050565b7f70726573616c652066696e697368656400000000000000000000000000000000600082015250565b60006150c9601083613d65565b91506150d482615093565b602082019050919050565b600060208201905081810360008301526150f8816150bc565b9050919050565b600060408201905061511460008301856148ad565b6151216020830184614b7e565b9392505050565b60006020828403121561513e5761513d613c29565b5b600061514c848285016148fa565b91505092915050565b7f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b600061518b601183613d65565b915061519682615155565b602082019050919050565b600060208201905081810360008301526151ba8161517e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006151fb82613beb565b915061520683613beb565b925082615216576152156151c1565b5b828206905092915050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461524e8161487b565b6152588186615221565b945060018216600081146152735760018114615284576152b7565b60ff198316865281860193506152b7565b61528d8561522c565b60005b838110156152af57815481890152600182019150602081019050615290565b838801955050505b50505092915050565b60006152cb82613d5a565b6152d58185615221565b93506152e5818560208601613d76565b80840191505092915050565b60006152fd8285615241565b915061530982846152c0565b91508190509392505050565b600060808201905061532a60008301876148ad565b6153376020830186614b6f565b81810360408301526153498185614bed565b905061535860608301846148b4565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006153bd602683613d65565b91506153c882615361565b604082019050919050565b600060208201905081810360008301526153ec816153b0565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000615429601483613d65565b9150615434826153f3565b602082019050919050565b600060208201905081810360008301526154588161541c565b9050919050565b7f77726f6e6720616d6f756e740000000000000000000000000000000000000000600082015250565b6000615495600c83613d65565b91506154a08261545f565b602082019050919050565b600060208201905081810360008301526154c481615488565b9050919050565b60006154d682613beb565b91506154e183613beb565b9250826154f1576154f06151c1565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b50565b600061554660008361552b565b915061555182615536565b600082019050919050565b600061556782615539565b9150819050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006155a7600f83613d65565b91506155b282615571565b602082019050919050565b600060208201905081810360008301526155d68161559a565b9050919050565b60006155e882613beb565b91506155f383613beb565b92508282101561560657615605614dbf565b5b828203905092915050565b7f6d617820737570706c7900000000000000000000000000000000000000000000600082015250565b6000615647600a83613d65565b915061565282615611565b602082019050919050565b600060208201905081810360008301526156768161563a565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006156a48261567d565b6156ae8185615688565b93506156be818560208601613d76565b6156c781613da9565b840191505092915050565b60006080820190506156e76000830187613e74565b6156f46020830186613e74565b6157016040830185613bf5565b81810360608301526157138184615699565b905095945050505050565b60008151905061572d81613c5f565b92915050565b60006020828403121561574957615748613c29565b5b60006157578482850161571e565b91505092915050565b600061576b82613beb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561579e5761579d614dbf565b5b60018201905091905056fea264697066735822122070e2c34271438a3fe1326bb57cc5d7347375598ac9ec495a535e6c2e31c07c7764736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000028000000000000000000000000083f31e00d605e5acc819b334d46de329ab173f9f0000000000000000000000000676ad830718f8a723f6897a2ca9c9bc6e5a3108000000000000000000000000c29b9f3f6f8ee0ab036376baad72dd007f665a6b000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000013fbe85edc90000000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000628a17b000000000000000000000000000000000000000000000000000000000628a25c000000000000000000000000000000000000000000000000000000000628aeaa0000000000000000000000000000000000000000000000000000000007556077500000000000000000000000000000000000000000000000000000000628bcba0ec8a1aedac7521becc66be4da21c9cdaa09fe8d4d3856139bb6fc1cbfa55d707d37a23c4c654dc47c889f37c53ccaa8b5b56266a7732e0edc8240e3193a1d5c600000000000000000000000000000000000000000000000000000000000000194a6170616e65736520426f726e2041706520536f63696574790000000000000000000000000000000000000000000000000000000000000000000000000000044a42415300000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): Japanese Born Ape Society
Arg [1] : symbol (string): JBAS
Arg [2] : _treasury (address[2]): 0x83f31E00d605E5ACC819B334D46De329ab173f9f,0x0676aD830718f8A723F6897A2cA9C9bC6E5A3108
Arg [3] : _randomGenerator (address): 0xc29b9F3F6F8Ee0ab036376Baad72Dd007f665a6B
Arg [4] : _maxSupplyAndTeamAlloc (uint256[2]): 10000,500
Arg [5] : _raffleCap (uint256): 7
Arg [6] : _personalCap (uint256): 7
Arg [7] : prices (uint256[2]): 90000000000000000,90000000000000000
Arg [8] : _timestamps (uint256[5]): 1653217200,1653220800,1653271200,1968572277,1653328800
Arg [9] : provenanceAndMerkeRoot (bytes32[2]): System.Byte[],System.Byte[]
-----Encoded View---------------
22 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000240
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000280
Arg [2] : 00000000000000000000000083f31e00d605e5acc819b334d46de329ab173f9f
Arg [3] : 0000000000000000000000000676ad830718f8a723f6897a2ca9c9bc6e5a3108
Arg [4] : 000000000000000000000000c29b9f3f6f8ee0ab036376baad72dd007f665a6b
Arg [5] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [6] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [9] : 000000000000000000000000000000000000000000000000013fbe85edc90000
Arg [10] : 000000000000000000000000000000000000000000000000013fbe85edc90000
Arg [11] : 00000000000000000000000000000000000000000000000000000000628a17b0
Arg [12] : 00000000000000000000000000000000000000000000000000000000628a25c0
Arg [13] : 00000000000000000000000000000000000000000000000000000000628aeaa0
Arg [14] : 0000000000000000000000000000000000000000000000000000000075560775
Arg [15] : 00000000000000000000000000000000000000000000000000000000628bcba0
Arg [16] : ec8a1aedac7521becc66be4da21c9cdaa09fe8d4d3856139bb6fc1cbfa55d707
Arg [17] : d37a23c4c654dc47c889f37c53ccaa8b5b56266a7732e0edc8240e3193a1d5c6
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [19] : 4a6170616e65736520426f726e2041706520536f636965747900000000000000
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [21] : 4a42415300000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
118252:6421:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118766:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24231:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;120747:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27344:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28847:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28410:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;121140:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;23480:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29712:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;120398:59;;;;;;;;;;;;;:::i;:::-;;29953:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;118468:26;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;121020:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43112:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27152:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;118499:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;118442:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;120235:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24600:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48780:103;;;;;;;;;;;;;:::i;:::-;;121741:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;123408:263;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;120337:55;;;;;;;;;;;;;:::i;:::-;;48129:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27513:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29123:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;118991:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;124472:198;;;;;;;;;;;;;:::i;:::-;;118798:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;118863:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;118584:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;124162:304;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;122738:664;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;118626:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30209:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;120463:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;120605;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;118829:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;118543:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;121383:352;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;119040:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;123677:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;120910:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;118669:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;118902:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;118733:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29481:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49038:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;118698:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;118766:27;;;;:::o;24231:305::-;24333:4;24385:25;24370:40;;;:11;:40;;;;:105;;;;24442:33;24427:48;;;:11;:48;;;;24370:105;:158;;;;24492:36;24516:11;24492:23;:36::i;:::-;24370:158;24350:178;;24231:305;;;:::o;120747:157::-;48360:12;:10;:12::i;:::-;48349:23;;:7;:5;:7::i;:::-;:23;;;48341:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;120852:13:::1;120837:12;:28;;;;120886:12;120872:11;:26;;;;120747:157:::0;;:::o;27344:100::-;27398:13;27431:5;27424:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27344:100;:::o;28847:204::-;28915:7;28940:16;28948:7;28940;:16::i;:::-;28935:64;;28965:34;;;;;;;;;;;;;;28935:64;29019:15;:24;29035:7;29019:24;;;;;;;;;;;;;;;;;;;;;29012:31;;28847:204;;;:::o;28410:371::-;28483:13;28499:24;28515:7;28499:15;:24::i;:::-;28483:40;;28544:5;28538:11;;:2;:11;;;28534:48;;;28558:24;;;;;;;;;;;;;;28534:48;28615:5;28599:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;28625:37;28642:5;28649:12;:10;:12::i;:::-;28625:16;:37::i;:::-;28624:38;28599:63;28595:138;;;28686:35;;;;;;;;;;;;;;28595:138;28745:28;28754:2;28758:7;28767:5;28745:8;:28::i;:::-;28472:309;28410:371;;:::o;121140:237::-;121219:7;121233;121247;121261;121275:16;121298;121334:11;:25;;;;121360:4;121366;121334:37;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;121327:44;;;;;;;;;;;;121140:237;;;;;;;;:::o;23480:303::-;23524:7;23749:15;:13;:15::i;:::-;23734:12;;23718:13;;:28;:46;23711:53;;23480:303;:::o;29712:170::-;29846:28;29856:4;29862:2;29866:7;29846:9;:28::i;:::-;29712:170;;;:::o;120398:59::-;48360:12;:10;:12::i;:::-;48349:23;;:7;:5;:7::i;:::-;:23;;;48341:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;120441:10:::1;:8;:10::i;:::-;120398:59::o:0;29953:185::-;30091:39;30108:4;30114:2;30118:7;30091:39;;;;;;;;;;;;:16;:39::i;:::-;29953:185;;;:::o;118468:26::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;121020:94::-;48360:12;:10;:12::i;:::-;48349:23;;:7;:5;:7::i;:::-;:23;;;48341:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;121100:8:::1;121090:7;:18;;;;;;;;;;;;:::i;:::-;;121020:94:::0;:::o;43112:86::-;43159:4;43183:7;;;;;;;;;;;43176:14;;43112:86;:::o;27152:125::-;27216:7;27243:21;27256:7;27243:12;:21::i;:::-;:26;;;27236:33;;27152:125;;;:::o;118499:39::-;;;:::o;118442:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;120235:96::-;48360:12;:10;:12::i;:::-;48349:23;;:7;:5;:7::i;:::-;:23;;;48341:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;120315:10:::1;120303:9;:22;;;;120235:96:::0;:::o;24600:206::-;24664:7;24705:1;24688:19;;:5;:19;;;24684:60;;;24716:28;;;;;;;;;;;;;;24684:60;24770:12;:19;24783:5;24770:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;24762:36;;24755:43;;24600:206;;;:::o;48780:103::-;48360:12;:10;:12::i;:::-;48349:23;;:7;:5;:7::i;:::-;:23;;;48341:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48845:30:::1;48872:1;48845:18;:30::i;:::-;48780:103::o:0;121741:236::-;121888:4;121908:11;:28;;;;121937:7;121946:10;121958:5;121965;121908:63;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;121901:70;;121741:236;;;;;;:::o;123408:263::-;46116:1;46714:7;;:19;;46706:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;46116:1;46847:7;:18;;;;43438:8:::1;:6;:8::i;:::-;43437:9;43429:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;123529:11:::2;123502:9;:23;123512:12;:10;:12::i;:::-;123502:23;;;;;;;;;;;;;;;;123496:3;:29;;;;:::i;:::-;:44;;123488:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;123566:11;:26;;;;123593:12;:10;:12::i;:::-;123607:3;123612:11;;123566:58;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;123647:12;:10;:12::i;:::-;123636:29;;;123661:3;123636:29;;;;;;:::i;:::-;;;;;;;;46072:1:::0;47026:7;:22;;;;123408:263;:::o;120337:55::-;48360:12;:10;:12::i;:::-;48349:23;;:7;:5;:7::i;:::-;:23;;;48341:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;120378:8:::1;:6;:8::i;:::-;120337:55::o:0;48129:87::-;48175:7;48202:6;;;;;;;;;;;48195:13;;48129:87;:::o;27513:104::-;27569:13;27602:7;27595:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27513:104;:::o;29123:287::-;29234:12;:10;:12::i;:::-;29222:24;;:8;:24;;;29218:54;;;29255:17;;;;;;;;;;;;;;29218:54;29330:8;29285:18;:32;29304:12;:10;:12::i;:::-;29285:32;;;;;;;;;;;;;;;:42;29318:8;29285:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29383:8;29354:48;;29369:12;:10;:12::i;:::-;29354:48;;;29393:8;29354:48;;;;;;:::i;:::-;;;;;;;;29123:287;;:::o;118991:44::-;;;;;;;;;;;;;;;;;:::o;124472:198::-;48360:12;:10;:12::i;:::-;48349:23;;:7;:5;:7::i;:::-;:23;;;48341:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;124521:19:::1;;;;;;;;;;;124520:20;:58;;;;;124563:15;;124544;:34;;124520:58;124516:149;;;124611:4;124589:19;;:26;;;;;;;;;;;;;;;;;;124624:15;;;;;;;;;;;:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;124516:149;124472:198::o:0;118798:26::-;;;;:::o;118863:34::-;;;;:::o;118584:37::-;;;:::o;124162:304::-;46116:1;46714:7;;:19;;46706:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;46116:1;46847:7;:18;;;;43438:8:::1;:6;:8::i;:::-;43437:9;43429:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;124272:13:::2;124254:15;:31;124246:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;124358:11;124331:9;:23;124341:12;:10;:12::i;:::-;124331:23;;;;;;;;;;;;;;;;124325:3;:29;;;;:::i;:::-;:44;;124317:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;124397:32;124417:11;;124411:3;:17;;;;:::i;:::-;124397:13;:32::i;:::-;124436:24;124442:3;124447:12;:10;:12::i;:::-;124436:5;:24::i;:::-;46072:1:::0;47026:7;:22;;;;124162:304;:::o;122738:664::-;46116:1;46714:7;;:19;;46706:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;46116:1;46847:7;:18;;;;43438:8:::1;:6;:8::i;:::-;43437:9;43429:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;122897:65:::2;122914:12;:10;:12::i;:::-;122928:19;;122949:5;122956;122897:16;:65::i;:::-;122881:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;123054:5;123044:6;123010:17;:31;123028:12;:10;:12::i;:::-;123010:31;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;:49;;123002:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;123116:12;123097:15;:31;;123089:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;123175:6;123158:13;;:23;;;;;;;:::i;:::-;;;;;;;;123223:6;123188:17;:31;123206:12;:10;:12::i;:::-;123188:31;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;123283:36;123306:12;;123297:6;:21;;;;:::i;:::-;123283:13;:36::i;:::-;123326:27;123332:6;123340:12;:10;:12::i;:::-;123326:5;:27::i;:::-;123375:12;:10;:12::i;:::-;123367:29;;;123389:6;123367:29;;;;;;:::i;:::-;;;;;;;;46072:1:::0;47026:7;:22;;;;122738:664;;;:::o;118626:38::-;;;:::o;30209:369::-;30376:28;30386:4;30392:2;30396:7;30376:9;:28::i;:::-;30419:15;:2;:13;;;:15::i;:::-;:76;;;;;30439:56;30470:4;30476:2;30480:7;30489:5;30439:30;:56::i;:::-;30438:57;30419:76;30415:156;;;30519:40;;;;;;;;;;;;;;30415:156;30209:369;;;;:::o;120463:136::-;48360:12;:10;:12::i;:::-;48349:23;;:7;:5;:7::i;:::-;:23;;;48341:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;120573:20:::1;120551:19;:42;;;;120463:136:::0;:::o;120605:::-;48360:12;:10;:12::i;:::-;48349:23;;:7;:5;:7::i;:::-;:23;;;48341:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;120686:11:::1;:31;;;;120718:16;120686:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;120605:136:::0;:::o;118829:29::-;;;;:::o;118543:36::-;;;:::o;121383:352::-;121448:13;121507:1;121473:15;;;;;;;;;;;:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;121470:70;;;121525:7;121518:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;121470:70;121554:16;121562:7;121554;:16::i;:::-;121546:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;121599:17;121649:9;;121638:7;121620:15;:13;:15::i;:::-;:25;;;;:::i;:::-;121619:39;;;;:::i;:::-;121599:59;;121698:7;121707:20;:9;:18;:20::i;:::-;121681:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;121667:62;;;121383:352;;;;:::o;119040:53::-;;;;;;;;;;;;;;;;;:::o;123677:250::-;123763:11;:15;;;;123779:12;:10;:12::i;:::-;123793:5;123800:3;123763:41;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;123858:32;123878:11;;123872:3;:17;;;;:::i;:::-;123858:13;:32::i;:::-;123897:24;123903:3;123908:12;:10;:12::i;:::-;123897:5;:24::i;:::-;123677:250;;:::o;120910:104::-;120955:7;120978:15;;;;;;;;;;;:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;120971:37;;120910:104;:::o;118669:24::-;;;;:::o;118902:45::-;;;;;;;;;;;;;:::o;118733:28::-;;;;:::o;29481:164::-;29578:4;29602:18;:25;29621:5;29602:25;;;;;;;;;;;;;;;:35;29628:8;29602:35;;;;;;;;;;;;;;;;;;;;;;;;;29595:42;;29481:164;;;;:::o;49038:201::-;48360:12;:10;:12::i;:::-;48349:23;;:7;:5;:7::i;:::-;:23;;;48341:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49147:1:::1;49127:22;;:8;:22;;;;49119:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49203:28;49222:8;49203:18;:28::i;:::-;49038:201:::0;:::o;118698:30::-;;;;:::o;8564:387::-;8624:4;8832:12;8899:7;8887:20;8879:28;;8942:1;8935:4;:8;8928:15;;;8564:387;;;:::o;19793:157::-;19878:4;19917:25;19902:40;;;:11;:40;;;;19895:47;;19793:157;;;:::o;16580:98::-;16633:7;16660:10;16653:17;;16580:98;:::o;30833:174::-;30890:4;30933:7;30914:15;:13;:15::i;:::-;:26;;:53;;;;;30954:13;;30944:7;:23;30914:53;:85;;;;;30972:11;:20;30984:7;30972:20;;;;;;;;;;;:27;;;;;;;;;;;;30971:28;30914:85;30907:92;;30833:174;;;:::o;38990:196::-;39132:2;39105:15;:24;39121:7;39105:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39170:7;39166:2;39150:28;;39159:5;39150:28;;;;;;;;;;;;38990:196;;;:::o;23254:92::-;23310:7;23254:92;:::o;33933:2130::-;34048:35;34086:21;34099:7;34086:12;:21::i;:::-;34048:59;;34146:4;34124:26;;:13;:18;;;:26;;;34120:67;;34159:28;;;;;;;;;;;;;;34120:67;34200:22;34242:4;34226:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;34263:36;34280:4;34286:12;:10;:12::i;:::-;34263:16;:36::i;:::-;34226:73;:126;;;;34340:12;:10;:12::i;:::-;34316:36;;:20;34328:7;34316:11;:20::i;:::-;:36;;;34226:126;34200:153;;34371:17;34366:66;;34397:35;;;;;;;;;;;;;;34366:66;34461:1;34447:16;;:2;:16;;;34443:52;;;34472:23;;;;;;;;;;;;;;34443:52;34508:43;34530:4;34536:2;34540:7;34549:1;34508:21;:43::i;:::-;34616:35;34633:1;34637:7;34646:4;34616:8;:35::i;:::-;34977:1;34947:12;:18;34960:4;34947:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35021:1;34993:12;:16;35006:2;34993:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35039:31;35073:11;:20;35085:7;35073:20;;;;;;;;;;;35039:54;;35124:2;35108:8;:13;;;:18;;;;;;;;;;;;;;;;;;35174:15;35141:8;:23;;;:49;;;;;;;;;;;;;;;;;;35442:19;35474:1;35464:7;:11;35442:33;;35490:31;35524:11;:24;35536:11;35524:24;;;;;;;;;;;35490:58;;35592:1;35567:27;;:8;:13;;;;;;;;;;;;:27;;;35563:384;;;35777:13;;35762:11;:28;35758:174;;35831:4;35815:8;:13;;;:20;;;;;;;;;;;;;;;;;;35884:13;:28;;;35858:8;:23;;;:54;;;;;;;;;;;;;;;;;;35758:174;35563:384;34922:1036;;;35994:7;35990:2;35975:27;;35984:4;35975:27;;;;;;;;;;;;36013:42;36034:4;36040:2;36044:7;36053:1;36013:20;:42::i;:::-;34037:2026;;33933:2130;;;:::o;44171:120::-;43715:8;:6;:8::i;:::-;43707:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;44240:5:::1;44230:7:::0;::::1;:15;;;;;;;;;;;;;;;;;;44261:22;44270:12;:10;:12::i;:::-;44261:22;;;;;;:::i;:::-;;;;;;;;44171:120::o:0;25981:1109::-;26043:21;;:::i;:::-;26077:12;26092:7;26077:22;;26160:4;26141:15;:13;:15::i;:::-;:23;;:47;;;;;26175:13;;26168:4;:20;26141:47;26137:886;;;26209:31;26243:11;:17;26255:4;26243:17;;;;;;;;;;;26209:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26284:9;:16;;;26279:729;;26355:1;26329:28;;:9;:14;;;:28;;;26325:101;;26393:9;26386:16;;;;;;26325:101;26728:261;26735:4;26728:261;;;26768:6;;;;;;;;26813:11;:17;26825:4;26813:17;;;;;;;;;;;26801:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26887:1;26861:28;;:9;:14;;;:28;;;26857:109;;26929:9;26922:16;;;;;;26857:109;26728:261;;;26279:729;26190:833;26137:886;27051:31;;;;;;;;;;;;;;25981:1109;;;;:::o;49399:191::-;49473:16;49492:6;;;;;;;;;;;49473:25;;49518:8;49509:6;;:17;;;;;;;;;;;;;;;;;;49573:8;49542:40;;49563:8;49542:40;;;;;;;;;;;;49462:128;49399:191;:::o;43912:118::-;43438:8;:6;:8::i;:::-;43437:9;43429:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;43982:4:::1;43972:7;;:14;;;;;;;;;;;;;;;;;;44002:20;44009:12;:10;:12::i;:::-;44002:20;;;;;;:::i;:::-;;;;;;;;43912:118::o:0;121983:449::-;122061:9;122048;:22;122040:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;122139:15;122178:6;122170:4;122158:9;:16;;;;:::i;:::-;122157:27;;;;:::i;:::-;122139:45;;122192:12;122218:8;122227:1;122218:11;;;;;;;:::i;:::-;;;;;;;;;;;;;122210:25;;122243:7;122210:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;122191:64;;;122270:7;122262:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;122307:13;122334:8;122343:1;122334:11;;;;;;;:::i;:::-;;;;;;;;;;;;;122326:25;;122371:7;122359:9;:19;;;;:::i;:::-;122326:57;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;122306:77;;;122398:8;122390:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;122033:399;;;121983:449;:::o;123935:221::-;124028:9;;124021:3;124005:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:32;;123997:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;124070:1;124064:3;:7;124061:90;;;124082:25;124092:9;124103:3;124082:9;:25::i;:::-;124140:3;124116:9;:20;124126:9;124116:20;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;124061:90;123935:221;;:::o;39678:667::-;39841:4;39878:2;39862:36;;;39899:12;:10;:12::i;:::-;39913:4;39919:7;39928:5;39862:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39858:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40113:1;40096:6;:13;:18;40092:235;;;40142:40;;;;;;;;;;;;;;40092:235;40285:6;40279:13;40270:6;40266:2;40262:15;40255:38;39858:480;39991:45;;;39981:55;;;:6;:55;;;;39974:62;;;39678:667;;;;;;:::o;17165:723::-;17221:13;17451:1;17442:5;:10;17438:53;;;17469:10;;;;;;;;;;;;;;;;;;;;;17438:53;17501:12;17516:5;17501:20;;17532:14;17557:78;17572:1;17564:4;:9;17557:78;;17590:8;;;;;:::i;:::-;;;;17621:2;17613:10;;;;;:::i;:::-;;;17557:78;;;17645:19;17677:6;17667:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17645:39;;17695:154;17711:1;17702:5;:10;17695:154;;17739:1;17729:11;;;;;:::i;:::-;;;17806:2;17798:5;:10;;;;:::i;:::-;17785:2;:24;;;;:::i;:::-;17772:39;;17755:6;17762;17755:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17835:2;17826:11;;;;;:::i;:::-;;;17695:154;;;17873:6;17859:21;;;;;17165:723;;;;:::o;40993:159::-;;;;;:::o;41811:158::-;;;;;:::o;31015:104::-;31084:27;31094:2;31098:8;31084:27;;;;;;;;;;;;:9;:27::i;:::-;31015:104;;:::o;31482:163::-;31605:32;31611:2;31615:8;31625:5;31632:4;31605:5;:32::i;:::-;31482:163;;;:::o;31904:1775::-;32043:20;32066:13;;32043:36;;32108:1;32094:16;;:2;:16;;;32090:48;;;32119:19;;;;;;;;;;;;;;32090:48;32165:1;32153:8;:13;32149:44;;;32175:18;;;;;;;;;;;;;;32149:44;32206:61;32236:1;32240:2;32244:12;32258:8;32206:21;:61::i;:::-;32579:8;32544:12;:16;32557:2;32544:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32643:8;32603:12;:16;32616:2;32603:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32702:2;32669:11;:25;32681:12;32669:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;32769:15;32719:11;:25;32731:12;32719:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;32802:20;32825:12;32802:35;;32852:11;32881:8;32866:12;:23;32852:37;;32910:4;:23;;;;;32918:15;:2;:13;;;:15::i;:::-;32910:23;32906:641;;;32954:314;33010:12;33006:2;32985:38;;33002:1;32985:38;;;;;;;;;;;;33051:69;33090:1;33094:2;33098:14;;;;;;33114:5;33051:30;:69::i;:::-;33046:174;;33156:40;;;;;;;;;;;;;;33046:174;33263:3;33247:12;:19;;32954:314;;33349:12;33332:13;;:29;33328:43;;33363:8;;;33328:43;32906:641;;;33412:120;33468:14;;;;;;33464:2;33443:40;;33460:1;33443:40;;;;;;;;;;;;33527:3;33511:12;:19;;33412:120;;32906:641;33577:12;33561:13;:28;;;;32519:1082;;33611:60;33640:1;33644:2;33648:12;33662:8;33611:20;:60::i;:::-;32032:1647;31904:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:122::-;2026:24;2044:5;2026:24;:::i;:::-;2019:5;2016:35;2006:63;;2065:1;2062;2055:12;2006:63;1953:122;:::o;2081:139::-;2127:5;2165:6;2152:20;2143:29;;2181:33;2208:5;2181:33;:::i;:::-;2081:139;;;;:::o;2226:474::-;2294:6;2302;2351:2;2339:9;2330:7;2326:23;2322:32;2319:119;;;2357:79;;:::i;:::-;2319:119;2477:1;2502:53;2547:7;2538:6;2527:9;2523:22;2502:53;:::i;:::-;2492:63;;2448:117;2604:2;2630:53;2675:7;2666:6;2655:9;2651:22;2630:53;:::i;:::-;2620:63;;2575:118;2226:474;;;;;:::o;2706:99::-;2758:6;2792:5;2786:12;2776:22;;2706:99;;;:::o;2811:169::-;2895:11;2929:6;2924:3;2917:19;2969:4;2964:3;2960:14;2945:29;;2811:169;;;;:::o;2986:307::-;3054:1;3064:113;3078:6;3075:1;3072:13;3064:113;;;3163:1;3158:3;3154:11;3148:18;3144:1;3139:3;3135:11;3128:39;3100:2;3097:1;3093:10;3088:15;;3064:113;;;3195:6;3192:1;3189:13;3186:101;;;3275:1;3266:6;3261:3;3257:16;3250:27;3186:101;3035:258;2986:307;;;:::o;3299:102::-;3340:6;3391:2;3387:7;3382:2;3375:5;3371:14;3367:28;3357:38;;3299:102;;;:::o;3407:364::-;3495:3;3523:39;3556:5;3523:39;:::i;:::-;3578:71;3642:6;3637:3;3578:71;:::i;:::-;3571:78;;3658:52;3703:6;3698:3;3691:4;3684:5;3680:16;3658:52;:::i;:::-;3735:29;3757:6;3735:29;:::i;:::-;3730:3;3726:39;3719:46;;3499:272;3407:364;;;;:::o;3777:313::-;3890:4;3928:2;3917:9;3913:18;3905:26;;3977:9;3971:4;3967:20;3963:1;3952:9;3948:17;3941:47;4005:78;4078:4;4069:6;4005:78;:::i;:::-;3997:86;;3777:313;;;;:::o;4096:329::-;4155:6;4204:2;4192:9;4183:7;4179:23;4175:32;4172:119;;;4210:79;;:::i;:::-;4172:119;4330:1;4355:53;4400:7;4391:6;4380:9;4376:22;4355:53;:::i;:::-;4345:63;;4301:117;4096:329;;;;:::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:114::-;5837:6;5871:5;5865:12;5855:22;;5770:114;;;:::o;5890:184::-;5989:11;6023:6;6018:3;6011:19;6063:4;6058:3;6054:14;6039:29;;5890:184;;;;:::o;6080:132::-;6147:4;6170:3;6162:11;;6200:4;6195:3;6191:14;6183:22;;6080:132;;;:::o;6218:108::-;6295:24;6313:5;6295:24;:::i;:::-;6290:3;6283:37;6218:108;;:::o;6332:179::-;6401:10;6422:46;6464:3;6456:6;6422:46;:::i;:::-;6500:4;6495:3;6491:14;6477:28;;6332:179;;;;:::o;6517:113::-;6587:4;6619;6614:3;6610:14;6602:22;;6517:113;;;:::o;6666:732::-;6785:3;6814:54;6862:5;6814:54;:::i;:::-;6884:86;6963:6;6958:3;6884:86;:::i;:::-;6877:93;;6994:56;7044:5;6994:56;:::i;:::-;7073:7;7104:1;7089:284;7114:6;7111:1;7108:13;7089:284;;;7190:6;7184:13;7217:63;7276:3;7261:13;7217:63;:::i;:::-;7210:70;;7303:60;7356:6;7303:60;:::i;:::-;7293:70;;7149:224;7136:1;7133;7129:9;7124:14;;7089:284;;;7093:14;7389:3;7382:10;;6790:608;;;6666:732;;;;:::o;7404:114::-;7471:6;7505:5;7499:12;7489:22;;7404:114;;;:::o;7524:184::-;7623:11;7657:6;7652:3;7645:19;7697:4;7692:3;7688:14;7673:29;;7524:184;;;;:::o;7714:132::-;7781:4;7804:3;7796:11;;7834:4;7829:3;7825:14;7817:22;;7714:132;;;:::o;7852:108::-;7929:24;7947:5;7929:24;:::i;:::-;7924:3;7917:37;7852:108;;:::o;7966:179::-;8035:10;8056:46;8098:3;8090:6;8056:46;:::i;:::-;8134:4;8129:3;8125:14;8111:28;;7966:179;;;;:::o;8151:113::-;8221:4;8253;8248:3;8244:14;8236:22;;8151:113;;;:::o;8300:732::-;8419:3;8448:54;8496:5;8448:54;:::i;:::-;8518:86;8597:6;8592:3;8518:86;:::i;:::-;8511:93;;8628:56;8678:5;8628:56;:::i;:::-;8707:7;8738:1;8723:284;8748:6;8745:1;8742:13;8723:284;;;8824:6;8818:13;8851:63;8910:3;8895:13;8851:63;:::i;:::-;8844:70;;8937:60;8990:6;8937:60;:::i;:::-;8927:70;;8783:224;8770:1;8767;8763:9;8758:14;;8723:284;;;8727:14;9023:3;9016:10;;8424:608;;;8300:732;;;;:::o;9038:1077::-;9371:4;9409:3;9398:9;9394:19;9386:27;;9423:71;9491:1;9480:9;9476:17;9467:6;9423:71;:::i;:::-;9504:72;9572:2;9561:9;9557:18;9548:6;9504:72;:::i;:::-;9586;9654:2;9643:9;9639:18;9630:6;9586:72;:::i;:::-;9668;9736:2;9725:9;9721:18;9712:6;9668:72;:::i;:::-;9788:9;9782:4;9778:20;9772:3;9761:9;9757:19;9750:49;9816:108;9919:4;9910:6;9816:108;:::i;:::-;9808:116;;9972:9;9966:4;9962:20;9956:3;9945:9;9941:19;9934:49;10000:108;10103:4;10094:6;10000:108;:::i;:::-;9992:116;;9038:1077;;;;;;;;;:::o;10121:619::-;10198:6;10206;10214;10263:2;10251:9;10242:7;10238:23;10234:32;10231:119;;;10269:79;;:::i;:::-;10231:119;10389:1;10414:53;10459:7;10450:6;10439:9;10435:22;10414:53;:::i;:::-;10404:63;;10360:117;10516:2;10542:53;10587:7;10578:6;10567:9;10563:22;10542:53;:::i;:::-;10532:63;;10487:118;10644:2;10670:53;10715:7;10706:6;10695:9;10691:22;10670:53;:::i;:::-;10660:63;;10615:118;10121:619;;;;;:::o;10746:117::-;10855:1;10852;10845:12;10869:117;10978:1;10975;10968:12;10992:180;11040:77;11037:1;11030:88;11137:4;11134:1;11127:15;11161:4;11158:1;11151:15;11178:281;11261:27;11283:4;11261:27;:::i;:::-;11253:6;11249:40;11391:6;11379:10;11376:22;11355:18;11343:10;11340:34;11337:62;11334:88;;;11402:18;;:::i;:::-;11334:88;11442:10;11438:2;11431:22;11221:238;11178:281;;:::o;11465:129::-;11499:6;11526:20;;:::i;:::-;11516:30;;11555:33;11583:4;11575:6;11555:33;:::i;:::-;11465:129;;;:::o;11600:308::-;11662:4;11752:18;11744:6;11741:30;11738:56;;;11774:18;;:::i;:::-;11738:56;11812:29;11834:6;11812:29;:::i;:::-;11804:37;;11896:4;11890;11886:15;11878:23;;11600:308;;;:::o;11914:154::-;11998:6;11993:3;11988;11975:30;12060:1;12051:6;12046:3;12042:16;12035:27;11914:154;;;:::o;12074:412::-;12152:5;12177:66;12193:49;12235:6;12193:49;:::i;:::-;12177:66;:::i;:::-;12168:75;;12266:6;12259:5;12252:21;12304:4;12297:5;12293:16;12342:3;12333:6;12328:3;12324:16;12321:25;12318:112;;;12349:79;;:::i;:::-;12318:112;12439:41;12473:6;12468:3;12463;12439:41;:::i;:::-;12158:328;12074:412;;;;;:::o;12506:340::-;12562:5;12611:3;12604:4;12596:6;12592:17;12588:27;12578:122;;12619:79;;:::i;:::-;12578:122;12736:6;12723:20;12761:79;12836:3;12828:6;12821:4;12813:6;12809:17;12761:79;:::i;:::-;12752:88;;12568:278;12506:340;;;;:::o;12852:509::-;12921:6;12970:2;12958:9;12949:7;12945:23;12941:32;12938:119;;;12976:79;;:::i;:::-;12938:119;13124:1;13113:9;13109:17;13096:31;13154:18;13146:6;13143:30;13140:117;;;13176:79;;:::i;:::-;13140:117;13281:63;13336:7;13327:6;13316:9;13312:22;13281:63;:::i;:::-;13271:73;;13067:287;12852:509;;;;:::o;13367:329::-;13426:6;13475:2;13463:9;13454:7;13450:23;13446:32;13443:119;;;13481:79;;:::i;:::-;13443:119;13601:1;13626:53;13671:7;13662:6;13651:9;13647:22;13626:53;:::i;:::-;13616:63;;13572:117;13367:329;;;;:::o;13702:77::-;13739:7;13768:5;13757:16;;13702:77;;;:::o;13785:122::-;13858:24;13876:5;13858:24;:::i;:::-;13851:5;13848:35;13838:63;;13897:1;13894;13887:12;13838:63;13785:122;:::o;13913:139::-;13959:5;13997:6;13984:20;13975:29;;14013:33;14040:5;14013:33;:::i;:::-;13913:139;;;;:::o;14058:311::-;14135:4;14225:18;14217:6;14214:30;14211:56;;;14247:18;;:::i;:::-;14211:56;14297:4;14289:6;14285:17;14277:25;;14357:4;14351;14347:15;14339:23;;14058:311;;;:::o;14375:117::-;14484:1;14481;14474:12;14515:710;14611:5;14636:81;14652:64;14709:6;14652:64;:::i;:::-;14636:81;:::i;:::-;14627:90;;14737:5;14766:6;14759:5;14752:21;14800:4;14793:5;14789:16;14782:23;;14853:4;14845:6;14841:17;14833:6;14829:30;14882:3;14874:6;14871:15;14868:122;;;14901:79;;:::i;:::-;14868:122;15016:6;14999:220;15033:6;15028:3;15025:15;14999:220;;;15108:3;15137:37;15170:3;15158:10;15137:37;:::i;:::-;15132:3;15125:50;15204:4;15199:3;15195:14;15188:21;;15075:144;15059:4;15054:3;15050:14;15043:21;;14999:220;;;15003:21;14617:608;;14515:710;;;;;:::o;15248:370::-;15319:5;15368:3;15361:4;15353:6;15349:17;15345:27;15335:122;;15376:79;;:::i;:::-;15335:122;15493:6;15480:20;15518:94;15608:3;15600:6;15593:4;15585:6;15581:17;15518:94;:::i;:::-;15509:103;;15325:293;15248:370;;;;:::o;15624:975::-;15735:6;15743;15751;15759;15808:3;15796:9;15787:7;15783:23;15779:33;15776:120;;;15815:79;;:::i;:::-;15776:120;15935:1;15960:53;16005:7;15996:6;15985:9;15981:22;15960:53;:::i;:::-;15950:63;;15906:117;16062:2;16088:53;16133:7;16124:6;16113:9;16109:22;16088:53;:::i;:::-;16078:63;;16033:118;16218:2;16207:9;16203:18;16190:32;16249:18;16241:6;16238:30;16235:117;;;16271:79;;:::i;:::-;16235:117;16376:78;16446:7;16437:6;16426:9;16422:22;16376:78;:::i;:::-;16366:88;;16161:303;16503:2;16529:53;16574:7;16565:6;16554:9;16550:22;16529:53;:::i;:::-;16519:63;;16474:118;15624:975;;;;;;;:::o;16605:116::-;16675:21;16690:5;16675:21;:::i;:::-;16668:5;16665:32;16655:60;;16711:1;16708;16701:12;16655:60;16605:116;:::o;16727:133::-;16770:5;16808:6;16795:20;16786:29;;16824:30;16848:5;16824:30;:::i;:::-;16727:133;;;;:::o;16866:468::-;16931:6;16939;16988:2;16976:9;16967:7;16963:23;16959:32;16956:119;;;16994:79;;:::i;:::-;16956:119;17114:1;17139:53;17184:7;17175:6;17164:9;17160:22;17139:53;:::i;:::-;17129:63;;17085:117;17241:2;17267:50;17309:7;17300:6;17289:9;17285:22;17267:50;:::i;:::-;17257:60;;17212:115;16866:468;;;;;:::o;17340:118::-;17427:24;17445:5;17427:24;:::i;:::-;17422:3;17415:37;17340:118;;:::o;17464:222::-;17557:4;17595:2;17584:9;17580:18;17572:26;;17608:71;17676:1;17665:9;17661:17;17652:6;17608:71;:::i;:::-;17464:222;;;;:::o;17692:829::-;17794:6;17802;17810;17859:2;17847:9;17838:7;17834:23;17830:32;17827:119;;;17865:79;;:::i;:::-;17827:119;18013:1;18002:9;17998:17;17985:31;18043:18;18035:6;18032:30;18029:117;;;18065:79;;:::i;:::-;18029:117;18170:78;18240:7;18231:6;18220:9;18216:22;18170:78;:::i;:::-;18160:88;;17956:302;18297:2;18323:53;18368:7;18359:6;18348:9;18344:22;18323:53;:::i;:::-;18313:63;;18268:118;18425:2;18451:53;18496:7;18487:6;18476:9;18472:22;18451:53;:::i;:::-;18441:63;;18396:118;17692:829;;;;;:::o;18527:307::-;18588:4;18678:18;18670:6;18667:30;18664:56;;;18700:18;;:::i;:::-;18664:56;18738:29;18760:6;18738:29;:::i;:::-;18730:37;;18822:4;18816;18812:15;18804:23;;18527:307;;;:::o;18840:410::-;18917:5;18942:65;18958:48;18999:6;18958:48;:::i;:::-;18942:65;:::i;:::-;18933:74;;19030:6;19023:5;19016:21;19068:4;19061:5;19057:16;19106:3;19097:6;19092:3;19088:16;19085:25;19082:112;;;19113:79;;:::i;:::-;19082:112;19203:41;19237:6;19232:3;19227;19203:41;:::i;:::-;18923:327;18840:410;;;;;:::o;19269:338::-;19324:5;19373:3;19366:4;19358:6;19354:17;19350:27;19340:122;;19381:79;;:::i;:::-;19340:122;19498:6;19485:20;19523:78;19597:3;19589:6;19582:4;19574:6;19570:17;19523:78;:::i;:::-;19514:87;;19330:277;19269:338;;;;:::o;19613:943::-;19708:6;19716;19724;19732;19781:3;19769:9;19760:7;19756:23;19752:33;19749:120;;;19788:79;;:::i;:::-;19749:120;19908:1;19933:53;19978:7;19969:6;19958:9;19954:22;19933:53;:::i;:::-;19923:63;;19879:117;20035:2;20061:53;20106:7;20097:6;20086:9;20082:22;20061:53;:::i;:::-;20051:63;;20006:118;20163:2;20189:53;20234:7;20225:6;20214:9;20210:22;20189:53;:::i;:::-;20179:63;;20134:118;20319:2;20308:9;20304:18;20291:32;20350:18;20342:6;20339:30;20336:117;;;20372:79;;:::i;:::-;20336:117;20477:62;20531:7;20522:6;20511:9;20507:22;20477:62;:::i;:::-;20467:72;;20262:287;19613:943;;;;;;;:::o;20562:329::-;20621:6;20670:2;20658:9;20649:7;20645:23;20641:32;20638:119;;;20676:79;;:::i;:::-;20638:119;20796:1;20821:53;20866:7;20857:6;20846:9;20842:22;20821:53;:::i;:::-;20811:63;;20767:117;20562:329;;;;:::o;20897:684::-;20990:6;20998;21047:2;21035:9;21026:7;21022:23;21018:32;21015:119;;;21053:79;;:::i;:::-;21015:119;21201:1;21190:9;21186:17;21173:31;21231:18;21223:6;21220:30;21217:117;;;21253:79;;:::i;:::-;21217:117;21358:78;21428:7;21419:6;21408:9;21404:22;21358:78;:::i;:::-;21348:88;;21144:302;21485:2;21511:53;21556:7;21547:6;21536:9;21532:22;21511:53;:::i;:::-;21501:63;;21456:118;20897:684;;;;;:::o;21587:60::-;21615:3;21636:5;21629:12;;21587:60;;;:::o;21653:142::-;21703:9;21736:53;21754:34;21763:24;21781:5;21763:24;:::i;:::-;21754:34;:::i;:::-;21736:53;:::i;:::-;21723:66;;21653:142;;;:::o;21801:126::-;21851:9;21884:37;21915:5;21884:37;:::i;:::-;21871:50;;21801:126;;;:::o;21933:157::-;22014:9;22047:37;22078:5;22047:37;:::i;:::-;22034:50;;21933:157;;;:::o;22096:193::-;22214:68;22276:5;22214:68;:::i;:::-;22209:3;22202:81;22096:193;;:::o;22295:284::-;22419:4;22457:2;22446:9;22442:18;22434:26;;22470:102;22569:1;22558:9;22554:17;22545:6;22470:102;:::i;:::-;22295:284;;;;:::o;22585:474::-;22653:6;22661;22710:2;22698:9;22689:7;22685:23;22681:32;22678:119;;;22716:79;;:::i;:::-;22678:119;22836:1;22861:53;22906:7;22897:6;22886:9;22882:22;22861:53;:::i;:::-;22851:63;;22807:117;22963:2;22989:53;23034:7;23025:6;23014:9;23010:22;22989:53;:::i;:::-;22979:63;;22934:118;22585:474;;;;;:::o;23065:182::-;23205:34;23201:1;23193:6;23189:14;23182:58;23065:182;:::o;23253:366::-;23395:3;23416:67;23480:2;23475:3;23416:67;:::i;:::-;23409:74;;23492:93;23581:3;23492:93;:::i;:::-;23610:2;23605:3;23601:12;23594:19;;23253:366;;;:::o;23625:419::-;23791:4;23829:2;23818:9;23814:18;23806:26;;23878:9;23872:4;23868:20;23864:1;23853:9;23849:17;23842:47;23906:131;24032:4;23906:131;:::i;:::-;23898:139;;23625:419;;;:::o;24050:180::-;24098:77;24095:1;24088:88;24195:4;24192:1;24185:15;24219:4;24216:1;24209:15;24236:320;24280:6;24317:1;24311:4;24307:12;24297:22;;24364:1;24358:4;24354:12;24385:18;24375:81;;24441:4;24433:6;24429:17;24419:27;;24375:81;24503:2;24495:6;24492:14;24472:18;24469:38;24466:84;;;24522:18;;:::i;:::-;24466:84;24287:269;24236:320;;;:::o;24562:132::-;24682:5;24677:3;24670:18;24562:132;;:::o;24700:126::-;24795:24;24813:5;24795:24;:::i;:::-;24790:3;24783:37;24700:126;;:::o;24832:524::-;25014:4;25052:2;25041:9;25037:18;25029:26;;25065:104;25166:1;25155:9;25151:17;25142:6;25065:104;:::i;:::-;25179:80;25255:2;25244:9;25240:18;25231:6;25179:80;:::i;:::-;25269;25345:2;25334:9;25330:18;25321:6;25269:80;:::i;:::-;24832:524;;;;;;:::o;25362:143::-;25419:5;25450:6;25444:13;25435:22;;25466:33;25493:5;25466:33;:::i;:::-;25362:143;;;;:::o;25511:311::-;25588:4;25678:18;25670:6;25667:30;25664:56;;;25700:18;;:::i;:::-;25664:56;25750:4;25742:6;25738:17;25730:25;;25810:4;25804;25800:15;25792:23;;25511:311;;;:::o;25828:143::-;25885:5;25916:6;25910:13;25901:22;;25932:33;25959:5;25932:33;:::i;:::-;25828:143;;;;:::o;25994:732::-;26101:5;26126:81;26142:64;26199:6;26142:64;:::i;:::-;26126:81;:::i;:::-;26117:90;;26227:5;26256:6;26249:5;26242:21;26290:4;26283:5;26279:16;26272:23;;26343:4;26335:6;26331:17;26323:6;26319:30;26372:3;26364:6;26361:15;26358:122;;;26391:79;;:::i;:::-;26358:122;26506:6;26489:231;26523:6;26518:3;26515:15;26489:231;;;26598:3;26627:48;26671:3;26659:10;26627:48;:::i;:::-;26622:3;26615:61;26705:4;26700:3;26696:14;26689:21;;26565:155;26549:4;26544:3;26540:14;26533:21;;26489:231;;;26493:21;26107:619;;25994:732;;;;;:::o;26749:385::-;26831:5;26880:3;26873:4;26865:6;26861:17;26857:27;26847:122;;26888:79;;:::i;:::-;26847:122;26998:6;26992:13;27023:105;27124:3;27116:6;27109:4;27101:6;27097:17;27023:105;:::i;:::-;27014:114;;26837:297;26749:385;;;;:::o;27140:311::-;27217:4;27307:18;27299:6;27296:30;27293:56;;;27329:18;;:::i;:::-;27293:56;27379:4;27371:6;27367:17;27359:25;;27439:4;27433;27429:15;27421:23;;27140:311;;;:::o;27474:732::-;27581:5;27606:81;27622:64;27679:6;27622:64;:::i;:::-;27606:81;:::i;:::-;27597:90;;27707:5;27736:6;27729:5;27722:21;27770:4;27763:5;27759:16;27752:23;;27823:4;27815:6;27811:17;27803:6;27799:30;27852:3;27844:6;27841:15;27838:122;;;27871:79;;:::i;:::-;27838:122;27986:6;27969:231;28003:6;27998:3;27995:15;27969:231;;;28078:3;28107:48;28151:3;28139:10;28107:48;:::i;:::-;28102:3;28095:61;28185:4;28180:3;28176:14;28169:21;;28045:155;28029:4;28024:3;28020:14;28013:21;;27969:231;;;27973:21;27587:619;;27474:732;;;;;:::o;28229:385::-;28311:5;28360:3;28353:4;28345:6;28341:17;28337:27;28327:122;;28368:79;;:::i;:::-;28327:122;28478:6;28472:13;28503:105;28604:3;28596:6;28589:4;28581:6;28577:17;28503:105;:::i;:::-;28494:114;;28317:297;28229:385;;;;:::o;28620:1540::-;28785:6;28793;28801;28809;28817;28825;28874:3;28862:9;28853:7;28849:23;28845:33;28842:120;;;28881:79;;:::i;:::-;28842:120;29001:1;29026:64;29082:7;29073:6;29062:9;29058:22;29026:64;:::i;:::-;29016:74;;28972:128;29139:2;29165:64;29221:7;29212:6;29201:9;29197:22;29165:64;:::i;:::-;29155:74;;29110:129;29278:2;29304:64;29360:7;29351:6;29340:9;29336:22;29304:64;:::i;:::-;29294:74;;29249:129;29417:2;29443:64;29499:7;29490:6;29479:9;29475:22;29443:64;:::i;:::-;29433:74;;29388:129;29577:3;29566:9;29562:19;29556:26;29609:18;29601:6;29598:30;29595:117;;;29631:79;;:::i;:::-;29595:117;29736:89;29817:7;29808:6;29797:9;29793:22;29736:89;:::i;:::-;29726:99;;29527:308;29895:3;29884:9;29880:19;29874:26;29927:18;29919:6;29916:30;29913:117;;;29949:79;;:::i;:::-;29913:117;30054:89;30135:7;30126:6;30115:9;30111:22;30054:89;:::i;:::-;30044:99;;29845:308;28620:1540;;;;;;;;:::o;30166:126::-;30261:24;30279:5;30261:24;:::i;:::-;30256:3;30249:37;30166:126;;:::o;30298:::-;30393:24;30411:5;30393:24;:::i;:::-;30388:3;30381:37;30298:126;;:::o;30430:114::-;30497:6;30531:5;30525:12;30515:22;;30430:114;;;:::o;30550:192::-;30657:11;30691:6;30686:3;30679:19;30731:4;30726:3;30722:14;30707:29;;30550:192;;;;:::o;30748:132::-;30815:4;30838:3;30830:11;;30868:4;30863:3;30859:14;30851:22;;30748:132;;;:::o;30886:116::-;30971:24;30989:5;30971:24;:::i;:::-;30966:3;30959:37;30886:116;;:::o;31008:195::-;31085:10;31106:54;31156:3;31148:6;31106:54;:::i;:::-;31192:4;31187:3;31183:14;31169:28;;31008:195;;;;:::o;31209:113::-;31279:4;31311;31306:3;31302:14;31294:22;;31209:113;;;:::o;31358:756::-;31485:3;31514:54;31562:5;31514:54;:::i;:::-;31584:94;31671:6;31666:3;31584:94;:::i;:::-;31577:101;;31702:56;31752:5;31702:56;:::i;:::-;31781:7;31812:1;31797:292;31822:6;31819:1;31816:13;31797:292;;;31898:6;31892:13;31925:71;31992:3;31977:13;31925:71;:::i;:::-;31918:78;;32019:60;32072:6;32019:60;:::i;:::-;32009:70;;31857:232;31844:1;31841;31837:9;31832:14;;31797:292;;;31801:14;32105:3;32098:10;;31490:624;;;31358:756;;;;:::o;32120:913::-;32408:4;32446:3;32435:9;32431:19;32423:27;;32460:104;32561:1;32550:9;32546:17;32537:6;32460:104;:::i;:::-;32574:80;32650:2;32639:9;32635:18;32626:6;32574:80;:::i;:::-;32664;32740:2;32729:9;32725:18;32716:6;32664:80;:::i;:::-;32791:9;32785:4;32781:20;32776:2;32765:9;32761:18;32754:48;32819:116;32930:4;32921:6;32819:116;:::i;:::-;32811:124;;32945:81;33021:3;33010:9;33006:19;32997:6;32945:81;:::i;:::-;32120:913;;;;;;;;:::o;33039:137::-;33093:5;33124:6;33118:13;33109:22;;33140:30;33164:5;33140:30;:::i;:::-;33039:137;;;;:::o;33182:345::-;33249:6;33298:2;33286:9;33277:7;33273:23;33269:32;33266:119;;;33304:79;;:::i;:::-;33266:119;33424:1;33449:61;33502:7;33493:6;33482:9;33478:22;33449:61;:::i;:::-;33439:71;;33395:125;33182:345;;;;:::o;33533:181::-;33673:33;33669:1;33661:6;33657:14;33650:57;33533:181;:::o;33720:366::-;33862:3;33883:67;33947:2;33942:3;33883:67;:::i;:::-;33876:74;;33959:93;34048:3;33959:93;:::i;:::-;34077:2;34072:3;34068:12;34061:19;;33720:366;;;:::o;34092:419::-;34258:4;34296:2;34285:9;34281:18;34273:26;;34345:9;34339:4;34335:20;34331:1;34320:9;34316:17;34309:47;34373:131;34499:4;34373:131;:::i;:::-;34365:139;;34092:419;;;:::o;34517:166::-;34657:18;34653:1;34645:6;34641:14;34634:42;34517:166;:::o;34689:366::-;34831:3;34852:67;34916:2;34911:3;34852:67;:::i;:::-;34845:74;;34928:93;35017:3;34928:93;:::i;:::-;35046:2;35041:3;35037:12;35030:19;;34689:366;;;:::o;35061:419::-;35227:4;35265:2;35254:9;35250:18;35242:26;;35314:9;35308:4;35304:20;35300:1;35289:9;35285:17;35278:47;35342:131;35468:4;35342:131;:::i;:::-;35334:139;;35061:419;;;:::o;35486:180::-;35534:77;35531:1;35524:88;35631:4;35628:1;35621:15;35655:4;35652:1;35645:15;35672:305;35712:3;35731:20;35749:1;35731:20;:::i;:::-;35726:25;;35765:20;35783:1;35765:20;:::i;:::-;35760:25;;35919:1;35851:66;35847:74;35844:1;35841:81;35838:107;;;35925:18;;:::i;:::-;35838:107;35969:1;35966;35962:9;35955:16;;35672:305;;;;:::o;35983:164::-;36123:16;36119:1;36111:6;36107:14;36100:40;35983:164;:::o;36153:366::-;36295:3;36316:67;36380:2;36375:3;36316:67;:::i;:::-;36309:74;;36392:93;36481:3;36392:93;:::i;:::-;36510:2;36505:3;36501:12;36494:19;;36153:366;;;:::o;36525:419::-;36691:4;36729:2;36718:9;36714:18;36706:26;;36778:9;36772:4;36768:20;36764:1;36753:9;36749:17;36742:47;36806:131;36932:4;36806:131;:::i;:::-;36798:139;;36525:419;;;:::o;36950:643::-;37160:4;37198:3;37187:9;37183:19;37175:27;;37212:104;37313:1;37302:9;37298:17;37289:6;37212:104;:::i;:::-;37326:80;37402:2;37391:9;37387:18;37378:6;37326:80;:::i;:::-;37416;37492:2;37481:9;37477:18;37468:6;37416:80;:::i;:::-;37506;37582:2;37571:9;37567:18;37558:6;37506:80;:::i;:::-;36950:643;;;;;;;:::o;37599:170::-;37739:22;37735:1;37727:6;37723:14;37716:46;37599:170;:::o;37775:366::-;37917:3;37938:67;38002:2;37997:3;37938:67;:::i;:::-;37931:74;;38014:93;38103:3;38014:93;:::i;:::-;38132:2;38127:3;38123:12;38116:19;;37775:366;;;:::o;38147:419::-;38313:4;38351:2;38340:9;38336:18;38328:26;;38400:9;38394:4;38390:20;38386:1;38375:9;38371:17;38364:47;38428:131;38554:4;38428:131;:::i;:::-;38420:139;;38147:419;;;:::o;38572:348::-;38612:7;38635:20;38653:1;38635:20;:::i;:::-;38630:25;;38669:20;38687:1;38669:20;:::i;:::-;38664:25;;38857:1;38789:66;38785:74;38782:1;38779:81;38774:1;38767:9;38760:17;38756:105;38753:131;;;38864:18;;:::i;:::-;38753:131;38912:1;38909;38905:9;38894:20;;38572:348;;;;:::o;38926:165::-;39066:17;39062:1;39054:6;39050:14;39043:41;38926:165;:::o;39097:366::-;39239:3;39260:67;39324:2;39319:3;39260:67;:::i;:::-;39253:74;;39336:93;39425:3;39336:93;:::i;:::-;39454:2;39449:3;39445:12;39438:19;;39097:366;;;:::o;39469:419::-;39635:4;39673:2;39662:9;39658:18;39650:26;;39722:9;39716:4;39712:20;39708:1;39697:9;39693:17;39686:47;39750:131;39876:4;39750:131;:::i;:::-;39742:139;;39469:419;;;:::o;39894:168::-;40034:20;40030:1;40022:6;40018:14;40011:44;39894:168;:::o;40068:366::-;40210:3;40231:67;40295:2;40290:3;40231:67;:::i;:::-;40224:74;;40307:93;40396:3;40307:93;:::i;:::-;40425:2;40420:3;40416:12;40409:19;;40068:366;;;:::o;40440:419::-;40606:4;40644:2;40633:9;40629:18;40621:26;;40693:9;40687:4;40683:20;40679:1;40668:9;40664:17;40657:47;40721:131;40847:4;40721:131;:::i;:::-;40713:139;;40440:419;;;:::o;40865:166::-;41005:18;41001:1;40993:6;40989:14;40982:42;40865:166;:::o;41037:366::-;41179:3;41200:67;41264:2;41259:3;41200:67;:::i;:::-;41193:74;;41276:93;41365:3;41276:93;:::i;:::-;41394:2;41389:3;41385:12;41378:19;;41037:366;;;:::o;41409:419::-;41575:4;41613:2;41602:9;41598:18;41590:26;;41662:9;41656:4;41652:20;41648:1;41637:9;41633:17;41626:47;41690:131;41816:4;41690:131;:::i;:::-;41682:139;;41409:419;;;:::o;41834:406::-;41988:4;42026:2;42015:9;42011:18;42003:26;;42039:104;42140:1;42129:9;42125:17;42116:6;42039:104;:::i;:::-;42153:80;42229:2;42218:9;42214:18;42205:6;42153:80;:::i;:::-;41834:406;;;;;:::o;42246:351::-;42316:6;42365:2;42353:9;42344:7;42340:23;42336:32;42333:119;;;42371:79;;:::i;:::-;42333:119;42491:1;42516:64;42572:7;42563:6;42552:9;42548:22;42516:64;:::i;:::-;42506:74;;42462:128;42246:351;;;;:::o;42603:167::-;42743:19;42739:1;42731:6;42727:14;42720:43;42603:167;:::o;42776:366::-;42918:3;42939:67;43003:2;42998:3;42939:67;:::i;:::-;42932:74;;43015:93;43104:3;43015:93;:::i;:::-;43133:2;43128:3;43124:12;43117:19;;42776:366;;;:::o;43148:419::-;43314:4;43352:2;43341:9;43337:18;43329:26;;43401:9;43395:4;43391:20;43387:1;43376:9;43372:17;43365:47;43429:131;43555:4;43429:131;:::i;:::-;43421:139;;43148:419;;;:::o;43573:180::-;43621:77;43618:1;43611:88;43718:4;43715:1;43708:15;43742:4;43739:1;43732:15;43759:176;43791:1;43808:20;43826:1;43808:20;:::i;:::-;43803:25;;43842:20;43860:1;43842:20;:::i;:::-;43837:25;;43881:1;43871:35;;43886:18;;:::i;:::-;43871:35;43927:1;43924;43920:9;43915:14;;43759:176;;;;:::o;43941:148::-;44043:11;44080:3;44065:18;;43941:148;;;;:::o;44095:141::-;44144:4;44167:3;44159:11;;44190:3;44187:1;44180:14;44224:4;44221:1;44211:18;44203:26;;44095:141;;;:::o;44266:845::-;44369:3;44406:5;44400:12;44435:36;44461:9;44435:36;:::i;:::-;44487:89;44569:6;44564:3;44487:89;:::i;:::-;44480:96;;44607:1;44596:9;44592:17;44623:1;44618:137;;;;44769:1;44764:341;;;;44585:520;;44618:137;44702:4;44698:9;44687;44683:25;44678:3;44671:38;44738:6;44733:3;44729:16;44722:23;;44618:137;;44764:341;44831:38;44863:5;44831:38;:::i;:::-;44891:1;44905:154;44919:6;44916:1;44913:13;44905:154;;;44993:7;44987:14;44983:1;44978:3;44974:11;44967:35;45043:1;45034:7;45030:15;45019:26;;44941:4;44938:1;44934:12;44929:17;;44905:154;;;45088:6;45083:3;45079:16;45072:23;;44771:334;;44585:520;;44373:738;;44266:845;;;;:::o;45117:377::-;45223:3;45251:39;45284:5;45251:39;:::i;:::-;45306:89;45388:6;45383:3;45306:89;:::i;:::-;45299:96;;45404:52;45449:6;45444:3;45437:4;45430:5;45426:16;45404:52;:::i;:::-;45481:6;45476:3;45472:16;45465:23;;45227:267;45117:377;;;;:::o;45500:429::-;45677:3;45699:92;45787:3;45778:6;45699:92;:::i;:::-;45692:99;;45808:95;45899:3;45890:6;45808:95;:::i;:::-;45801:102;;45920:3;45913:10;;45500:429;;;;;:::o;45935:794::-;46195:4;46233:3;46222:9;46218:19;46210:27;;46247:104;46348:1;46337:9;46333:17;46324:6;46247:104;:::i;:::-;46361:80;46437:2;46426:9;46422:18;46413:6;46361:80;:::i;:::-;46488:9;46482:4;46478:20;46473:2;46462:9;46458:18;46451:48;46516:116;46627:4;46618:6;46516:116;:::i;:::-;46508:124;;46642:80;46718:2;46707:9;46703:18;46694:6;46642:80;:::i;:::-;45935:794;;;;;;;:::o;46735:225::-;46875:34;46871:1;46863:6;46859:14;46852:58;46944:8;46939:2;46931:6;46927:15;46920:33;46735:225;:::o;46966:366::-;47108:3;47129:67;47193:2;47188:3;47129:67;:::i;:::-;47122:74;;47205:93;47294:3;47205:93;:::i;:::-;47323:2;47318:3;47314:12;47307:19;;46966:366;;;:::o;47338:419::-;47504:4;47542:2;47531:9;47527:18;47519:26;;47591:9;47585:4;47581:20;47577:1;47566:9;47562:17;47555:47;47619:131;47745:4;47619:131;:::i;:::-;47611:139;;47338:419;;;:::o;47763:170::-;47903:22;47899:1;47891:6;47887:14;47880:46;47763:170;:::o;47939:366::-;48081:3;48102:67;48166:2;48161:3;48102:67;:::i;:::-;48095:74;;48178:93;48267:3;48178:93;:::i;:::-;48296:2;48291:3;48287:12;48280:19;;47939:366;;;:::o;48311:419::-;48477:4;48515:2;48504:9;48500:18;48492:26;;48564:9;48558:4;48554:20;48550:1;48539:9;48535:17;48528:47;48592:131;48718:4;48592:131;:::i;:::-;48584:139;;48311:419;;;:::o;48736:162::-;48876:14;48872:1;48864:6;48860:14;48853:38;48736:162;:::o;48904:366::-;49046:3;49067:67;49131:2;49126:3;49067:67;:::i;:::-;49060:74;;49143:93;49232:3;49143:93;:::i;:::-;49261:2;49256:3;49252:12;49245:19;;48904:366;;;:::o;49276:419::-;49442:4;49480:2;49469:9;49465:18;49457:26;;49529:9;49523:4;49519:20;49515:1;49504:9;49500:17;49493:47;49557:131;49683:4;49557:131;:::i;:::-;49549:139;;49276:419;;;:::o;49701:185::-;49741:1;49758:20;49776:1;49758:20;:::i;:::-;49753:25;;49792:20;49810:1;49792:20;:::i;:::-;49787:25;;49831:1;49821:35;;49836:18;;:::i;:::-;49821:35;49878:1;49875;49871:9;49866:14;;49701:185;;;;:::o;49892:180::-;49940:77;49937:1;49930:88;50037:4;50034:1;50027:15;50061:4;50058:1;50051:15;50078:147;50179:11;50216:3;50201:18;;50078:147;;;;:::o;50231:114::-;;:::o;50351:398::-;50510:3;50531:83;50612:1;50607:3;50531:83;:::i;:::-;50524:90;;50623:93;50712:3;50623:93;:::i;:::-;50741:1;50736:3;50732:11;50725:18;;50351:398;;;:::o;50755:379::-;50939:3;50961:147;51104:3;50961:147;:::i;:::-;50954:154;;51125:3;51118:10;;50755:379;;;:::o;51140:165::-;51280:17;51276:1;51268:6;51264:14;51257:41;51140:165;:::o;51311:366::-;51453:3;51474:67;51538:2;51533:3;51474:67;:::i;:::-;51467:74;;51550:93;51639:3;51550:93;:::i;:::-;51668:2;51663:3;51659:12;51652:19;;51311:366;;;:::o;51683:419::-;51849:4;51887:2;51876:9;51872:18;51864:26;;51936:9;51930:4;51926:20;51922:1;51911:9;51907:17;51900:47;51964:131;52090:4;51964:131;:::i;:::-;51956:139;;51683:419;;;:::o;52108:191::-;52148:4;52168:20;52186:1;52168:20;:::i;:::-;52163:25;;52202:20;52220:1;52202:20;:::i;:::-;52197:25;;52241:1;52238;52235:8;52232:34;;;52246:18;;:::i;:::-;52232:34;52291:1;52288;52284:9;52276:17;;52108:191;;;;:::o;52305:160::-;52445:12;52441:1;52433:6;52429:14;52422:36;52305:160;:::o;52471:366::-;52613:3;52634:67;52698:2;52693:3;52634:67;:::i;:::-;52627:74;;52710:93;52799:3;52710:93;:::i;:::-;52828:2;52823:3;52819:12;52812:19;;52471:366;;;:::o;52843:419::-;53009:4;53047:2;53036:9;53032:18;53024:26;;53096:9;53090:4;53086:20;53082:1;53071:9;53067:17;53060:47;53124:131;53250:4;53124:131;:::i;:::-;53116:139;;52843:419;;;:::o;53268:98::-;53319:6;53353:5;53347:12;53337:22;;53268:98;;;:::o;53372:168::-;53455:11;53489:6;53484:3;53477:19;53529:4;53524:3;53520:14;53505:29;;53372:168;;;;:::o;53546:360::-;53632:3;53660:38;53692:5;53660:38;:::i;:::-;53714:70;53777:6;53772:3;53714:70;:::i;:::-;53707:77;;53793:52;53838:6;53833:3;53826:4;53819:5;53815:16;53793:52;:::i;:::-;53870:29;53892:6;53870:29;:::i;:::-;53865:3;53861:39;53854:46;;53636:270;53546:360;;;;:::o;53912:640::-;54107:4;54145:3;54134:9;54130:19;54122:27;;54159:71;54227:1;54216:9;54212:17;54203:6;54159:71;:::i;:::-;54240:72;54308:2;54297:9;54293:18;54284:6;54240:72;:::i;:::-;54322;54390:2;54379:9;54375:18;54366:6;54322:72;:::i;:::-;54441:9;54435:4;54431:20;54426:2;54415:9;54411:18;54404:48;54469:76;54540:4;54531:6;54469:76;:::i;:::-;54461:84;;53912:640;;;;;;;:::o;54558:141::-;54614:5;54645:6;54639:13;54630:22;;54661:32;54687:5;54661:32;:::i;:::-;54558:141;;;;:::o;54705:349::-;54774:6;54823:2;54811:9;54802:7;54798:23;54794:32;54791:119;;;54829:79;;:::i;:::-;54791:119;54949:1;54974:63;55029:7;55020:6;55009:9;55005:22;54974:63;:::i;:::-;54964:73;;54920:127;54705:349;;;;:::o;55060:233::-;55099:3;55122:24;55140:5;55122:24;:::i;:::-;55113:33;;55168:66;55161:5;55158:77;55155:103;;;55238:18;;:::i;:::-;55155:103;55285:1;55278:5;55274:13;55267:20;;55060:233;;;:::o
Swarm Source
ipfs://70e2c34271438a3fe1326bb57cc5d7347375598ac9ec495a535e6c2e31c07c77
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.