Token Phenix Lotto Ticket
Overview CRC20
Price
$0.00 @ 0.000000 CRO
Fully Diluted Market Cap
Total Supply:
454,306.197677 PLOTTO
Holders:
281 addresses
Contract:
Decimals:
18
Balance
5.88947525451426964 PLOTTOValue
$0.00
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PhenixLotto
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-06-09 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // 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/utils/Strings.sol // 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/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: contracts/WitnetRandomness.sol pragma solidity ^0.8.0; contract WitnessRandomness { uint256 public globalNonce; constructor() { globalNonce = 0; } function random( uint32 _range, uint256 _nonce, uint256 _block ) external view returns (uint32) { return uint32( uint256( keccak256( abi.encodePacked( block.number, block.timestamp, block.difficulty, _block, _nonce, globalNonce ) ) ) ) % _range; } } // File: hardhat/console.sol 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/SafeMathInt.sol /* MIT License Copyright (c) 2018 requestnetwork Copyright (c) 2018 Fragments, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ pragma solidity ^0.8.0; /** * @title SafeMathInt * @dev Math operations for int256 with overflow safety checks. */ library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); /** * @dev Multiplies two int256 variables and fails on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } /** * @dev Division of two int256 variables and fails on overflow. */ function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != -1 || a != MIN_INT256); // Solidity already throws when dividing by 0. return a / b; } /** * @dev Subtracts two int256 variables and fails on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } /** * @dev Adds two int256 variables and fails on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } /** * @dev Converts to absolute value, and fails on overflow. */ function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? -a : a; } /** * @dev Computes 2^exp with limited precision where -100 <= exp <= 100 * one * @param one 1.0 represented in the same fixed point number format as exp * @param exp The power to raise 2 to -100 <= exp <= 100 * one * @return 2^exp represented with same number of decimals after the point as one */ function twoPower(int256 exp, int256 one) internal pure returns (int256) { bool reciprocal = false; if (exp < 0) { reciprocal = true; exp = abs(exp); } // Precomputed values for 2^(1/2^i) in 18 decimals fixed point numbers int256[5] memory ks = [ int256(1414213562373095049), 1189207115002721067, 1090507732665257659, 1044273782427413840, 1021897148654116678 ]; int256 whole = div(exp, one); require(whole <= 100); int256 result = mul(int256(uint256(1) << uint256(whole)), one); int256 remaining = sub(exp, mul(whole, one)); int256 current = div(one, 2); for (uint256 i = 0; i < 5; i++) { if (remaining >= current) { remaining = sub(remaining, current); result = div(mul(result, ks[i]), 10**18); // 10**18 to match hardcoded ks values } current = div(current, 2); } if (reciprocal) { result = div(mul(one, one), result); } return result; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.6.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: contracts/UFragments.sol pragma solidity ^0.8.0; /** * @title uFragments ERC20 token * @dev This is part of an implementation of the uFragments Ideal Money protocol. * uFragments is a normal ERC20 token, but its supply can be adjusted by splitting and * combining tokens proportionally across all wallets. * * uFragment balances are internally represented with a hidden denomination, 'gons'. * We support splitting the currency in expansion and combining the currency on contraction by * changing the exchange rate between the hidden 'gons' and the public 'fragments'. */ contract UFragments is Ownable { // PLEASE READ BEFORE CHANGING ANY ACCOUNTING OR MATH // Anytime there is division, there is a risk of numerical instability from rounding errors. In // order to minimize this risk, we adhere to the following guidelines: // 1) The conversion rate adopted is the number of gons that equals 1 fragment. // The inverse rate must not be used--TOTAL_GONS is always the numerator and _totalSupply is // always the denominator. (i.e. If you want to convert gons to fragments instead of // multiplying by the inverse rate, you should divide by the normal rate) // 2) Gon balances converted into Fragments are always rounded down (truncated). // // We make the following guarantees: // - If address 'A' transfers x Fragments to address 'B'. A's resulting external balance will // be decreased by precisely x Fragments, and B's external balance will be precisely // increased by x Fragments. // // We do not guarantee that the sum of all balances equals the result of calling totalSupply(). // This is because, for any conversion function 'f()' that has non-zero rounding error, // f(x0) + f(x1) + ... + f(xn) is not always equal to f(x0 + x1 + ... xn). using SafeMath for uint256; using SafeMathInt for int256; event LogRebase(uint256 indexed epoch, uint256 totalSupply); event LogMonetaryPolicyUpdated(address monetaryPolicy); event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); // Used for authentication address public monetaryPolicy; modifier onlyMonetaryPolicy() { require(msg.sender == monetaryPolicy); _; } bool private rebasePausedDeprecated; bool private tokenPausedDeprecated; modifier validRecipient(address to) { require(to != address(0x0)); require(to != address(this)); _; } address internal constant DEAD = 0x000000000000000000000000000000000000dEaD; uint256 private constant MAX_UINT256 = type(uint256).max; // TOTAL_GONS is a multiple of INITIAL_FRAGMENTS_SUPPLY so that _gonsPerFragment is an integer. // Use the highest value that fits in a uint256 for max granularity. uint256 private TOTAL_GONS; // MAX_SUPPLY = maximum integer < (sqrt(4*TOTAL_GONS + 1) - 1) / 2 uint256 private constant MAX_SUPPLY = type(uint128).max; // (2^128) - 1 uint256 internal _totalSupply; uint256 private _gonsPerFragment; mapping(address => uint256) private _gonBalances; // This is denominated in Fragments, because the gons-fragments conversion might change before // it's fully paid. mapping(address => mapping(address => uint256)) private _allowedFragments; // EIP-2612: permit – 712-signed approvals // https://eips.ethereum.org/EIPS/eip-2612 string public constant EIP712_REVISION = "1"; bytes32 public constant EIP712_DOMAIN = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); bytes32 public constant PERMIT_TYPEHASH = keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ); // EIP-2612: keeps track of number of permits per address mapping(address => uint256) private _nonces; string private _name; string private _symbol; uint8 private _decimals; constructor( string memory name, string memory symbol, uint8 decimals, uint256 _initialFragmentsSupply, address owner_ ) { Ownable._transferOwnership(owner_); rebasePausedDeprecated = false; tokenPausedDeprecated = false; _totalSupply = _initialFragmentsSupply; TOTAL_GONS = MAX_UINT256 - (MAX_UINT256 % _initialFragmentsSupply); _gonBalances[DEAD] = TOTAL_GONS; _gonsPerFragment = TOTAL_GONS.div(_totalSupply); _name = name; _symbol = symbol; _decimals = decimals; emit Transfer(address(0x0), DEAD, _totalSupply); } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return _decimals; } /** * @param monetaryPolicy_ The address of the monetary policy contract to use for authentication. */ function setMonetaryPolicy(address monetaryPolicy_) external onlyOwner { monetaryPolicy = monetaryPolicy_; emit LogMonetaryPolicyUpdated(monetaryPolicy_); } /** * @dev Notifies Fragments contract about a new rebase cycle. * @param supplyDelta The number of new fragment tokens to add into circulation via expansion. * @return The total number of fragments after the supply adjustment. */ function _rebase(uint256 epoch, int256 supplyDelta) internal returns (uint256) { if (supplyDelta == 0) { emit LogRebase(epoch, _totalSupply); return _totalSupply; } supplyDelta = supplyDelta .mul( int256(_totalSupply).mul(10000000).div( int256(_totalSupply.sub(_balanceOf(DEAD))) ) ) .div(10000000); if (supplyDelta < 0) { _totalSupply = _totalSupply.sub(uint256(supplyDelta.abs())); } else { _totalSupply = _totalSupply.add(uint256(supplyDelta)); } if (_totalSupply > MAX_SUPPLY) { _totalSupply = MAX_SUPPLY; } _gonsPerFragment = TOTAL_GONS.div(_totalSupply); // From this point forward, _gonsPerFragment is taken as the source of truth. // We recalculate a new _totalSupply to be in agreement with the _gonsPerFragment // conversion rate. // This means our applied supplyDelta can deviate from the requested supplyDelta, // but this deviation is guaranteed to be < (_totalSupply^2)/(TOTAL_GONS - _totalSupply). // // In the case of _totalSupply <= MAX_UINT128 (our current supply cap), this // deviation is guaranteed to be < 1, so we can omit this step. If the supply cap is // ever increased, it must be re-included. // _totalSupply = TOTAL_GONS.div(_gonsPerFragment) emit LogRebase(epoch, _totalSupply); return _totalSupply; } /** * @return The total number of fragments. */ function totalSupply() external view returns (uint256) { return _totalSupplyInternal(); } function _totalSupplyInternal() internal view returns (uint256) { return _totalSupply - _balanceOf(DEAD); } /** * @param who The address to query. * @return The balance of the specified address. */ function balanceOf(address who) external view returns (uint256) { return _balanceOf(who); } function _balanceOf(address who) internal view returns (uint256) { return _gonBalances[who].div(_gonsPerFragment); } /** * @param who The address to query. * @return The gon balance of the specified address. */ function scaledBalanceOf(address who) external view returns (uint256) { return _gonBalances[who]; } /** * @return the total number of gons. */ function scaledTotalSupply() external view returns (uint256) { return TOTAL_GONS; } /** * @return The number of successful permits by the specified address. */ function nonces(address who) public view returns (uint256) { return _nonces[who]; } /** * @return The computed DOMAIN_SEPARATOR to be used off-chain services * which implement EIP-712. * https://eips.ethereum.org/EIPS/eip-2612 */ function DOMAIN_SEPARATOR() public view returns (bytes32) { uint256 chainId; assembly { chainId := chainid() } return keccak256( abi.encode( EIP712_DOMAIN, keccak256(bytes(_name)), keccak256(bytes(EIP712_REVISION)), chainId, address(this) ) ); } /** * @dev tokens to a specified address. * @param to The address to transfer to. * @param value The amount to be transferred. * @return True on success, false otherwise. */ function transfer(address to, uint256 value) external validRecipient(to) returns (bool) { return _transfer(msg.sender, to, value); } function _transfer( address from, address to, uint256 value ) internal returns (bool) { uint256 gonValue = value.mul(_gonsPerFragment); _gonBalances[from] = _gonBalances[from].sub(gonValue); _gonBalances[to] = _gonBalances[to].add(gonValue); emit Transfer(from, to, value); return true; } /** * @dev Transfer all of the sender's wallet balance to a specified address. * @param to The address to transfer to. * @return True on success, false otherwise. */ function transferAll(address to) external validRecipient(to) returns (bool) { uint256 gonValue = _gonBalances[msg.sender]; uint256 value = gonValue.div(_gonsPerFragment); delete _gonBalances[msg.sender]; _gonBalances[to] = _gonBalances[to].add(gonValue); emit Transfer(msg.sender, to, value); return true; } /** * @dev Function to check the amount of tokens that an owner has allowed to a spender. * @param owner_ The address which owns the funds. * @param spender The address which will spend the funds. * @return The number of tokens still available for the spender. */ function allowance(address owner_, address spender) external view returns (uint256) { return _allowedFragments[owner_][spender]; } /** * @dev Transfer tokens from one address to another. * @param from The address you want to send tokens from. * @param to The address you want to transfer to. * @param value The amount of tokens to be transferred. */ function transferFrom( address from, address to, uint256 value ) external validRecipient(to) returns (bool) { _allowedFragments[from][msg.sender] = _allowedFragments[from][ msg.sender ].sub(value); uint256 gonValue = value.mul(_gonsPerFragment); _gonBalances[from] = _gonBalances[from].sub(gonValue); _gonBalances[to] = _gonBalances[to].add(gonValue); emit Transfer(from, to, value); return true; } /** * @dev Transfer all balance tokens from one address to another. * @param from The address you want to send tokens from. * @param to The address you want to transfer to. */ function transferAllFrom(address from, address to) external validRecipient(to) returns (bool) { uint256 gonValue = _gonBalances[from]; uint256 value = gonValue.div(_gonsPerFragment); _allowedFragments[from][msg.sender] = _allowedFragments[from][ msg.sender ].sub(value); delete _gonBalances[from]; _gonBalances[to] = _gonBalances[to].add(gonValue); emit Transfer(from, to, value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of * msg.sender. This method is included for ERC20 compatibility. * increaseAllowance and decreaseAllowance should be used instead. * Changing an allowance with this method brings the risk that someone may transfer both * the old and the new allowance - if they are both greater than zero - if a transfer * transaction is mined before the later approve() call is mined. * * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. */ function approve(address spender, uint256 value) external returns (bool) { _allowedFragments[msg.sender][spender] = value; emit Approval(msg.sender, spender, value); return true; } /** * @dev Increase the amount of tokens that an owner has allowed to a spender. * This method should be used instead of approve() to avoid the double approval vulnerability * described above. * @param spender The address which will spend the funds. * @param addedValue The amount of tokens to increase the allowance by. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _allowedFragments[msg.sender][spender] = _allowedFragments[msg.sender][ spender ].add(addedValue); emit Approval( msg.sender, spender, _allowedFragments[msg.sender][spender] ); return true; } /** * @dev Decrease the amount of tokens that an owner has allowed to a spender. * * @param spender The address which will spend the funds. * @param subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) { uint256 oldValue = _allowedFragments[msg.sender][spender]; _allowedFragments[msg.sender][spender] = (subtractedValue >= oldValue) ? 0 : oldValue.sub(subtractedValue); emit Approval( msg.sender, spender, _allowedFragments[msg.sender][spender] ); return true; } /** * @dev Allows for approvals to be made via secp256k1 signatures. * @param owner The owner of the funds * @param spender The spender * @param value The amount * @param deadline The deadline timestamp, type(uint256).max for max deadline * @param v Signature param * @param s Signature param * @param r Signature param */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public { require(block.timestamp <= deadline); uint256 ownerNonce = _nonces[owner]; bytes32 permitDataDigest = keccak256( abi.encode( PERMIT_TYPEHASH, owner, spender, value, ownerNonce, deadline ) ); bytes32 digest = keccak256( abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR(), permitDataDigest) ); require(owner == ecrecover(digest, v, r, s)); _nonces[owner] = ownerNonce.add(1); _allowedFragments[owner][spender] = value; emit Approval(owner, spender, value); } } // File: contracts/PhenixLotto.sol pragma solidity ^0.8.0; contract PhenixLotto is Ownable, AccessControl, UFragments, ReentrancyGuard { address public asset; address public multiplierNFT; bytes32 public constant DRAW_CALLER_ROLE = keccak256("DRAW_CALLER_ROLE"); WitnessRandomness public immutable witnet; mapping(address => mapping(address => uint256)) private _allowedFragments; uint256 constant FXP_BASE = 1000000; uint256 constant DECIMALS = 18; uint256 public earlyWithdrawPenaltyTimeframeSeconds = 10 days; uint256 public earlyWithdrawPenaltyFXP = FXP_BASE * 15 / 100; address public earlyWithdrawPenaltyReceiver = DEAD; uint256 public ERC721MultiplierFXP = FXP_BASE * 101 / 100; uint256 public totalWinners = 10; uint256 public jackpotWinningRatioFXP = FXP_BASE * 80 / 100; uint256 public burnRatioFXP = FXP_BASE * 10 / 100; uint256 public totalBurnedTokens; uint256 public currentDrawIndex; uint256 public totalParticipants; bool public lottoEnabled; bool public multiplierNFTEnabled; struct Participant { uint256 totalRewards; uint256 lastDepositedAt; uint256 lastDepositAmount; uint256 lastWithdrawnAmount; uint256 lastClaimedAtBlock; uint256 entryTimestamp; } struct Winner { address winnerAddress; uint256 winnerAmount; } struct DrawResult { uint256 drawIndex; uint256 timestamp; uint256 prizePool; uint256 rebaseDelta; uint256 burnAmount; Seed seed; Winner[] winners; } struct Seed { uint256 noise; uint256 totalSupply; uint256 timestamp; uint256 difficulty; uint32 randomness; } mapping(address => Participant) public participantsMap; mapping(uint256 => DrawResult) public drawResults; mapping(address => bool) public participantIsActive; address[] participantsAddressArr; event Payout(address indexed winner, uint256 amount); event Draw(uint256 indexed drawNumber, uint256 indexed prizePool); modifier isValidParticipant() { require(participantIsActive[msg.sender] == true, "Participant is not active or valid"); _; } modifier isLottoEnabled() { require(lottoEnabled == true, "Phenix Lotto Pool is not enabled!"); _; } constructor( address _owner, address _asset, address _multiplierNFT ) Ownable() ReentrancyGuard() UFragments( "Phenix Lotto Ticket", "PLOTTO", 18, 1 * 10**9 * 10**DECIMALS, _owner ) { transferOwnership(_owner); _setupRole(DRAW_CALLER_ROLE, _owner); witnet = new WitnessRandomness(); asset = _asset; multiplierNFT = _multiplierNFT; } receive() external payable {} function adminSetERC721MultiplierFXP(uint256 _ERC721MultiplierFXP) external onlyOwner { ERC721MultiplierFXP = _ERC721MultiplierFXP; } function adminSetEarlyWithdrawPenaltyFXP( uint256 _earlyWithdrawPenaltyFXP ) external onlyOwner { earlyWithdrawPenaltyFXP = _earlyWithdrawPenaltyFXP; } function adminMultiplierNFTEnabled(bool _multiplierNFTEnabled) external onlyOwner { multiplierNFTEnabled = _multiplierNFTEnabled; } function adminSetLottoEnabled(bool _lottoEnabled) external onlyOwner { lottoEnabled = _lottoEnabled; } function adminSetEarlyWithdrawPenaltyTimeframeSeconds( uint256 _earlyWithdrawPenaltyTimeframeSeconds ) external onlyOwner { earlyWithdrawPenaltyTimeframeSeconds = _earlyWithdrawPenaltyTimeframeSeconds; } function adminSetEarlyWithdrawPenaltyReceiver( address _earlyWithdrawPenaltyReceiver ) external onlyOwner { earlyWithdrawPenaltyReceiver = _earlyWithdrawPenaltyReceiver; } function adminSetMultiplierNft(address _multiplier_nft) external onlyOwner { multiplierNFT = _multiplier_nft; } function adminSetBurnRatio(uint256 _burnRatioFXP) external onlyOwner { require((burnRatioFXP + jackpotWinningRatioFXP) <= FXP_BASE, "New Burn ratio exceeds maximum allocation."); burnRatioFXP = _burnRatioFXP; } function adminSetJackpotWinningRatio(uint256 _jackpotWinningRatioFXP) external onlyOwner { require((burnRatioFXP + jackpotWinningRatioFXP) <= FXP_BASE, "New Jackpot ratio exceeds maximum allocation."); jackpotWinningRatioFXP = _jackpotWinningRatioFXP; } function adminSetTotalWinners(uint256 _totalWinners) external onlyOwner { totalWinners = _totalWinners; } function adminGrantDrawerRole(address _target) external onlyOwner { _grantRole(DRAW_CALLER_ROLE, _target); } function adminRevokeDrawerRole(address _target) external onlyOwner { _revokeRole(DRAW_CALLER_ROLE, _target); } function enter(uint256 _amount) external nonReentrant() isLottoEnabled() { address caller = _msgSender(); _transfer(DEAD, caller, _amount); IERC20(asset).transferFrom(caller, address(this), _amount); participantsMap[caller].lastDepositedAt = block.timestamp; participantsMap[caller].lastDepositAmount += _amount; if (!participantIsActive[caller]) { totalParticipants = totalParticipants + 1; participantIsActive[caller] = true; participantsMap[caller].entryTimestamp = block.timestamp; participantsAddressArr.push(caller); } } function redeem(uint256 _amount) external nonReentrant() { address caller = _msgSender(); uint256 amountToRedeem = _amount; uint256 penaltyAmount = 0; require(_amount <= _balanceOf(caller), "Not enough tickets to redeem amount."); if ( block.timestamp - participantsMap[caller].entryTimestamp < earlyWithdrawPenaltyTimeframeSeconds ) { penaltyAmount = (amountToRedeem * earlyWithdrawPenaltyFXP) / FXP_BASE; amountToRedeem = amountToRedeem - penaltyAmount; IERC20(asset).transfer(owner(), penaltyAmount); } IERC20(asset).transfer(caller, amountToRedeem); participantsMap[caller].lastWithdrawnAmount = amountToRedeem; participantsMap[caller].lastClaimedAtBlock = block.timestamp; _transfer(caller, DEAD, _amount); if (_balanceOf(caller) == 0) { participantIsActive[caller] = false; totalParticipants = totalParticipants - 1; } } function fetchDrawResult() external view returns(DrawResult memory) { Winner[] memory winningParticipants = new Winner[](totalWinners); uint8 curWinningTicketIndex = 0; uint24 curParticipantIndex = 0; uint256 curTicket = 1; uint256 curParticipantTicketStart; uint256 curParticipantTicketEnd; Seed memory drawSeed = _sourceDrawSeed(); uint256[] memory winningTickets = draftWinningTickets( drawSeed ); uint256 prizePool = IERC20(asset).balanceOf(address(this)) - _totalSupplyInternal(); uint256 amountPerWinner = (((prizePool * jackpotWinningRatioFXP) / FXP_BASE) / totalWinners); uint256 burnAmount = (prizePool * burnRatioFXP) / FXP_BASE; uint256 totalAmountForParticipants = prizePool - (amountPerWinner * totalWinners) - burnAmount; while (curWinningTicketIndex < totalWinners) { curParticipantTicketStart = curTicket; curParticipantTicketEnd = curParticipantTicketStart + _countTicketsOf(participantsAddressArr[curParticipantIndex]); if ( winningTickets[curWinningTicketIndex] >= curParticipantTicketStart && winningTickets[curWinningTicketIndex] <= curParticipantTicketEnd ) { winningParticipants[curWinningTicketIndex] = Winner(participantsAddressArr[ curParticipantIndex ], amountPerWinner); curWinningTicketIndex++; } else { curParticipantIndex++; curTicket = curParticipantTicketEnd; } } DrawResult memory result = DrawResult(currentDrawIndex, block.timestamp, prizePool, totalAmountForParticipants, burnAmount, drawSeed, winningParticipants); return result; } function _sourceDrawSeed() internal view returns(Seed memory) { return Seed( participantsAddressArr.length, _countTotalTickets(), block.timestamp, block.difficulty, witnet.random(type(uint32).max, 0, block.number) ); } function getLastDrawSeed() public view returns (Seed memory) { require(currentDrawIndex > 0, "No draws have been made."); return drawResults[currentDrawIndex - 1].seed; } function getDrawResultWinners(uint256 _drawIndex) public view returns(Winner[] memory) { return drawResults[_drawIndex].winners; } function draftWinningTickets( Seed memory _seed ) public view returns (uint256[] memory) { require( _seed.totalSupply >= totalWinners, "not enough tickets to generate winners" ); // uint32 randomness = witnet.random(type(uint32).max, 0, block.number); uint256[] memory winningTickets = new uint256[](totalWinners); uint256 iteration = 0; uint256 numbersChosen = 0; while (numbersChosen < totalWinners) { iteration++; uint256 N = uint256( keccak256( abi.encodePacked( iteration, _seed.noise, _seed.totalSupply, _seed.timestamp, _seed.difficulty, _seed.randomness ) ) ) % (_seed.totalSupply + 1); bool isDuplicate = false; for (uint256 i = 0; i < winningTickets.length; i++) { if (N == winningTickets[i]) { isDuplicate = true; break; } } if (isDuplicate) { continue; } winningTickets[numbersChosen] = N; numbersChosen++; } for (uint256 i = 0; i < winningTickets.length; i++) { for (uint256 j = 0; j < winningTickets.length; j++) { if (winningTickets[i] < winningTickets[j]) { uint256 tmp = winningTickets[j]; winningTickets[j] = winningTickets[i]; winningTickets[i] = tmp; } } } return winningTickets; } function ticketsOf(address who) external view returns (uint256) { return _countTicketsOf(who); } function totalTickets() external view returns (uint256) { return _countTotalTickets(); } function _countTotalTickets() internal view returns (uint256) { uint256 tickets = 0; for (uint256 i = 0; i < participantsAddressArr.length; i++) { tickets += _countTicketsOf(participantsAddressArr[i]); } return tickets; } function _countTicketsOf(address who) internal view returns (uint256) { uint256 tmpLTs = _balanceOf(who); if(multiplierNFTEnabled) { uint256 tmpLMs = IERC721(multiplierNFT).balanceOf(who); if(tmpLMs == 0) { return tmpLTs; } return tmpLTs * (((ERC721MultiplierFXP - FXP_BASE) * tmpLMs) + FXP_BASE) / FXP_BASE; } else { return tmpLTs; } } function distributeDraw( DrawResult calldata _drawResult ) external onlyRole(DRAW_CALLER_ROLE) { for (uint256 i = 0; i < _drawResult.winners.length; i++) { IERC20(asset).transfer(_drawResult.winners[i].winnerAddress, _drawResult.winners[i].winnerAmount); participantsMap[_drawResult.winners[i].winnerAddress].totalRewards = participantsMap[_drawResult.winners[i].winnerAddress].totalRewards + _drawResult.winners[i].winnerAmount; emit Payout(_drawResult.winners[i].winnerAddress, _drawResult.winners[i].winnerAmount); } // Rebase Supply _rebase(block.number, int256(_drawResult.rebaseDelta)); // Burn Asset Token Allocation if(_drawResult.burnAmount > 0) { IERC20(asset).transfer(DEAD, _drawResult.burnAmount); totalBurnedTokens = totalBurnedTokens + _drawResult.burnAmount; } // Update Draws Mapping drawResults[currentDrawIndex] = _drawResult; emit Draw(currentDrawIndex, _drawResult.prizePool); currentDrawIndex++; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_asset","type":"address"},{"internalType":"address","name":"_multiplierNFT","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"drawNumber","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"prizePool","type":"uint256"}],"name":"Draw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"monetaryPolicy","type":"address"}],"name":"LogMonetaryPolicyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalSupply","type":"uint256"}],"name":"LogRebase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Payout","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DRAW_CALLER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EIP712_DOMAIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EIP712_REVISION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERC721MultiplierFXP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"}],"name":"adminGrantDrawerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_multiplierNFTEnabled","type":"bool"}],"name":"adminMultiplierNFTEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"}],"name":"adminRevokeDrawerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnRatioFXP","type":"uint256"}],"name":"adminSetBurnRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ERC721MultiplierFXP","type":"uint256"}],"name":"adminSetERC721MultiplierFXP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_earlyWithdrawPenaltyFXP","type":"uint256"}],"name":"adminSetEarlyWithdrawPenaltyFXP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_earlyWithdrawPenaltyReceiver","type":"address"}],"name":"adminSetEarlyWithdrawPenaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_earlyWithdrawPenaltyTimeframeSeconds","type":"uint256"}],"name":"adminSetEarlyWithdrawPenaltyTimeframeSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_jackpotWinningRatioFXP","type":"uint256"}],"name":"adminSetJackpotWinningRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_lottoEnabled","type":"bool"}],"name":"adminSetLottoEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_multiplier_nft","type":"address"}],"name":"adminSetMultiplierNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalWinners","type":"uint256"}],"name":"adminSetTotalWinners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnRatioFXP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentDrawIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"drawIndex","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"prizePool","type":"uint256"},{"internalType":"uint256","name":"rebaseDelta","type":"uint256"},{"internalType":"uint256","name":"burnAmount","type":"uint256"},{"components":[{"internalType":"uint256","name":"noise","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"difficulty","type":"uint256"},{"internalType":"uint32","name":"randomness","type":"uint32"}],"internalType":"struct PhenixLotto.Seed","name":"seed","type":"tuple"},{"components":[{"internalType":"address","name":"winnerAddress","type":"address"},{"internalType":"uint256","name":"winnerAmount","type":"uint256"}],"internalType":"struct PhenixLotto.Winner[]","name":"winners","type":"tuple[]"}],"internalType":"struct PhenixLotto.DrawResult","name":"_drawResult","type":"tuple"}],"name":"distributeDraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"noise","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"difficulty","type":"uint256"},{"internalType":"uint32","name":"randomness","type":"uint32"}],"internalType":"struct PhenixLotto.Seed","name":"_seed","type":"tuple"}],"name":"draftWinningTickets","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"drawResults","outputs":[{"internalType":"uint256","name":"drawIndex","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"prizePool","type":"uint256"},{"internalType":"uint256","name":"rebaseDelta","type":"uint256"},{"internalType":"uint256","name":"burnAmount","type":"uint256"},{"components":[{"internalType":"uint256","name":"noise","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"difficulty","type":"uint256"},{"internalType":"uint32","name":"randomness","type":"uint32"}],"internalType":"struct PhenixLotto.Seed","name":"seed","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyWithdrawPenaltyFXP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyWithdrawPenaltyReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyWithdrawPenaltyTimeframeSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"enter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fetchDrawResult","outputs":[{"components":[{"internalType":"uint256","name":"drawIndex","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"prizePool","type":"uint256"},{"internalType":"uint256","name":"rebaseDelta","type":"uint256"},{"internalType":"uint256","name":"burnAmount","type":"uint256"},{"components":[{"internalType":"uint256","name":"noise","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"difficulty","type":"uint256"},{"internalType":"uint32","name":"randomness","type":"uint32"}],"internalType":"struct PhenixLotto.Seed","name":"seed","type":"tuple"},{"components":[{"internalType":"address","name":"winnerAddress","type":"address"},{"internalType":"uint256","name":"winnerAmount","type":"uint256"}],"internalType":"struct PhenixLotto.Winner[]","name":"winners","type":"tuple[]"}],"internalType":"struct PhenixLotto.DrawResult","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_drawIndex","type":"uint256"}],"name":"getDrawResultWinners","outputs":[{"components":[{"internalType":"address","name":"winnerAddress","type":"address"},{"internalType":"uint256","name":"winnerAmount","type":"uint256"}],"internalType":"struct PhenixLotto.Winner[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastDrawSeed","outputs":[{"components":[{"internalType":"uint256","name":"noise","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"difficulty","type":"uint256"},{"internalType":"uint32","name":"randomness","type":"uint32"}],"internalType":"struct PhenixLotto.Seed","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"jackpotWinningRatioFXP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lottoEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"monetaryPolicy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multiplierNFT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multiplierNFTEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"participantIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"participantsMap","outputs":[{"internalType":"uint256","name":"totalRewards","type":"uint256"},{"internalType":"uint256","name":"lastDepositedAt","type":"uint256"},{"internalType":"uint256","name":"lastDepositAmount","type":"uint256"},{"internalType":"uint256","name":"lastWithdrawnAmount","type":"uint256"},{"internalType":"uint256","name":"lastClaimedAtBlock","type":"uint256"},{"internalType":"uint256","name":"entryTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"scaledBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"scaledTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"monetaryPolicy_","type":"address"}],"name":"setMonetaryPolicy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"ticketsOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalParticipants","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTickets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWinners","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"transferAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"transferAllFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"witnet","outputs":[{"internalType":"contract WitnessRandomness","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a0604052620d2f0060105560646200001d620f4240600f62000726565b6200002991906200060a565b601155601280546001600160a01b03191661dead179055606462000052620f4240606562000726565b6200005e91906200060a565b601355600a601455606462000078620f4240605062000726565b6200008491906200060a565b601555606462000099620f4240600a62000726565b620000a591906200060a565b601655348015620000b557600080fd5b5060405162004a6438038062004a64833981016040819052620000d891620005c0565b6040518060400160405280601381526020017f5068656e6978204c6f74746f205469636b65740000000000000000000000000081525060405180604001604052806006815260200165504c4f54544f60d01b815250601280600a6200013e91906200066a565b6200014e90633b9aca0062000726565b866200015a336200031b565b62000170816200031b60201b62002cbb1760201c565b6002805461ffff60a01b19169055600482905562000191826000196200079f565b6200019f9060001962000748565b600381905561dead600052600660209081527f1aecba4ebe7a4e0673e4891b2b092b2228e4322380b579fb494fad3da8586e22829055600454620001ed929162002d0b6200036b821b17901c565b600555845162000205906009906020880190620004ef565b5083516200021b90600a906020870190620004ef565b50600b805460ff191660ff851617905560045460405190815261dead906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350506001600c55506200027f915084905062000382565b620002ab7fd8858e8e1664cbc67331ed60d855ac6de277d6d376c33d6c92ffec58365248718462000457565b604051620002b9906200057e565b604051809103906000f080158015620002d6573d6000803e3d6000fd5b5060601b6001600160601b031916608052600d80546001600160a01b03199081166001600160a01b0394851617909155600e80549091169190921617905550620007e2565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006200037982846200060a565b90505b92915050565b6000546001600160a01b03163314620003e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b038116620004495760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620003d9565b62000454816200031b565b50565b62000463828262000467565b5050565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff16620004635760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b828054620004fd9062000762565b90600052602060002090601f0160209004810192826200052157600085556200056c565b82601f106200053c57805160ff19168380011785556200056c565b828001600101855582156200056c579182015b828111156200056c5782518255916020019190600101906200054f565b506200057a9291506200058c565b5090565b6101aa80620048ba83390190565b5b808211156200057a57600081556001016200058d565b80516001600160a01b0381168114620005bb57600080fd5b919050565b600080600060608486031215620005d657600080fd5b620005e184620005a3565b9250620005f160208501620005a3565b91506200060160408501620005a3565b90509250925092565b6000826200061c576200061c620007cc565b500490565b600181815b8085111562000662578160001904821115620006465762000646620007b6565b808516156200065457918102915b93841c939080029062000626565b509250929050565b600062000379838360008262000683575060016200037c565b8162000692575060006200037c565b8160018114620006ab5760028114620006b657620006d6565b60019150506200037c565b60ff841115620006ca57620006ca620007b6565b50506001821b6200037c565b5060208310610133831016604e8410600b8410161715620006fb575081810a6200037c565b62000707838362000621565b80600019048211156200071e576200071e620007b6565b029392505050565b6000816000190483118215151615620007435762000743620007b6565b500290565b6000828210156200075d576200075d620007b6565b500390565b600181811c908216806200077757607f821691505b602082108114156200079957634e487b7160e01b600052602260045260246000fd5b50919050565b600082620007b157620007b1620007cc565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b60805160601c6140b262000808600039600081816107320152612fce01526140b26000f3fe60806040526004361061042a5760003560e01c80638b5a6a0811610229578063cf558d891161012e578063dc687166116100b6578063ea2ea0851161007a578063ea2ea08514610d7e578063f2fde38b14610e1f578063f53c1a5814610e3f578063f54494b614610e61578063ff23f7c114610e8157600080fd5b8063dc68716614610cb5578063dd11247e14610ccf578063dd62ed3e14610ce4578063e1b11da414610d2a578063e5925b4214610d5e57600080fd5b8063d547741f116100fd578063d547741f14610c1f578063d85e4d2514610c3f578063da0933ac14610c5f578063da48baf414610c75578063db006a7514610c9557600080fd5b8063cf558d8914610b93578063cf61598f14610bb3578063d45e347e14610bd2578063d505accf14610bff57600080fd5b8063a457c2d7116101b1578063a9059cbb11610180578063a9059cbb14610afb578063b1bf962d14610b1b578063bcc941b614610b30578063c6dab81014610b46578063ceebf41c14610b7357600080fd5b8063a457c2d714610a6b578063a59f3e0c14610a8b578063a718486b14610aab578063a74d676514610adb57600080fd5b806395d89b41116101f857806395d89b41146109eb5780639bb3393c14610a00578063a217fddf14610a20578063a26dbf2614610a35578063a3a7e7f314610a4b57600080fd5b80638b5a6a081461096d5780638da5cb5b1461098d5780638e27d7d7146109ab57806391d14854146109cb57600080fd5b806338d52e0f1161032f5780636f7d4948116102b7578063740b9ba811610286578063740b9ba8146108b457806378160376146108ca5780637c7dfd84146108f75780637ecebe001461091757806384d4b4101461094d57600080fd5b80636f7d494814610853578063701863f91461086957806370a082311461087f578063715018a61461089f57600080fd5b8063555f323a116102fe578063555f323a146107d15780635c527f6b146107e75780635e9313d3146108075780636653493d14610827578063665921491461083d57600080fd5b806338d52e0f146106c8578063395093511461070057806346d1d21a14610720578063537a0c621461075457600080fd5b80632593f3b8116103b257806330adf81f1161038157806330adf81f1461061d578063313ce5671461065157806331657926146106735780633644e5151461069357806336568abe146106a857600080fd5b80632593f3b81461059b57806327bedfb3146105bb5780632f2ff15d146105db5780632f440730146105fb57600080fd5b806318160ddd116103f957806318160ddd146104dd5780631da24f3e146104f257806322099b011461052857806323b872dd1461054a578063248a9ca31461056a57600080fd5b806301ffc9a71461043657806306fdde031461046b578063095ea7b31461048d5780630f53c056146104ad57600080fd5b3661043157005b600080fd5b34801561044257600080fd5b5061045661045136600461373c565b610ea1565b60405190151581526020015b60405180910390f35b34801561047757600080fd5b50610480610ed8565b6040516104629190613a28565b34801561049957600080fd5b506104566104a8366004613698565b610f6a565b3480156104b957600080fd5b506104cf60008051602061401d83398151915281565b604051908152602001610462565b3480156104e957600080fd5b506104cf610fc4565b3480156104fe57600080fd5b506104cf61050d36600461358a565b6001600160a01b031660009081526006602052604090205490565b34801561053457600080fd5b50610548610543366004613766565b610fd3565b005b34801561055657600080fd5b506104566105653660046135e0565b6113a3565b34801561057657600080fd5b506104cf6105853660046136fe565b6000908152600160208190526040909120015490565b3480156105a757600080fd5b506105486105b636600461358a565b6114dd565b3480156105c757600080fd5b506105486105d63660046136fe565b61152b565b3480156105e757600080fd5b506105486105f6366004613717565b6115d2565b34801561060757600080fd5b506106106115fd565b6040516104629190613a90565b34801561062957600080fd5b506104cf7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b34801561065d57600080fd5b50600b5460405160ff9091168152602001610462565b34801561067f57600080fd5b506104cf61068e36600461358a565b6118f9565b34801561069f57600080fd5b506104cf611904565b3480156106b457600080fd5b506105486106c3366004613717565b6119b9565b3480156106d457600080fd5b50600d546106e8906001600160a01b031681565b6040516001600160a01b039091168152602001610462565b34801561070c57600080fd5b5061045661071b366004613698565b611a37565b34801561072c57600080fd5b506106e87f000000000000000000000000000000000000000000000000000000000000000081565b34801561076057600080fd5b506107a461076f36600461358a565b601b60205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909186565b604080519687526020870195909552938501929092526060840152608083015260a082015260c001610462565b3480156107dd57600080fd5b506104cf60175481565b3480156107f357600080fd5b506105486108023660046136fe565b611aaa565b34801561081357600080fd5b50600e546106e8906001600160a01b031681565b34801561083357600080fd5b506104cf60115481565b34801561084957600080fd5b506104cf60155481565b34801561085f57600080fd5b506104cf60105481565b34801561087557600080fd5b506104cf60135481565b34801561088b57600080fd5b506104cf61089a36600461358a565b611ad9565b3480156108ab57600080fd5b50610548611ae4565b3480156108c057600080fd5b506104cf60185481565b3480156108d657600080fd5b50610480604051806040016040528060018152602001603160f81b81525081565b34801561090357600080fd5b506105486109123660046136c4565b611b1a565b34801561092357600080fd5b506104cf61093236600461358a565b6001600160a01b031660009081526008602052604090205490565b34801561095957600080fd5b506104566109683660046135a7565b611b57565b34801561097957600080fd5b5061054861098836600461358a565b611c67565b34801561099957600080fd5b506000546001600160a01b03166106e8565b3480156109b757600080fd5b506002546106e8906001600160a01b031681565b3480156109d757600080fd5b506104566109e6366004613717565b611ce5565b3480156109f757600080fd5b50610480611d10565b348015610a0c57600080fd5b50610548610a1b36600461358a565b611d1f565b348015610a2c57600080fd5b506104cf600081565b348015610a4157600080fd5b506104cf60195481565b348015610a5757600080fd5b50610456610a6636600461358a565b611d61565b348015610a7757600080fd5b50610456610a86366004613698565b611e31565b348015610a9757600080fd5b50610548610aa63660046136fe565b611ec1565b348015610ab757600080fd5b50610456610ac636600461358a565b601d6020526000908152604090205460ff1681565b348015610ae757600080fd5b50610548610af636600461358a565b6120fd565b348015610b0757600080fd5b50610456610b16366004613698565b612149565b348015610b2757600080fd5b506003546104cf565b348015610b3c57600080fd5b506104cf60145481565b348015610b5257600080fd5b50610b66610b613660046136fe565b612188565b6040516104629190613995565b348015610b7f57600080fd5b506012546106e8906001600160a01b031681565b348015610b9f57600080fd5b50610548610bae3660046136fe565b612213565b348015610bbf57600080fd5b50601a5461045690610100900460ff1681565b348015610bde57600080fd5b50610bf2610bed3660046137a2565b612242565b60405161046291906139f0565b348015610c0b57600080fd5b50610548610c1a366004613621565b612520565b348015610c2b57600080fd5b50610548610c3a366004613717565b6126d7565b348015610c4b57600080fd5b50610548610c5a36600461358a565b6126fd565b348015610c6b57600080fd5b506104cf60165481565b348015610c8157600080fd5b50610548610c903660046136fe565b612749565b348015610ca157600080fd5b50610548610cb03660046136fe565b6127ed565b348015610cc157600080fd5b50601a546104569060ff1681565b348015610cdb57600080fd5b506104cf612ab2565b348015610cf057600080fd5b506104cf610cff3660046135a7565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b348015610d3657600080fd5b506104cf7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b348015610d6a57600080fd5b50610548610d793660046136fe565b612abc565b348015610d8a57600080fd5b50610e0d610d993660046136fe565b601c6020908152600091825260409182902080546001820154600283015460038401546004850154875160a081018952600587015481526006870154978101979097526007860154978701979097526008850154606087015260099094015463ffffffff1660808601529194909391929186565b60405161046296959493929190613b4b565b348015610e2b57600080fd5b50610548610e3a36600461358a565b612aeb565b348015610e4b57600080fd5b50610e54612b83565b6040516104629190613b3d565b348015610e6d57600080fd5b50610548610e7c3660046136fe565b612c48565b348015610e8d57600080fd5b50610548610e9c3660046136c4565b612c77565b60006001600160e01b03198216637965db0b60e01b1480610ed257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060098054610ee790613dfc565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1390613dfc565b8015610f605780601f10610f3557610100808354040283529160200191610f60565b820191906000526020600020905b815481529060010190602001808311610f4357829003601f168201915b5050505050905090565b3360008181526007602090815260408083206001600160a01b0387168085529252808320859055519192909160008051602061405d83398151915290610fb39086815260200190565b60405180910390a350600192915050565b6000610fce612d1e565b905090565b60008051602061401d833981519152610feb81612d38565b60005b610ffc610140840184613b87565b905081101561127e57600d546001600160a01b031663a9059cbb611024610140860186613b87565b8481811061103457611034613eec565b61104a926020604090920201908101915061358a565b611058610140870187613b87565b8581811061106857611068613eec565b905060400201602001356040518363ffffffff1660e01b81526004016110a39291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b1580156110bd57600080fd5b505af11580156110d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f591906136e1565b50611104610140840184613b87565b8281811061111457611114613eec565b90506040020160200135601b6000858061014001906111339190613b87565b8581811061114357611143613eec565b611159926020604090920201908101915061358a565b6001600160a01b0316815260208101919091526040016000205461117d9190613bd8565b601b600061118f610140870187613b87565b8581811061119f5761119f613eec565b6111b5926020604090920201908101915061358a565b6001600160a01b031681526020810191909152604001600020556111dd610140840184613b87565b828181106111ed576111ed613eec565b611203926020604090920201908101915061358a565b6001600160a01b03167f5afeca38b2064c23a692c4cf353015d80ab3ecc417b4f893f372690c11fbd9a661123b610140860186613b87565b8481811061124b5761124b613eec565b9050604002016020013560405161126491815260200190565b60405180910390a28061127681613e54565b915050610fee565b5061128d438360600135612d42565b5060808201351561133857600d5460405163a9059cbb60e01b815261dead6004820152608084013560248201526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b1580156112e957600080fd5b505af11580156112fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132191906136e1565b5081608001356017546113349190613bd8565b6017555b6018546000908152601c6020526040902082906113558282613f18565b5050601854604080519084013591907f2dc14f7487788ddd321b39fd8256f7f77b4a99e1837268540d1f9da7665d7fb390600090a36018805490600061139a83613e54565b91905055505050565b6000826001600160a01b0381166113b957600080fd5b6001600160a01b0381163014156113cf57600080fd5b6001600160a01b03851660009081526007602090815260408083203384529091529020546113fd9084612e70565b6001600160a01b0386166000908152600760209081526040808320338452909152812091909155600554611432908590612e7c565b6001600160a01b0387166000908152600660205260409020549091506114589082612e70565b6001600160a01b0380881660009081526006602052604080822093909355908716815220546114879082612e88565b6001600160a01b03808716600081815260066020526040908190209390935591519088169060008051602061403d833981519152906114c99088815260200190565b60405180910390a350600195945050505050565b6000546001600160a01b031633146115105760405162461bcd60e51b815260040161150790613a5b565b60405180910390fd5b61152860008051602061401d83398151915282612e94565b50565b6000546001600160a01b031633146115555760405162461bcd60e51b815260040161150790613a5b565b620f42406015546016546115699190613bd8565b11156115cd5760405162461bcd60e51b815260206004820152602d60248201527f4e6577204a61636b706f7420726174696f2065786365656473206d6178696d7560448201526c369030b63637b1b0ba34b7b71760991b6064820152608401611507565b601555565b600082815260016020819052604090912001546115ee81612d38565b6115f88383612efb565b505050565b611605613512565b600060145467ffffffffffffffff81111561162257611622613f02565b60405190808252806020026020018201604052801561166757816020015b60408051808201909152600080825260208201528152602001906001900390816116405790505b509050600080600181808061167a612f66565b9050600061168782612242565b90506000611693612d1e565b600d546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156116d657600080fd5b505afa1580156116ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170e9190613818565b6117189190613cd6565b90506000601454620f4240601554846117319190613cb7565b61173b9190613c1e565b6117459190613c1e565b90506000620f42406016548461175b9190613cb7565b6117659190613c1e565b9050600081601454846117789190613cb7565b6117829086613cd6565b61178c9190613cd6565b90505b6014548b60ff1610156118b6578897506117d4601e8b62ffffff16815481106117ba576117ba613eec565b6000918252602090912001546001600160a01b0316613055565b6117de9089613bd8565b965087858c60ff16815181106117f6576117f6613eec565b602002602001015110158015611828575086858c60ff168151811061181d5761181d613eec565b602002602001015111155b156118a1576040518060400160405280601e8c62ffffff168154811061185057611850613eec565b600091825260209182902001546001600160a01b03168252018490528c518d9060ff8e1690811061188357611883613eec565b60200260200101819052508a8061189990613e6f565b9b505061178f565b896118ab81613e31565b9a505086985061178f565b6040805160e081018252601854815242602082015290810194909452606084015260808301525060a08101929092525060c0810196909652509395945050505050565b6000610ed282613055565b6000804690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600960405161193a9190613884565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018290523060a082015260c0016040516020818303038152906040528051906020012091505090565b6001600160a01b0381163314611a295760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401611507565b611a338282612e94565b5050565b3360009081526007602090815260408083206001600160a01b0386168452909152812054611a659083612e88565b3360008181526007602090815260408083206001600160a01b0389168085529083529281902085905551938452909260008051602061405d8339815191529101610fb3565b6000546001600160a01b03163314611ad45760405162461bcd60e51b815260040161150790613a5b565b601355565b6000610ed28261313f565b6000546001600160a01b03163314611b0e5760405162461bcd60e51b815260040161150790613a5b565b611b186000612cbb565b565b6000546001600160a01b03163314611b445760405162461bcd60e51b815260040161150790613a5b565b601a805460ff1916911515919091179055565b6000816001600160a01b038116611b6d57600080fd5b6001600160a01b038116301415611b8357600080fd5b6001600160a01b038416600090815260066020526040812054600554909190611bad908390612d0b565b6001600160a01b0387166000908152600760209081526040808320338452909152902054909150611bde9082612e70565b6001600160a01b038088166000818152600760209081526040808320338452825280832095909555918152600690915282812081905590871681522054611c259083612e88565b6001600160a01b03808716600081815260066020526040908190209390935591519088169060008051602061403d833981519152906114c99085815260200190565b6000546001600160a01b03163314611c915760405162461bcd60e51b815260040161150790613a5b565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f0e6961f1a1afb87eaf51fd64f22ddc10062e23aa7838eac5d0bdf140bfd389729060200160405180910390a150565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600a8054610ee790613dfc565b6000546001600160a01b03163314611d495760405162461bcd60e51b815260040161150790613a5b565b61152860008051602061401d83398151915282612efb565b6000816001600160a01b038116611d7757600080fd5b6001600160a01b038116301415611d8d57600080fd5b33600090815260066020526040812054600554909190611dae908390612d0b565b336000908152600660205260408082208290556001600160a01b0388168252902054909150611ddd9083612e88565b6001600160a01b03861660008181526006602052604090819020929092559051339060008051602061403d83398151915290611e1c9085815260200190565b60405180910390a36001935050505b50919050565b3360009081526007602090815260408083206001600160a01b038616845290915281205480831015611e6c57611e678184612e70565b611e6f565b60005b3360008181526007602090815260408083206001600160a01b038a168085529083529281902085905551938452909260008051602061405d833981519152910160405180910390a35060019392505050565b6002600c541415611f145760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611507565b6002600c55601a5460ff161515600114611f7a5760405162461bcd60e51b815260206004820152602160248201527f5068656e6978204c6f74746f20506f6f6c206973206e6f7420656e61626c65646044820152602160f81b6064820152608401611507565b33611f8861dead8284613167565b50600d546040516323b872dd60e01b81526001600160a01b03838116600483015230602483015260448201859052909116906323b872dd90606401602060405180830381600087803b158015611fdd57600080fd5b505af1158015611ff1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201591906136e1565b506001600160a01b0381166000908152601b602052604081204260018201556002018054849290612047908490613bd8565b90915550506001600160a01b0381166000908152601d602052604090205460ff166120f45760195461207a906001613bd8565b6019556001600160a01b0381166000818152601d60209081526040808320805460ff19166001908117909155601b909252822042600590910155601e805491820181559091527f50bb669a95c7b50b7e8a6f09454034b2b14cf2b85c730dca9a539ca82cb6e3500180546001600160a01b03191690911790555b50506001600c55565b6000546001600160a01b031633146121275760405162461bcd60e51b815260040161150790613a5b565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6000826001600160a01b03811661215f57600080fd5b6001600160a01b03811630141561217557600080fd5b612180338585613167565b949350505050565b6060601c6000838152602001908152602001600020600a01805480602002602001604051908101604052809291908181526020016000905b82821015612208576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001908101548284015290835290920191016121c0565b505050509050919050565b6000546001600160a01b0316331461223d5760405162461bcd60e51b815260040161150790613a5b565b601455565b6060601454826020015110156122a95760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768207469636b65747320746f2067656e65726174652077604482015265696e6e65727360d01b6064820152608401611507565b600060145467ffffffffffffffff8111156122c6576122c6613f02565b6040519080825280602002602001820160405280156122ef578160200160208202803683370190505b5090506000805b601454811015612428578161230a81613e54565b9250506000856020015160016123209190613bd8565b86516020808901516040808b015160608c015160808d0151925161237a968b969095949101958652602086019490945260408501929092526060840152608083015260e01b6001600160e01b03191660a082015260a40190565b6040516020818303038152906040528051906020012060001c61239d9190613e8f565b90506000805b85518110156123e8578581815181106123be576123be613eec565b60200260200101518314156123d657600191506123e8565b806123e081613e54565b9150506123a3565b5080156123f65750506122f6565b8185848151811061240957612409613eec565b60209081029190910101528261241e81613e54565b93505050506122f6565b60005b83518110156125165760005b84518110156125035784818151811061245257612452613eec565b602002602001015185838151811061246c5761246c613eec565b602002602001015110156124f157600085828151811061248e5761248e613eec565b602002602001015190508583815181106124aa576124aa613eec565b60200260200101518683815181106124c4576124c4613eec565b602002602001018181525050808684815181106124e3576124e3613eec565b602002602001018181525050505b806124fb81613e54565b915050612437565b508061250e81613e54565b91505061242b565b5091949350505050565b8342111561252d57600080fd5b6001600160a01b0387811660008181526008602090815260408083205481517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98185015280830195909552948b166060850152608084018a905260a0840185905260c08085018a90528151808603909101815260e090940190528251920191909120906125b8611904565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201206000845290830180835281905260ff8916918301919091526060820187905260808201869052915060019060a0016020604051602081039080840390855afa158015612640573d6000803e3d6000fd5b505050602060405103516001600160a01b03168a6001600160a01b03161461266757600080fd5b612672836001612e88565b6001600160a01b038b811660008181526008602090815260408083209590955560078152848220938e16808352938152908490208c905592518b81529192909160008051602061405d833981519152910160405180910390a350505050505050505050565b600082815260016020819052604090912001546126f381612d38565b6115f88383612e94565b6000546001600160a01b031633146127275760405162461bcd60e51b815260040161150790613a5b565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146127735760405162461bcd60e51b815260040161150790613a5b565b620f42406015546016546127879190613bd8565b11156127e85760405162461bcd60e51b815260206004820152602a60248201527f4e6577204275726e20726174696f2065786365656473206d6178696d756d2061604482015269363637b1b0ba34b7b71760b11b6064820152608401611507565b601655565b6002600c5414156128405760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611507565b6002600c55338160006128528361313f565b8411156128ad5760405162461bcd60e51b8152602060048201526024808201527f4e6f7420656e6f756768207469636b65747320746f2072656465656d20616d6f6044820152633ab73a1760e11b6064820152608401611507565b6010546001600160a01b0384166000908152601b60205260409020600501546128d69042613cd6565b10156129ac57620f4240601154836128ee9190613cb7565b6128f89190613c1e565b90506129048183613cd6565b600d549092506001600160a01b031663a9059cbb61292a6000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b15801561297257600080fd5b505af1158015612986573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129aa91906136e1565b505b600d5460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb90604401602060405180830381600087803b1580156129fa57600080fd5b505af1158015612a0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3291906136e1565b506001600160a01b0383166000908152601b602052604090206003810183905542600490910155612a668361dead86613167565b50612a708361313f565b612aa7576001600160a01b0383166000908152601d60205260409020805460ff19169055601954612aa390600190613cd6565b6019555b50506001600c555050565b6000610fce613229565b6000546001600160a01b03163314612ae65760405162461bcd60e51b815260040161150790613a5b565b601055565b6000546001600160a01b03163314612b155760405162461bcd60e51b815260040161150790613a5b565b6001600160a01b038116612b7a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611507565b61152881612cbb565b612b8b613555565b600060185411612bdd5760405162461bcd60e51b815260206004820152601860248201527f4e6f2064726177732068617665206265656e206d6164652e00000000000000006044820152606401611507565b601c60006001601854612bf09190613cd6565b81526020808201929092526040908101600020815160a08101835260058201548152600682015493810193909352600781015491830191909152600881015460608301526009015463ffffffff166080820152919050565b6000546001600160a01b03163314612c725760405162461bcd60e51b815260040161150790613a5b565b601155565b6000546001600160a01b03163314612ca15760405162461bcd60e51b815260040161150790613a5b565b601a80549115156101000261ff0019909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612d178284613c1e565b9392505050565b6000612d2b61dead61313f565b600454610fce9190613cd6565b611528813361326c565b600081612d8e57827f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f2600454604051612d7d91815260200190565b60405180910390a250600454610ed2565b612dcf62989680612dc2612dc8612db2612da961dead61313f565b60045490612e70565b600454612dc290629896806132d0565b90613322565b85906132d0565b91506000821215612dee57612de6612da98361334c565b600455612dff565b600454612dfb9083612e88565b6004555b6004546001600160801b031015612e1c576001600160801b036004555b600454600354612e2b91612d0b565b60055560045460405190815283907f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29060200160405180910390a25060045492915050565b6000612d178284613cd6565b6000612d178284613cb7565b6000612d178284613bd8565b612e9e8282611ce5565b15611a335760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b612f058282611ce5565b611a335760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b612f6e613555565b6040805160a08101909152601e54815260208101612f8a613229565b815242602082015244604080830191909152516324cbbfc160e01b815263ffffffff6004820152600060248201524360448201526060909101906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324cbbfc19060640160206040518083038186803b15801561301057600080fd5b505afa158015613024573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130489190613831565b63ffffffff169052919050565b6000806130618361313f565b601a54909150610100900460ff1615610ed257600e546040516370a0823160e01b81526001600160a01b03858116600483015260009216906370a082319060240160206040518083038186803b1580156130ba57600080fd5b505afa1580156130ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130f29190613818565b905080613100575092915050565b620f42408082620f42406013546131179190613cd6565b6131219190613cb7565b61312b9190613bd8565b6131359084613cb7565b6121809190613c1e565b6005546001600160a01b0382166000908152600660205260408120549091610ed29190612d0b565b60008061317f60055484612e7c90919063ffffffff16565b6001600160a01b0386166000908152600660205260409020549091506131a59082612e70565b6001600160a01b0380871660009081526006602052604080822093909355908616815220546131d49082612e88565b6001600160a01b03808616600081815260066020526040908190209390935591519087169060008051602061403d833981519152906132169087815260200190565b60405180910390a3506001949350505050565b600080805b601e54811015611e2b5761324e601e82815481106117ba576117ba613eec565b6132589083613bd8565b91508061326481613e54565b91505061322e565b6132768282611ce5565b611a335761328e816001600160a01b03166014613376565b613299836020613376565b6040516020016132aa929190613920565b60408051601f198184030181529082905262461bcd60e51b825261150791600401613a28565b6000806132dd8385613c32565b9050600160ff1b811415806132fb5750600160ff1b84811690841614155b61330457600080fd5b8215806133195750836133178483613bf0565b145b612d1757600080fd5b6000816000191415806133395750600160ff1b8314155b61334257600080fd5b612d178284613bf0565b6000600160ff1b82141561335f57600080fd5b6000821261336d5781610ed2565b610ed282613ea3565b60606000613385836002613cb7565b613390906002613bd8565b67ffffffffffffffff8111156133a8576133a8613f02565b6040519080825280601f01601f1916602001820160405280156133d2576020820181803683370190505b509050600360fc1b816000815181106133ed576133ed613eec565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061341c5761341c613eec565b60200101906001600160f81b031916908160001a9053506000613440846002613cb7565b61344b906001613bd8565b90505b60018111156134c3576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061347f5761347f613eec565b1a60f81b82828151811061349557613495613eec565b60200101906001600160f81b031916908160001a90535060049490941c936134bc81613de5565b905061344e565b508315612d175760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401611507565b6040518060e001604052806000815260200160008152602001600081526020016000815260200160008152602001613548613555565b8152602001606081525090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600063ffffffff1681525090565b60006020828403121561359c57600080fd5b8135612d1781613fe7565b600080604083850312156135ba57600080fd5b82356135c581613fe7565b915060208301356135d581613fe7565b809150509250929050565b6000806000606084860312156135f557600080fd5b833561360081613fe7565b9250602084013561361081613fe7565b929592945050506040919091013590565b600080600080600080600060e0888a03121561363c57600080fd5b873561364781613fe7565b9650602088013561365781613fe7565b95506040880135945060608801359350608088013560ff8116811461367b57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156136ab57600080fd5b82356136b681613fe7565b946020939093013593505050565b6000602082840312156136d657600080fd5b8135612d1781613ffc565b6000602082840312156136f357600080fd5b8151612d1781613ffc565b60006020828403121561371057600080fd5b5035919050565b6000806040838503121561372a57600080fd5b8235915060208301356135d581613fe7565b60006020828403121561374e57600080fd5b81356001600160e01b031981168114612d1757600080fd5b60006020828403121561377857600080fd5b813567ffffffffffffffff81111561378f57600080fd5b82016101608185031215612d1757600080fd5b600060a082840312156137b457600080fd5b60405160a0810181811067ffffffffffffffff821117156137d7576137d7613f02565b806040525082358152602083013560208201526040830135604082015260608301356060820152608083013561380c8161400a565b60808201529392505050565b60006020828403121561382a57600080fd5b5051919050565b60006020828403121561384357600080fd5b8151612d178161400a565b8051825260208101516020830152604081015160408301526060810151606083015263ffffffff60808201511660808301525050565b600080835481600182811c9150808316806138a057607f831692505b60208084108214156138c057634e487b7160e01b86526022600452602486fd5b8180156138d457600181146138e557613912565b60ff19861689528489019650613912565b60008a81526020902060005b8681101561390a5781548b8201529085019083016138f1565b505084890196505b509498975050505050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613958816017850160208801613db5565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613989816028840160208801613db5565b01602801949350505050565b6020808252825182820181905260009190848201906040850190845b818110156139e457835180516001600160a01b0316845260209081015190840152604083019385019392506001016139b1565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156139e457835183529284019291840191600101613a0c565b6020815260008251806020840152613a47816040850160208701613db5565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602080835261018083018451828501528185015160408501526040850151606085015260608501516080850152608085015160a085015260a0850151613adb60c086018261384e565b5060c0850151610160858101528051918290528201906000906101a08601905b80831015613b3257835180516001600160a01b03168352602090810151908301526040820191508484019350600183019250613afb565b509695505050505050565b60a08101610ed2828461384e565b600061014082019050878252866020830152856040830152846060830152836080830152613b7c60a083018461384e565b979650505050505050565b6000808335601e19843603018112613b9e57600080fd5b83018035915067ffffffffffffffff821115613bb957600080fd5b6020019150600681901b3603821315613bd157600080fd5b9250929050565b60008219821115613beb57613beb613ec0565b500190565b600082613bff57613bff613ed6565b600160ff1b821460001984141615613c1957613c19613ec0565b500590565b600082613c2d57613c2d613ed6565b500490565b60006001600160ff1b0381841382841380821686840486111615613c5857613c58613ec0565b600160ff1b6000871282811687830589121615613c7757613c77613ec0565b60008712925087820587128484161615613c9357613c93613ec0565b87850587128184161615613ca957613ca9613ec0565b505050929093029392505050565b6000816000190483118215151615613cd157613cd1613ec0565b500290565b600082821015613ce857613ce8613ec0565b500390565b68010000000000000000831115613d0657613d06613f02565b805483825580841015613d78576001600160ff1b036001818311811615613d2f57613d2f613ec0565b818611811615613d4157613d41613ec0565b60008481526020812090925086821b81019084831b015b80821015613d73578382558383830155600282019150613d58565b505050505b5060008181526020812083915b85811015613dad57613d978383613fb1565b6040929092019160029190910190600101613d85565b505050505050565b60005b83811015613dd0578181015183820152602001613db8565b83811115613ddf576000848401525b50505050565b600081613df457613df4613ec0565b506000190190565b600181811c90821680613e1057607f821691505b60208210811415611e2b57634e487b7160e01b600052602260045260246000fd5b600062ffffff80831681811415613e4a57613e4a613ec0565b6001019392505050565b6000600019821415613e6857613e68613ec0565b5060010190565b600060ff821660ff811415613e8657613e86613ec0565b60010192915050565b600082613e9e57613e9e613ed6565b500690565b6000600160ff1b821415613eb957613eb9613ec0565b5060000390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b813581556020820135600182015560408201356002820155606082013560038201556080820135600482015560a0820135600582015560c0820135600682015560e08201356007820155610100820135600882015560098101610120830135613f808161400a565b815463ffffffff191663ffffffff91909116179055613fa3610140830183613b87565b613ddf8183600a8601613ced565b8135613fbc81613fe7565b81546001600160a01b0319166001600160a01b03919091161781556020919091013560019190910155565b6001600160a01b038116811461152857600080fd5b801515811461152857600080fd5b63ffffffff8116811461152857600080fdfed8858e8e1664cbc67331ed60d855ac6de277d6d376c33d6c92ffec5836524871ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a264697066735822122096e3181dc366cff69158701a4b25cc3eefa038121f04d47414dd7060a54a8fa864736f6c63430008070033608060405234801561001057600080fd5b5060008055610186806100246000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806324cbbfc11461003b57806337e2322214610068575b600080fd5b61004e6100493660046100e1565b61007f565b60405163ffffffff90911681526020015b60405180910390f35b61007160005481565b60405190815260200161005f565b600080546040805143602082015242918101919091524460608201526080810184905260a0810185905260c0810191909152849060e0016040516020818303038152906040528051906020012060001c6100d9919061011f565b949350505050565b6000806000606084860312156100f657600080fd5b833563ffffffff8116811461010a57600080fd5b95602085013595506040909401359392505050565b600063ffffffff8084168061014457634e487b7160e01b600052601260045260246000fd5b9216919091069291505056fea26469706673582212208522e5ace258e7958872548ec83df4c5bfeac0ebe65ecdff74d2110764fbf99264736f6c63430008070033000000000000000000000000cf322b554b6cfb668221d5b1979b6e4e58ab4dbc00000000000000000000000057d06bb1e3b60c875cd3a4445a53217f9b44d390000000000000000000000000cf185cb08c62ff969d258fba18f92dabb278a8a9
Deployed Bytecode
0x60806040526004361061042a5760003560e01c80638b5a6a0811610229578063cf558d891161012e578063dc687166116100b6578063ea2ea0851161007a578063ea2ea08514610d7e578063f2fde38b14610e1f578063f53c1a5814610e3f578063f54494b614610e61578063ff23f7c114610e8157600080fd5b8063dc68716614610cb5578063dd11247e14610ccf578063dd62ed3e14610ce4578063e1b11da414610d2a578063e5925b4214610d5e57600080fd5b8063d547741f116100fd578063d547741f14610c1f578063d85e4d2514610c3f578063da0933ac14610c5f578063da48baf414610c75578063db006a7514610c9557600080fd5b8063cf558d8914610b93578063cf61598f14610bb3578063d45e347e14610bd2578063d505accf14610bff57600080fd5b8063a457c2d7116101b1578063a9059cbb11610180578063a9059cbb14610afb578063b1bf962d14610b1b578063bcc941b614610b30578063c6dab81014610b46578063ceebf41c14610b7357600080fd5b8063a457c2d714610a6b578063a59f3e0c14610a8b578063a718486b14610aab578063a74d676514610adb57600080fd5b806395d89b41116101f857806395d89b41146109eb5780639bb3393c14610a00578063a217fddf14610a20578063a26dbf2614610a35578063a3a7e7f314610a4b57600080fd5b80638b5a6a081461096d5780638da5cb5b1461098d5780638e27d7d7146109ab57806391d14854146109cb57600080fd5b806338d52e0f1161032f5780636f7d4948116102b7578063740b9ba811610286578063740b9ba8146108b457806378160376146108ca5780637c7dfd84146108f75780637ecebe001461091757806384d4b4101461094d57600080fd5b80636f7d494814610853578063701863f91461086957806370a082311461087f578063715018a61461089f57600080fd5b8063555f323a116102fe578063555f323a146107d15780635c527f6b146107e75780635e9313d3146108075780636653493d14610827578063665921491461083d57600080fd5b806338d52e0f146106c8578063395093511461070057806346d1d21a14610720578063537a0c621461075457600080fd5b80632593f3b8116103b257806330adf81f1161038157806330adf81f1461061d578063313ce5671461065157806331657926146106735780633644e5151461069357806336568abe146106a857600080fd5b80632593f3b81461059b57806327bedfb3146105bb5780632f2ff15d146105db5780632f440730146105fb57600080fd5b806318160ddd116103f957806318160ddd146104dd5780631da24f3e146104f257806322099b011461052857806323b872dd1461054a578063248a9ca31461056a57600080fd5b806301ffc9a71461043657806306fdde031461046b578063095ea7b31461048d5780630f53c056146104ad57600080fd5b3661043157005b600080fd5b34801561044257600080fd5b5061045661045136600461373c565b610ea1565b60405190151581526020015b60405180910390f35b34801561047757600080fd5b50610480610ed8565b6040516104629190613a28565b34801561049957600080fd5b506104566104a8366004613698565b610f6a565b3480156104b957600080fd5b506104cf60008051602061401d83398151915281565b604051908152602001610462565b3480156104e957600080fd5b506104cf610fc4565b3480156104fe57600080fd5b506104cf61050d36600461358a565b6001600160a01b031660009081526006602052604090205490565b34801561053457600080fd5b50610548610543366004613766565b610fd3565b005b34801561055657600080fd5b506104566105653660046135e0565b6113a3565b34801561057657600080fd5b506104cf6105853660046136fe565b6000908152600160208190526040909120015490565b3480156105a757600080fd5b506105486105b636600461358a565b6114dd565b3480156105c757600080fd5b506105486105d63660046136fe565b61152b565b3480156105e757600080fd5b506105486105f6366004613717565b6115d2565b34801561060757600080fd5b506106106115fd565b6040516104629190613a90565b34801561062957600080fd5b506104cf7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b34801561065d57600080fd5b50600b5460405160ff9091168152602001610462565b34801561067f57600080fd5b506104cf61068e36600461358a565b6118f9565b34801561069f57600080fd5b506104cf611904565b3480156106b457600080fd5b506105486106c3366004613717565b6119b9565b3480156106d457600080fd5b50600d546106e8906001600160a01b031681565b6040516001600160a01b039091168152602001610462565b34801561070c57600080fd5b5061045661071b366004613698565b611a37565b34801561072c57600080fd5b506106e87f000000000000000000000000f8a068f65c75e830a990cd0b0570b0750519727281565b34801561076057600080fd5b506107a461076f36600461358a565b601b60205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909186565b604080519687526020870195909552938501929092526060840152608083015260a082015260c001610462565b3480156107dd57600080fd5b506104cf60175481565b3480156107f357600080fd5b506105486108023660046136fe565b611aaa565b34801561081357600080fd5b50600e546106e8906001600160a01b031681565b34801561083357600080fd5b506104cf60115481565b34801561084957600080fd5b506104cf60155481565b34801561085f57600080fd5b506104cf60105481565b34801561087557600080fd5b506104cf60135481565b34801561088b57600080fd5b506104cf61089a36600461358a565b611ad9565b3480156108ab57600080fd5b50610548611ae4565b3480156108c057600080fd5b506104cf60185481565b3480156108d657600080fd5b50610480604051806040016040528060018152602001603160f81b81525081565b34801561090357600080fd5b506105486109123660046136c4565b611b1a565b34801561092357600080fd5b506104cf61093236600461358a565b6001600160a01b031660009081526008602052604090205490565b34801561095957600080fd5b506104566109683660046135a7565b611b57565b34801561097957600080fd5b5061054861098836600461358a565b611c67565b34801561099957600080fd5b506000546001600160a01b03166106e8565b3480156109b757600080fd5b506002546106e8906001600160a01b031681565b3480156109d757600080fd5b506104566109e6366004613717565b611ce5565b3480156109f757600080fd5b50610480611d10565b348015610a0c57600080fd5b50610548610a1b36600461358a565b611d1f565b348015610a2c57600080fd5b506104cf600081565b348015610a4157600080fd5b506104cf60195481565b348015610a5757600080fd5b50610456610a6636600461358a565b611d61565b348015610a7757600080fd5b50610456610a86366004613698565b611e31565b348015610a9757600080fd5b50610548610aa63660046136fe565b611ec1565b348015610ab757600080fd5b50610456610ac636600461358a565b601d6020526000908152604090205460ff1681565b348015610ae757600080fd5b50610548610af636600461358a565b6120fd565b348015610b0757600080fd5b50610456610b16366004613698565b612149565b348015610b2757600080fd5b506003546104cf565b348015610b3c57600080fd5b506104cf60145481565b348015610b5257600080fd5b50610b66610b613660046136fe565b612188565b6040516104629190613995565b348015610b7f57600080fd5b506012546106e8906001600160a01b031681565b348015610b9f57600080fd5b50610548610bae3660046136fe565b612213565b348015610bbf57600080fd5b50601a5461045690610100900460ff1681565b348015610bde57600080fd5b50610bf2610bed3660046137a2565b612242565b60405161046291906139f0565b348015610c0b57600080fd5b50610548610c1a366004613621565b612520565b348015610c2b57600080fd5b50610548610c3a366004613717565b6126d7565b348015610c4b57600080fd5b50610548610c5a36600461358a565b6126fd565b348015610c6b57600080fd5b506104cf60165481565b348015610c8157600080fd5b50610548610c903660046136fe565b612749565b348015610ca157600080fd5b50610548610cb03660046136fe565b6127ed565b348015610cc157600080fd5b50601a546104569060ff1681565b348015610cdb57600080fd5b506104cf612ab2565b348015610cf057600080fd5b506104cf610cff3660046135a7565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b348015610d3657600080fd5b506104cf7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b348015610d6a57600080fd5b50610548610d793660046136fe565b612abc565b348015610d8a57600080fd5b50610e0d610d993660046136fe565b601c6020908152600091825260409182902080546001820154600283015460038401546004850154875160a081018952600587015481526006870154978101979097526007860154978701979097526008850154606087015260099094015463ffffffff1660808601529194909391929186565b60405161046296959493929190613b4b565b348015610e2b57600080fd5b50610548610e3a36600461358a565b612aeb565b348015610e4b57600080fd5b50610e54612b83565b6040516104629190613b3d565b348015610e6d57600080fd5b50610548610e7c3660046136fe565b612c48565b348015610e8d57600080fd5b50610548610e9c3660046136c4565b612c77565b60006001600160e01b03198216637965db0b60e01b1480610ed257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060098054610ee790613dfc565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1390613dfc565b8015610f605780601f10610f3557610100808354040283529160200191610f60565b820191906000526020600020905b815481529060010190602001808311610f4357829003601f168201915b5050505050905090565b3360008181526007602090815260408083206001600160a01b0387168085529252808320859055519192909160008051602061405d83398151915290610fb39086815260200190565b60405180910390a350600192915050565b6000610fce612d1e565b905090565b60008051602061401d833981519152610feb81612d38565b60005b610ffc610140840184613b87565b905081101561127e57600d546001600160a01b031663a9059cbb611024610140860186613b87565b8481811061103457611034613eec565b61104a926020604090920201908101915061358a565b611058610140870187613b87565b8581811061106857611068613eec565b905060400201602001356040518363ffffffff1660e01b81526004016110a39291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b1580156110bd57600080fd5b505af11580156110d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f591906136e1565b50611104610140840184613b87565b8281811061111457611114613eec565b90506040020160200135601b6000858061014001906111339190613b87565b8581811061114357611143613eec565b611159926020604090920201908101915061358a565b6001600160a01b0316815260208101919091526040016000205461117d9190613bd8565b601b600061118f610140870187613b87565b8581811061119f5761119f613eec565b6111b5926020604090920201908101915061358a565b6001600160a01b031681526020810191909152604001600020556111dd610140840184613b87565b828181106111ed576111ed613eec565b611203926020604090920201908101915061358a565b6001600160a01b03167f5afeca38b2064c23a692c4cf353015d80ab3ecc417b4f893f372690c11fbd9a661123b610140860186613b87565b8481811061124b5761124b613eec565b9050604002016020013560405161126491815260200190565b60405180910390a28061127681613e54565b915050610fee565b5061128d438360600135612d42565b5060808201351561133857600d5460405163a9059cbb60e01b815261dead6004820152608084013560248201526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b1580156112e957600080fd5b505af11580156112fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132191906136e1565b5081608001356017546113349190613bd8565b6017555b6018546000908152601c6020526040902082906113558282613f18565b5050601854604080519084013591907f2dc14f7487788ddd321b39fd8256f7f77b4a99e1837268540d1f9da7665d7fb390600090a36018805490600061139a83613e54565b91905055505050565b6000826001600160a01b0381166113b957600080fd5b6001600160a01b0381163014156113cf57600080fd5b6001600160a01b03851660009081526007602090815260408083203384529091529020546113fd9084612e70565b6001600160a01b0386166000908152600760209081526040808320338452909152812091909155600554611432908590612e7c565b6001600160a01b0387166000908152600660205260409020549091506114589082612e70565b6001600160a01b0380881660009081526006602052604080822093909355908716815220546114879082612e88565b6001600160a01b03808716600081815260066020526040908190209390935591519088169060008051602061403d833981519152906114c99088815260200190565b60405180910390a350600195945050505050565b6000546001600160a01b031633146115105760405162461bcd60e51b815260040161150790613a5b565b60405180910390fd5b61152860008051602061401d83398151915282612e94565b50565b6000546001600160a01b031633146115555760405162461bcd60e51b815260040161150790613a5b565b620f42406015546016546115699190613bd8565b11156115cd5760405162461bcd60e51b815260206004820152602d60248201527f4e6577204a61636b706f7420726174696f2065786365656473206d6178696d7560448201526c369030b63637b1b0ba34b7b71760991b6064820152608401611507565b601555565b600082815260016020819052604090912001546115ee81612d38565b6115f88383612efb565b505050565b611605613512565b600060145467ffffffffffffffff81111561162257611622613f02565b60405190808252806020026020018201604052801561166757816020015b60408051808201909152600080825260208201528152602001906001900390816116405790505b509050600080600181808061167a612f66565b9050600061168782612242565b90506000611693612d1e565b600d546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156116d657600080fd5b505afa1580156116ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170e9190613818565b6117189190613cd6565b90506000601454620f4240601554846117319190613cb7565b61173b9190613c1e565b6117459190613c1e565b90506000620f42406016548461175b9190613cb7565b6117659190613c1e565b9050600081601454846117789190613cb7565b6117829086613cd6565b61178c9190613cd6565b90505b6014548b60ff1610156118b6578897506117d4601e8b62ffffff16815481106117ba576117ba613eec565b6000918252602090912001546001600160a01b0316613055565b6117de9089613bd8565b965087858c60ff16815181106117f6576117f6613eec565b602002602001015110158015611828575086858c60ff168151811061181d5761181d613eec565b602002602001015111155b156118a1576040518060400160405280601e8c62ffffff168154811061185057611850613eec565b600091825260209182902001546001600160a01b03168252018490528c518d9060ff8e1690811061188357611883613eec565b60200260200101819052508a8061189990613e6f565b9b505061178f565b896118ab81613e31565b9a505086985061178f565b6040805160e081018252601854815242602082015290810194909452606084015260808301525060a08101929092525060c0810196909652509395945050505050565b6000610ed282613055565b6000804690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600960405161193a9190613884565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018290523060a082015260c0016040516020818303038152906040528051906020012091505090565b6001600160a01b0381163314611a295760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401611507565b611a338282612e94565b5050565b3360009081526007602090815260408083206001600160a01b0386168452909152812054611a659083612e88565b3360008181526007602090815260408083206001600160a01b0389168085529083529281902085905551938452909260008051602061405d8339815191529101610fb3565b6000546001600160a01b03163314611ad45760405162461bcd60e51b815260040161150790613a5b565b601355565b6000610ed28261313f565b6000546001600160a01b03163314611b0e5760405162461bcd60e51b815260040161150790613a5b565b611b186000612cbb565b565b6000546001600160a01b03163314611b445760405162461bcd60e51b815260040161150790613a5b565b601a805460ff1916911515919091179055565b6000816001600160a01b038116611b6d57600080fd5b6001600160a01b038116301415611b8357600080fd5b6001600160a01b038416600090815260066020526040812054600554909190611bad908390612d0b565b6001600160a01b0387166000908152600760209081526040808320338452909152902054909150611bde9082612e70565b6001600160a01b038088166000818152600760209081526040808320338452825280832095909555918152600690915282812081905590871681522054611c259083612e88565b6001600160a01b03808716600081815260066020526040908190209390935591519088169060008051602061403d833981519152906114c99085815260200190565b6000546001600160a01b03163314611c915760405162461bcd60e51b815260040161150790613a5b565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f0e6961f1a1afb87eaf51fd64f22ddc10062e23aa7838eac5d0bdf140bfd389729060200160405180910390a150565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600a8054610ee790613dfc565b6000546001600160a01b03163314611d495760405162461bcd60e51b815260040161150790613a5b565b61152860008051602061401d83398151915282612efb565b6000816001600160a01b038116611d7757600080fd5b6001600160a01b038116301415611d8d57600080fd5b33600090815260066020526040812054600554909190611dae908390612d0b565b336000908152600660205260408082208290556001600160a01b0388168252902054909150611ddd9083612e88565b6001600160a01b03861660008181526006602052604090819020929092559051339060008051602061403d83398151915290611e1c9085815260200190565b60405180910390a36001935050505b50919050565b3360009081526007602090815260408083206001600160a01b038616845290915281205480831015611e6c57611e678184612e70565b611e6f565b60005b3360008181526007602090815260408083206001600160a01b038a168085529083529281902085905551938452909260008051602061405d833981519152910160405180910390a35060019392505050565b6002600c541415611f145760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611507565b6002600c55601a5460ff161515600114611f7a5760405162461bcd60e51b815260206004820152602160248201527f5068656e6978204c6f74746f20506f6f6c206973206e6f7420656e61626c65646044820152602160f81b6064820152608401611507565b33611f8861dead8284613167565b50600d546040516323b872dd60e01b81526001600160a01b03838116600483015230602483015260448201859052909116906323b872dd90606401602060405180830381600087803b158015611fdd57600080fd5b505af1158015611ff1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201591906136e1565b506001600160a01b0381166000908152601b602052604081204260018201556002018054849290612047908490613bd8565b90915550506001600160a01b0381166000908152601d602052604090205460ff166120f45760195461207a906001613bd8565b6019556001600160a01b0381166000818152601d60209081526040808320805460ff19166001908117909155601b909252822042600590910155601e805491820181559091527f50bb669a95c7b50b7e8a6f09454034b2b14cf2b85c730dca9a539ca82cb6e3500180546001600160a01b03191690911790555b50506001600c55565b6000546001600160a01b031633146121275760405162461bcd60e51b815260040161150790613a5b565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6000826001600160a01b03811661215f57600080fd5b6001600160a01b03811630141561217557600080fd5b612180338585613167565b949350505050565b6060601c6000838152602001908152602001600020600a01805480602002602001604051908101604052809291908181526020016000905b82821015612208576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001908101548284015290835290920191016121c0565b505050509050919050565b6000546001600160a01b0316331461223d5760405162461bcd60e51b815260040161150790613a5b565b601455565b6060601454826020015110156122a95760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768207469636b65747320746f2067656e65726174652077604482015265696e6e65727360d01b6064820152608401611507565b600060145467ffffffffffffffff8111156122c6576122c6613f02565b6040519080825280602002602001820160405280156122ef578160200160208202803683370190505b5090506000805b601454811015612428578161230a81613e54565b9250506000856020015160016123209190613bd8565b86516020808901516040808b015160608c015160808d0151925161237a968b969095949101958652602086019490945260408501929092526060840152608083015260e01b6001600160e01b03191660a082015260a40190565b6040516020818303038152906040528051906020012060001c61239d9190613e8f565b90506000805b85518110156123e8578581815181106123be576123be613eec565b60200260200101518314156123d657600191506123e8565b806123e081613e54565b9150506123a3565b5080156123f65750506122f6565b8185848151811061240957612409613eec565b60209081029190910101528261241e81613e54565b93505050506122f6565b60005b83518110156125165760005b84518110156125035784818151811061245257612452613eec565b602002602001015185838151811061246c5761246c613eec565b602002602001015110156124f157600085828151811061248e5761248e613eec565b602002602001015190508583815181106124aa576124aa613eec565b60200260200101518683815181106124c4576124c4613eec565b602002602001018181525050808684815181106124e3576124e3613eec565b602002602001018181525050505b806124fb81613e54565b915050612437565b508061250e81613e54565b91505061242b565b5091949350505050565b8342111561252d57600080fd5b6001600160a01b0387811660008181526008602090815260408083205481517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98185015280830195909552948b166060850152608084018a905260a0840185905260c08085018a90528151808603909101815260e090940190528251920191909120906125b8611904565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201206000845290830180835281905260ff8916918301919091526060820187905260808201869052915060019060a0016020604051602081039080840390855afa158015612640573d6000803e3d6000fd5b505050602060405103516001600160a01b03168a6001600160a01b03161461266757600080fd5b612672836001612e88565b6001600160a01b038b811660008181526008602090815260408083209590955560078152848220938e16808352938152908490208c905592518b81529192909160008051602061405d833981519152910160405180910390a350505050505050505050565b600082815260016020819052604090912001546126f381612d38565b6115f88383612e94565b6000546001600160a01b031633146127275760405162461bcd60e51b815260040161150790613a5b565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146127735760405162461bcd60e51b815260040161150790613a5b565b620f42406015546016546127879190613bd8565b11156127e85760405162461bcd60e51b815260206004820152602a60248201527f4e6577204275726e20726174696f2065786365656473206d6178696d756d2061604482015269363637b1b0ba34b7b71760b11b6064820152608401611507565b601655565b6002600c5414156128405760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611507565b6002600c55338160006128528361313f565b8411156128ad5760405162461bcd60e51b8152602060048201526024808201527f4e6f7420656e6f756768207469636b65747320746f2072656465656d20616d6f6044820152633ab73a1760e11b6064820152608401611507565b6010546001600160a01b0384166000908152601b60205260409020600501546128d69042613cd6565b10156129ac57620f4240601154836128ee9190613cb7565b6128f89190613c1e565b90506129048183613cd6565b600d549092506001600160a01b031663a9059cbb61292a6000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b15801561297257600080fd5b505af1158015612986573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129aa91906136e1565b505b600d5460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb90604401602060405180830381600087803b1580156129fa57600080fd5b505af1158015612a0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3291906136e1565b506001600160a01b0383166000908152601b602052604090206003810183905542600490910155612a668361dead86613167565b50612a708361313f565b612aa7576001600160a01b0383166000908152601d60205260409020805460ff19169055601954612aa390600190613cd6565b6019555b50506001600c555050565b6000610fce613229565b6000546001600160a01b03163314612ae65760405162461bcd60e51b815260040161150790613a5b565b601055565b6000546001600160a01b03163314612b155760405162461bcd60e51b815260040161150790613a5b565b6001600160a01b038116612b7a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611507565b61152881612cbb565b612b8b613555565b600060185411612bdd5760405162461bcd60e51b815260206004820152601860248201527f4e6f2064726177732068617665206265656e206d6164652e00000000000000006044820152606401611507565b601c60006001601854612bf09190613cd6565b81526020808201929092526040908101600020815160a08101835260058201548152600682015493810193909352600781015491830191909152600881015460608301526009015463ffffffff166080820152919050565b6000546001600160a01b03163314612c725760405162461bcd60e51b815260040161150790613a5b565b601155565b6000546001600160a01b03163314612ca15760405162461bcd60e51b815260040161150790613a5b565b601a80549115156101000261ff0019909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612d178284613c1e565b9392505050565b6000612d2b61dead61313f565b600454610fce9190613cd6565b611528813361326c565b600081612d8e57827f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f2600454604051612d7d91815260200190565b60405180910390a250600454610ed2565b612dcf62989680612dc2612dc8612db2612da961dead61313f565b60045490612e70565b600454612dc290629896806132d0565b90613322565b85906132d0565b91506000821215612dee57612de6612da98361334c565b600455612dff565b600454612dfb9083612e88565b6004555b6004546001600160801b031015612e1c576001600160801b036004555b600454600354612e2b91612d0b565b60055560045460405190815283907f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29060200160405180910390a25060045492915050565b6000612d178284613cd6565b6000612d178284613cb7565b6000612d178284613bd8565b612e9e8282611ce5565b15611a335760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b612f058282611ce5565b611a335760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b612f6e613555565b6040805160a08101909152601e54815260208101612f8a613229565b815242602082015244604080830191909152516324cbbfc160e01b815263ffffffff6004820152600060248201524360448201526060909101906001600160a01b037f000000000000000000000000f8a068f65c75e830a990cd0b0570b0750519727216906324cbbfc19060640160206040518083038186803b15801561301057600080fd5b505afa158015613024573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130489190613831565b63ffffffff169052919050565b6000806130618361313f565b601a54909150610100900460ff1615610ed257600e546040516370a0823160e01b81526001600160a01b03858116600483015260009216906370a082319060240160206040518083038186803b1580156130ba57600080fd5b505afa1580156130ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130f29190613818565b905080613100575092915050565b620f42408082620f42406013546131179190613cd6565b6131219190613cb7565b61312b9190613bd8565b6131359084613cb7565b6121809190613c1e565b6005546001600160a01b0382166000908152600660205260408120549091610ed29190612d0b565b60008061317f60055484612e7c90919063ffffffff16565b6001600160a01b0386166000908152600660205260409020549091506131a59082612e70565b6001600160a01b0380871660009081526006602052604080822093909355908616815220546131d49082612e88565b6001600160a01b03808616600081815260066020526040908190209390935591519087169060008051602061403d833981519152906132169087815260200190565b60405180910390a3506001949350505050565b600080805b601e54811015611e2b5761324e601e82815481106117ba576117ba613eec565b6132589083613bd8565b91508061326481613e54565b91505061322e565b6132768282611ce5565b611a335761328e816001600160a01b03166014613376565b613299836020613376565b6040516020016132aa929190613920565b60408051601f198184030181529082905262461bcd60e51b825261150791600401613a28565b6000806132dd8385613c32565b9050600160ff1b811415806132fb5750600160ff1b84811690841614155b61330457600080fd5b8215806133195750836133178483613bf0565b145b612d1757600080fd5b6000816000191415806133395750600160ff1b8314155b61334257600080fd5b612d178284613bf0565b6000600160ff1b82141561335f57600080fd5b6000821261336d5781610ed2565b610ed282613ea3565b60606000613385836002613cb7565b613390906002613bd8565b67ffffffffffffffff8111156133a8576133a8613f02565b6040519080825280601f01601f1916602001820160405280156133d2576020820181803683370190505b509050600360fc1b816000815181106133ed576133ed613eec565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061341c5761341c613eec565b60200101906001600160f81b031916908160001a9053506000613440846002613cb7565b61344b906001613bd8565b90505b60018111156134c3576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061347f5761347f613eec565b1a60f81b82828151811061349557613495613eec565b60200101906001600160f81b031916908160001a90535060049490941c936134bc81613de5565b905061344e565b508315612d175760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401611507565b6040518060e001604052806000815260200160008152602001600081526020016000815260200160008152602001613548613555565b8152602001606081525090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600063ffffffff1681525090565b60006020828403121561359c57600080fd5b8135612d1781613fe7565b600080604083850312156135ba57600080fd5b82356135c581613fe7565b915060208301356135d581613fe7565b809150509250929050565b6000806000606084860312156135f557600080fd5b833561360081613fe7565b9250602084013561361081613fe7565b929592945050506040919091013590565b600080600080600080600060e0888a03121561363c57600080fd5b873561364781613fe7565b9650602088013561365781613fe7565b95506040880135945060608801359350608088013560ff8116811461367b57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156136ab57600080fd5b82356136b681613fe7565b946020939093013593505050565b6000602082840312156136d657600080fd5b8135612d1781613ffc565b6000602082840312156136f357600080fd5b8151612d1781613ffc565b60006020828403121561371057600080fd5b5035919050565b6000806040838503121561372a57600080fd5b8235915060208301356135d581613fe7565b60006020828403121561374e57600080fd5b81356001600160e01b031981168114612d1757600080fd5b60006020828403121561377857600080fd5b813567ffffffffffffffff81111561378f57600080fd5b82016101608185031215612d1757600080fd5b600060a082840312156137b457600080fd5b60405160a0810181811067ffffffffffffffff821117156137d7576137d7613f02565b806040525082358152602083013560208201526040830135604082015260608301356060820152608083013561380c8161400a565b60808201529392505050565b60006020828403121561382a57600080fd5b5051919050565b60006020828403121561384357600080fd5b8151612d178161400a565b8051825260208101516020830152604081015160408301526060810151606083015263ffffffff60808201511660808301525050565b600080835481600182811c9150808316806138a057607f831692505b60208084108214156138c057634e487b7160e01b86526022600452602486fd5b8180156138d457600181146138e557613912565b60ff19861689528489019650613912565b60008a81526020902060005b8681101561390a5781548b8201529085019083016138f1565b505084890196505b509498975050505050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613958816017850160208801613db5565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613989816028840160208801613db5565b01602801949350505050565b6020808252825182820181905260009190848201906040850190845b818110156139e457835180516001600160a01b0316845260209081015190840152604083019385019392506001016139b1565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156139e457835183529284019291840191600101613a0c565b6020815260008251806020840152613a47816040850160208701613db5565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602080835261018083018451828501528185015160408501526040850151606085015260608501516080850152608085015160a085015260a0850151613adb60c086018261384e565b5060c0850151610160858101528051918290528201906000906101a08601905b80831015613b3257835180516001600160a01b03168352602090810151908301526040820191508484019350600183019250613afb565b509695505050505050565b60a08101610ed2828461384e565b600061014082019050878252866020830152856040830152846060830152836080830152613b7c60a083018461384e565b979650505050505050565b6000808335601e19843603018112613b9e57600080fd5b83018035915067ffffffffffffffff821115613bb957600080fd5b6020019150600681901b3603821315613bd157600080fd5b9250929050565b60008219821115613beb57613beb613ec0565b500190565b600082613bff57613bff613ed6565b600160ff1b821460001984141615613c1957613c19613ec0565b500590565b600082613c2d57613c2d613ed6565b500490565b60006001600160ff1b0381841382841380821686840486111615613c5857613c58613ec0565b600160ff1b6000871282811687830589121615613c7757613c77613ec0565b60008712925087820587128484161615613c9357613c93613ec0565b87850587128184161615613ca957613ca9613ec0565b505050929093029392505050565b6000816000190483118215151615613cd157613cd1613ec0565b500290565b600082821015613ce857613ce8613ec0565b500390565b68010000000000000000831115613d0657613d06613f02565b805483825580841015613d78576001600160ff1b036001818311811615613d2f57613d2f613ec0565b818611811615613d4157613d41613ec0565b60008481526020812090925086821b81019084831b015b80821015613d73578382558383830155600282019150613d58565b505050505b5060008181526020812083915b85811015613dad57613d978383613fb1565b6040929092019160029190910190600101613d85565b505050505050565b60005b83811015613dd0578181015183820152602001613db8565b83811115613ddf576000848401525b50505050565b600081613df457613df4613ec0565b506000190190565b600181811c90821680613e1057607f821691505b60208210811415611e2b57634e487b7160e01b600052602260045260246000fd5b600062ffffff80831681811415613e4a57613e4a613ec0565b6001019392505050565b6000600019821415613e6857613e68613ec0565b5060010190565b600060ff821660ff811415613e8657613e86613ec0565b60010192915050565b600082613e9e57613e9e613ed6565b500690565b6000600160ff1b821415613eb957613eb9613ec0565b5060000390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b813581556020820135600182015560408201356002820155606082013560038201556080820135600482015560a0820135600582015560c0820135600682015560e08201356007820155610100820135600882015560098101610120830135613f808161400a565b815463ffffffff191663ffffffff91909116179055613fa3610140830183613b87565b613ddf8183600a8601613ced565b8135613fbc81613fe7565b81546001600160a01b0319166001600160a01b03919091161781556020919091013560019190910155565b6001600160a01b038116811461152857600080fd5b801515811461152857600080fd5b63ffffffff8116811461152857600080fdfed8858e8e1664cbc67331ed60d855ac6de277d6d376c33d6c92ffec5836524871ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a264697066735822122096e3181dc366cff69158701a4b25cc3eefa038121f04d47414dd7060a54a8fa864736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cf322b554b6cfb668221d5b1979b6e4e58ab4dbc00000000000000000000000057d06bb1e3b60c875cd3a4445a53217f9b44d390000000000000000000000000cf185cb08c62ff969d258fba18f92dabb278a8a9
-----Decoded View---------------
Arg [0] : _owner (address): 0xcf322b554b6cfb668221d5b1979b6e4e58ab4dbc
Arg [1] : _asset (address): 0x57d06bb1e3b60c875cd3a4445a53217f9b44d390
Arg [2] : _multiplierNFT (address): 0xcf185cb08c62ff969d258fba18f92dabb278a8a9
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000cf322b554b6cfb668221d5b1979b6e4e58ab4dbc
Arg [1] : 00000000000000000000000057d06bb1e3b60c875cd3a4445a53217f9b44d390
Arg [2] : 000000000000000000000000cf185cb08c62ff969d258fba18f92dabb278a8a9
Deployed ByteCode Sourcemap
122247:13606:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89966:204;;;;;;;;;;-1:-1:-1;89966:204:0;;;;;:::i;:::-;;:::i;:::-;;;11162:14:1;;11155:22;11137:41;;11125:2;11110:18;89966:204:0;;;;;;;;109952:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;119132:214::-;;;;;;;;;;-1:-1:-1;119132:214:0;;;;;:::i;:::-;;:::i;122392:72::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;122392:72:0;;;;;11335:25:1;;;11323:2;11308:18;122392:72:0;11189:177:1;113254:103:0;;;;;;;;;;;;;:::i;113975:113::-;;;;;;;;;;-1:-1:-1;113975:113:0;;;;;:::i;:::-;-1:-1:-1;;;;;114063:17:0;114036:7;114063:17;;;:12;:17;;;;;;;113975:113;134721:1129;;;;;;;;;;-1:-1:-1;134721:1129:0;;;;;:::i;:::-;;:::i;:::-;;117241:513;;;;;;;;;;-1:-1:-1;117241:513:0;;;;;:::i;:::-;;:::i;91802:131::-;;;;;;;;;;-1:-1:-1;91802:131:0;;;;;:::i;:::-;91876:7;91903:12;;;:6;:12;;;;;;;;:22;;;91802:131;127351:147;;;;;;;;;;-1:-1:-1;127351:147:0;;;;;:::i;:::-;;:::i;126741:299::-;;;;;;;;;;-1:-1:-1;126741:299:0;;;;;:::i;:::-;;:::i;92195:147::-;;;;;;;;;;-1:-1:-1;92195:147:0;;;;;:::i;:::-;;:::i;129269:1966::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;108822:170::-;;;;;;;;;;;;108873:119;108822:170;;110896:91;;;;;;;;;;-1:-1:-1;110970:9:0;;110896:91;;110970:9;;;;21031:36:1;;21019:2;21004:18;110896:91:0;20889:184:1;133741:110:0;;;;;;;;;;-1:-1:-1;133741:110:0;;;;;:::i;:::-;;:::i;114650:464::-;;;;;;;;;;;;;:::i;93243:218::-;;;;;;;;;;-1:-1:-1;93243:218:0;;;;;:::i;:::-;;:::i;122330:20::-;;;;;;;;;;-1:-1:-1;122330:20:0;;;;-1:-1:-1;;;;;122330:20:0;;;;;;-1:-1:-1;;;;;8967:32:1;;;8949:51;;8937:2;8922:18;122330:20:0;8803:203:1;119719:406:0;;;;;;;;;;-1:-1:-1;119719:406:0;;;;;:::i;:::-;;:::i;122471:41::-;;;;;;;;;;;;;;;124021:54;;;;;;;;;;-1:-1:-1;124021:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20289:25:1;;;20345:2;20330:18;;20323:34;;;;20373:18;;;20366:34;;;;20431:2;20416:18;;20409:34;20474:3;20459:19;;20452:35;20518:3;20503:19;;20496:35;20276:3;20261:19;124021:54:0;20002:535:1;123103:32:0;;;;;;;;;;;;;;;;125233:170;;;;;;;;;;-1:-1:-1;125233:170:0;;;;;:::i;:::-;;:::i;122357:28::-;;;;;;;;;;-1:-1:-1;122357:28:0;;;;-1:-1:-1;;;;;122357:28:0;;;122754:60;;;;;;;;;;;;;;;;122981:59;;;;;;;;;;;;;;;;122686:61;;;;;;;;;;;;;;;;122878:57;;;;;;;;;;;;;;;;113607:105;;;;;;;;;;-1:-1:-1;113607:105:0;;;;;:::i;:::-;;:::i;97073:103::-;;;;;;;;;;;;;:::i;123142:31::-;;;;;;;;;;;;;;;;108596:44;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;108596:44:0;;;;;125751:116;;;;;;;;;;-1:-1:-1;125751:116:0;;;;;:::i;:::-;;:::i;114354:97::-;;;;;;;;;;-1:-1:-1;114354:97:0;;;;;:::i;:::-;-1:-1:-1;;;;;114431:12:0;114404:7;114431:12;;;:7;:12;;;;;;;114354:97;117967:523;;;;;;;;;;-1:-1:-1;117967:523:0;;;;;:::i;:::-;;:::i;111115:179::-;;;;;;;;;;-1:-1:-1;111115:179:0;;;;;:::i;:::-;;:::i;96422:87::-;;;;;;;;;;-1:-1:-1;96468:7:0;96495:6;-1:-1:-1;;;;;96495:6:0;96422:87;;107279:29;;;;;;;;;;-1:-1:-1;107279:29:0;;;;-1:-1:-1;;;;;107279:29:0;;;90262:147;;;;;;;;;;-1:-1:-1;90262:147:0;;;;;:::i;:::-;;:::i;110162:95::-;;;;;;;;;;;;;:::i;127198:145::-;;;;;;;;;;-1:-1:-1;127198:145:0;;;;;:::i;:::-;;:::i;89367:49::-;;;;;;;;;;-1:-1:-1;89367:49:0;89412:4;89367:49;;123180:32;;;;;;;;;;;;;;;;116094:402;;;;;;;;;;-1:-1:-1;116094:402:0;;;;;:::i;:::-;;:::i;120387:494::-;;;;;;;;;;-1:-1:-1;120387:494:0;;;;;:::i;:::-;;:::i;127506:646::-;;;;;;;;;;-1:-1:-1;127506:646:0;;;;;:::i;:::-;;:::i;124138:51::-;;;;;;;;;;-1:-1:-1;124138:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;126114:199;;;;;;;;;;-1:-1:-1;126114:199:0;;;;;:::i;:::-;;:::i;115331:178::-;;;;;;;;;;-1:-1:-1;115331:178:0;;;;;:::i;:::-;;:::i;114156:97::-;;;;;;;;;;-1:-1:-1;114235:10:0;;114156:97;;122942:32;;;;;;;;;;;;;;;;131758:144;;;;;;;;;;-1:-1:-1;131758:144:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;122821:50::-;;;;;;;;;;-1:-1:-1;122821:50:0;;;;-1:-1:-1;;;;;122821:50:0;;;127048:142;;;;;;;;;;-1:-1:-1;127048:142:0;;;;;:::i;:::-;;:::i;123252:32::-;;;;;;;;;;-1:-1:-1;123252:32:0;;;;;;;;;;;131910:1823;;;;;;;;;;-1:-1:-1;131910:1823:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;121271:888::-;;;;;;;;;;-1:-1:-1;121271:888:0;;;;;:::i;:::-;;:::i;92587:149::-;;;;;;;;;;-1:-1:-1;92587:149:0;;;;;:::i;:::-;;:::i;126321:148::-;;;;;;;;;;-1:-1:-1;126321:148:0;;;;;:::i;:::-;;:::i;123047:49::-;;;;;;;;;;;;;;;;126477:256;;;;;;;;;;-1:-1:-1;126477:256:0;;;;;:::i;:::-;;:::i;128160:1099::-;;;;;;;;;;-1:-1:-1;128160:1099:0;;;;;:::i;:::-;;:::i;123221:24::-;;;;;;;;;;-1:-1:-1;123221:24:0;;;;;;;;133859:102;;;;;;;;;;;;;:::i;116803:176::-;;;;;;;;;;-1:-1:-1;116803:176:0;;;;;:::i;:::-;-1:-1:-1;;;;;116937:25:0;;;116905:7;116937:25;;;:17;:25;;;;;;;;:34;;;;;;;;;;;;;116803:176;108647:168;;;;;;;;;;;;108696:119;108647:168;;125875:231;;;;;;;;;;-1:-1:-1;125875:231:0;;;;;:::i;:::-;;:::i;124082:49::-;;;;;;;;;;-1:-1:-1;124082:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;97331:201::-;;;;;;;;;;-1:-1:-1;97331:201:0;;;;;:::i;:::-;;:::i;131557:193::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;125411:179::-;;;;;;;;;;-1:-1:-1;125411:179:0;;;;;:::i;:::-;;:::i;125598:145::-;;;;;;;;;;-1:-1:-1;125598:145:0;;;;;:::i;:::-;;:::i;89966:204::-;90051:4;-1:-1:-1;;;;;;90075:47:0;;-1:-1:-1;;;90075:47:0;;:87;;-1:-1:-1;;;;;;;;;;9815:40:0;;;90126:36;90068:94;89966:204;-1:-1:-1;;89966:204:0:o;109952:91::-;109997:13;110030:5;110023:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;109952:91;:::o;119132:214::-;119234:10;119199:4;119216:29;;;:17;:29;;;;;;;;-1:-1:-1;;;;;119216:38:0;;;;;;;;;;:46;;;119280:36;119199:4;;119216:38;;-1:-1:-1;;;;;;;;;;;119280:36:0;;;119257:5;11335:25:1;;11323:2;11308:18;;11189:177;119280:36:0;;;;;;;;-1:-1:-1;119334:4:0;119132:214;;;;:::o;113254:103::-;113300:7;113327:22;:20;:22::i;:::-;113320:29;;113254:103;:::o;134721:1129::-;-1:-1:-1;;;;;;;;;;;89858:16:0;89869:4;89858:10;:16::i;:::-;134846:9:::1;134841:488;134865:19;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;:26;;134861:1;:30;134841:488;;;134920:5;::::0;-1:-1:-1;;;;;134920:5:0::1;134913:22;134936:19;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;134956:1;134936:22;;;;;;;:::i;:::-;:36;::::0;::::1;:22;::::0;;::::1;;:36:::0;;::::1;::::0;-1:-1:-1;134936:36:0::1;:::i;:::-;134974:19;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;134994:1;134974:22;;;;;;;:::i;:::-;;;;;;:35;;;134913:97;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;9583:32:1;;;;9565:51;;9647:2;9632:18;;9625:34;9553:2;9538:18;;9391:274;134913:97:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;135181:19:0::1;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;135201:1;135181:22;;;;;;;:::i;:::-;;;;;;:35;;;135112:15;:53;135128:11;:19;;;;;;;;:::i;:::-;135148:1;135128:22;;;;;;;:::i;:::-;:36;::::0;::::1;:22;::::0;;::::1;;:36:::0;;::::1;::::0;-1:-1:-1;135128:36:0::1;:::i;:::-;-1:-1:-1::0;;;;;135112:53:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;135112:53:0;:66;:104:::1;::::0;;::::1;:::i;:::-;135025:15;:53;135041:19;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;135061:1;135041:22;;;;;;;:::i;:::-;:36;::::0;::::1;:22;::::0;;::::1;;:36:::0;;::::1;::::0;-1:-1:-1;135041:36:0::1;:::i;:::-;-1:-1:-1::0;;;;;135025:53:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;135025:53:0;:191;135243:19:::1;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;135263:1;135243:22;;;;;;;:::i;:::-;:36;::::0;::::1;:22;::::0;;::::1;;:36:::0;;::::1;::::0;-1:-1:-1;135243:36:0::1;:::i;:::-;-1:-1:-1::0;;;;;135236:81:0::1;;135281:19;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;135301:1;135281:22;;;;;;;:::i;:::-;;;;;;:35;;;135236:81;;;;11335:25:1::0;;11323:2;11308:18;;11189:177;135236:81:0::1;;;;;;;;134893:3:::0;::::1;::::0;::::1;:::i;:::-;;;;134841:488;;;;135367:54;135375:12;135396:11;:23;;;135367:7;:54::i;:::-;-1:-1:-1::0;135477:22:0::1;::::0;::::1;;:26:::0;135474:187:::1;;135527:5;::::0;135520:52:::1;::::0;-1:-1:-1;;;135520:52:0;;107682:42:::1;135520:52;::::0;::::1;9565:51:1::0;135549:22:0::1;::::0;::::1;;9632:18:1::0;;;9625:34;-1:-1:-1;;;;;135527:5:0;;::::1;::::0;135520:22:::1;::::0;9538:18:1;;135520:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;135627:11;:22;;;135607:17;;:42;;;;:::i;:::-;135587:17;:62:::0;135474:187:::1;135718:16;::::0;135706:29:::1;::::0;;;:11:::1;:29;::::0;;;;135738:11;;135706:43:::1;135738:11:::0;135706:29;:43:::1;:::i;:::-;-1:-1:-1::0;;135772:16:0::1;::::0;135790:21:::1;135767:45:::0;;135790:21;;::::1;;::::0;135772:16;135767:45:::1;::::0;;;::::1;135824:16;:18:::0;;;:16:::1;:18;::::0;::::1;:::i;:::-;;;;;;134721:1129:::0;;:::o;117241:513::-;117375:4;117362:2;-1:-1:-1;;;;;107563:18:0;;107555:27;;;;;;-1:-1:-1;;;;;107601:19:0;;107615:4;107601:19;;107593:28;;;;;;-1:-1:-1;;;;;117430:23:0;::::1;;::::0;;;:17:::1;:23;::::0;;;;;;;117468:10:::1;117430:59:::0;;;;;;;;:70:::1;::::0;117494:5;117430:63:::1;:70::i;:::-;-1:-1:-1::0;;;;;117392:23:0;::::1;;::::0;;;:17:::1;:23;::::0;;;;;;;117416:10:::1;117392:35:::0;;;;;;;:108;;;;117540:16:::1;::::0;117530:27:::1;::::0;:5;;:9:::1;:27::i;:::-;-1:-1:-1::0;;;;;117589:18:0;::::1;;::::0;;;:12:::1;:18;::::0;;;;;117511:46;;-1:-1:-1;117589:32:0::1;::::0;117511:46;117589:22:::1;:32::i;:::-;-1:-1:-1::0;;;;;117568:18:0;;::::1;;::::0;;;:12:::1;:18;::::0;;;;;:53;;;;117651:16;;::::1;::::0;;;;:30:::1;::::0;117672:8;117651:20:::1;:30::i;:::-;-1:-1:-1::0;;;;;117632:16:0;;::::1;;::::0;;;:12:::1;:16;::::0;;;;;;:49;;;;117699:25;;;;::::1;::::0;-1:-1:-1;;;;;;;;;;;117699:25:0;::::1;::::0;117718:5;11335:25:1;;11323:2;11308:18;;11189:177;117699:25:0::1;;;;;;;;-1:-1:-1::0;117742:4:0::1;::::0;117241:513;-1:-1:-1;;;;;117241:513:0:o;127351:147::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;;;;;;;;;127452:38:::1;-1:-1:-1::0;;;;;;;;;;;127482:7:0::1;127452:11;:38::i;:::-;127351:147:::0;:::o;126741:299::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;122633:7:::1;126888:22;;126873:12;;:37;;;;:::i;:::-;126872:51;;126864:109;;;::::0;-1:-1:-1;;;126864:109:0;;15626:2:1;126864:109:0::1;::::0;::::1;15608:21:1::0;15665:2;15645:18;;;15638:30;15704:34;15684:18;;;15677:62;-1:-1:-1;;;15755:18:1;;;15748:43;15808:19;;126864:109:0::1;15424:409:1::0;126864:109:0::1;126984:22;:48:::0;126741:299::o;92195:147::-;91876:7;91903:12;;;:6;:12;;;;;;;;:22;;89858:16;89869:4;89858:10;:16::i;:::-;92309:25:::1;92320:4;92326:7;92309:10;:25::i;:::-;92195:147:::0;;;:::o;129269:1966::-;129318:17;;:::i;:::-;129348:35;129399:12;;129386:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;129386:26:0;;;;;;;;;;;;;;;-1:-1:-1;129348:64:0;-1:-1:-1;129423:27:0;;129526:1;129423:27;;;129657:17;:15;:17::i;:::-;129634:40;;129687:31;129721:53;129755:8;129721:19;:53::i;:::-;129687:87;;129787:17;129861:22;:20;:22::i;:::-;129814:5;;129807:38;;-1:-1:-1;;;129807:38:0;;129839:4;129807:38;;;8949:51:1;-1:-1:-1;;;;;129814:5:0;;;;129807:23;;8922:18:1;;129807:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:76;;;;:::i;:::-;129787:96;;129894:23;129973:12;;122633:7;129935:22;;129923:9;:34;;;;:::i;:::-;129922:47;;;;:::i;:::-;129921:64;;;;:::i;:::-;129894:92;;129997:18;122633:7;130031:12;;130019:9;:24;;;;:::i;:::-;130018:37;;;;:::i;:::-;129997:58;;130066:34;130176:10;130160:12;;130129:15;:43;;;;:::i;:::-;130103:70;;:9;:70;:::i;:::-;:83;;;;:::i;:::-;130066:120;;130199:840;130230:12;;130206:21;:36;;;130199:840;;;130287:9;130259:37;;130399:60;130415:22;130438:19;130415:43;;;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;130415:43:0;130399:15;:60::i;:::-;130354:105;;:25;:105;:::i;:::-;130311:148;;130556:25;130498:14;130513:21;130498:37;;;;;;;;;;:::i;:::-;;;;;;;:83;;:168;;;;;130643:23;130602:14;130617:21;130602:37;;;;;;;;;;:::i;:::-;;;;;;;:64;;130498:168;130476:552;;;130746:108;;;;;;;;130753:22;130798:19;130753:83;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;130753:83:0;130746:108;;;;;;130701:42;;:19;;:42;;;;;;;;;;:::i;:::-;;;;;;:153;;;;130873:23;;;;;:::i;:::-;;;;130199:840;;130476:552;130937:21;;;;:::i;:::-;;;;130989:23;130977:35;;130199:840;;;131076:127;;;;;;;;131087:16;;131076:127;;131105:15;131076:127;;;;;;;;;;;;;;;;;;;-1:-1:-1;131076:127:0;;;;;;;-1:-1:-1;131076:127:0;;;;;;;-1:-1:-1;131076:127:0;;129269:1966;-1:-1:-1;;;;;129269:1966:0:o;133741:110::-;133796:7;133823:20;133839:3;133823:15;:20::i;114650:464::-;114699:7;114719:15;114780:9;114769:20;;108696:119;114943:5;114927:23;;;;;;:::i;:::-;;;;;;;;;;114989:15;;;;;;;;-1:-1:-1;;;114989:15:0;;;;;114858:233;;;;;12226:25:1;;;;12267:18;;12260:34;;;;114973:33:0;12310:18:1;;;12303:34;12353:18;;;12346:34;;;115067:4:0;12396:19:1;;;12389:61;12198:19;;114858:233:0;;;;;;;;;;;;114830:276;;;;;;114810:296;;;114650:464;:::o;93243:218::-;-1:-1:-1;;;;;93339:23:0;;87255:10;93339:23;93331:83;;;;-1:-1:-1;;;93331:83:0;;17568:2:1;93331:83:0;;;17550:21:1;17607:2;17587:18;;;17580:30;17646:34;17626:18;;;17619:62;-1:-1:-1;;;17697:18:1;;;17690:45;17752:19;;93331:83:0;17366:411:1;93331:83:0;93427:26;93439:4;93445:7;93427:11;:26::i;:::-;93243:218;;:::o;119719:406::-;119898:10;119817:4;119880:29;;;:17;:29;;;;;;;;-1:-1:-1;;;;;119880:62:0;;;;;;;;;;:78;;119947:10;119880:66;:78::i;:::-;119857:10;119839:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;119839:38:0;;;;;;;;;;;;:119;;;119976;11335:25:1;;;119839:38:0;;-1:-1:-1;;;;;;;;;;;119976:119:0;11308:18:1;119976:119:0;11189:177:1;125233:170:0;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;125353:19:::1;:42:::0;125233:170::o;113607:105::-;113662:7;113689:15;113700:3;113689:10;:15::i;97073:103::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;97138:30:::1;97165:1;97138:18;:30::i;:::-;97073:103::o:0;125751:116::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;125831:12:::1;:28:::0;;-1:-1:-1;;125831:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;125751:116::o;117967:523::-;118082:4;118060:2;-1:-1:-1;;;;;107563:18:0;;107555:27;;;;;;-1:-1:-1;;;;;107601:19:0;;107615:4;107601:19;;107593:28;;;;;;-1:-1:-1;;;;;118123:18:0;::::1;118104:16;118123:18:::0;;;:12:::1;:18;::::0;;;;;118181:16:::1;::::0;118123:18;;118104:16;118168:30:::1;::::0;118123:18;;118168:12:::1;:30::i;:::-;-1:-1:-1::0;;;;;118249:23:0;::::1;;::::0;;;:17:::1;:23;::::0;;;;;;;118287:10:::1;118249:59:::0;;;;;;;;118152:46;;-1:-1:-1;118249:70:0::1;::::0;118152:46;118249:63:::1;:70::i;:::-;-1:-1:-1::0;;;;;118211:23:0;;::::1;;::::0;;;:17:::1;:23;::::0;;;;;;;118235:10:::1;118211:35:::0;;;;;;;:108;;;;118339:18;;;:12:::1;:18:::0;;;;;;118332:25;;;118387:16;;::::1;::::0;;;;:30:::1;::::0;118408:8;118387:20:::1;:30::i;:::-;-1:-1:-1::0;;;;;118368:16:0;;::::1;;::::0;;;:12:::1;:16;::::0;;;;;;:49;;;;118435:25;;;;::::1;::::0;-1:-1:-1;;;;;;;;;;;118435:25:0;::::1;::::0;118454:5;11335:25:1;;11323:2;11308:18;;11189:177;111115:179:0;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;111197:14:::1;:32:::0;;-1:-1:-1;;;;;;111197:32:0::1;-1:-1:-1::0;;;;;111197:32:0;::::1;::::0;;::::1;::::0;;;111245:41:::1;::::0;8949:51:1;;;111245:41:0::1;::::0;8937:2:1;8922:18;111245:41:0::1;;;;;;;111115:179:::0;:::o;90262:147::-;90348:4;90372:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;90372:29:0;;;;;;;;;;;;;;;90262:147::o;110162:95::-;110209:13;110242:7;110235:14;;;;;:::i;127198:145::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;127298:37:::1;-1:-1:-1::0;;;;;;;;;;;127327:7:0::1;127298:10;:37::i;116094:402::-:0;116191:4;116169:2;-1:-1:-1;;;;;107563:18:0;;107555:27;;;;;;-1:-1:-1;;;;;107601:19:0;;107615:4;107601:19;;107593:28;;;;;;116245:10:::1;116213:16;116232:24:::0;;;:12:::1;:24;::::0;;;;;116296:16:::1;::::0;116232:24;;116213:16;116283:30:::1;::::0;116232:24;;116283:12:::1;:30::i;:::-;116346:10;116333:24;::::0;;;:12:::1;:24;::::0;;;;;116326:31;;;-1:-1:-1;;;;;116387:16:0;::::1;::::0;;;;;116267:46;;-1:-1:-1;116387:30:0::1;::::0;116408:8;116387:20:::1;:30::i;:::-;-1:-1:-1::0;;;;;116368:16:0;::::1;;::::0;;;:12:::1;:16;::::0;;;;;;:49;;;;116435:31;;116444:10:::1;::::0;-1:-1:-1;;;;;;;;;;;116435:31:0;::::1;::::0;116460:5;11335:25:1;;11323:2;11308:18;;11189:177;116435:31:0::1;;;;;;;;116484:4;116477:11;;;;107632:1;116094:402:::0;;;;:::o;120387:494::-;120551:10;120492:4;120533:29;;;:17;:29;;;;;;;;-1:-1:-1;;;;;120533:38:0;;;;;;;;;;120624:27;;;;120623:91;;120685:29;:8;120698:15;120685:12;:29::i;:::-;120623:91;;;120668:1;120623:91;120600:10;120582:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;120582:38:0;;;;;;;;;;;;:132;;;120732:119;11335:25:1;;;120582:38:0;;-1:-1:-1;;;;;;;;;;;120732:119:0;11308:18:1;120732:119:0;;;;;;;-1:-1:-1;120869:4:0;;120387:494;-1:-1:-1;;;120387:494:0:o;127506:646::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;17208:2:1;2402:63:0;;;17190:21:1;17247:2;17227:18;;;17220:30;17286:33;17266:18;;;17259:61;17337:18;;2402:63:0;17006:355:1;2402:63:0;1812:1;2543:7;:18;124570:12:::1;::::0;::::1;;:20;;:12:::0;:20:::1;124562:66;;;::::0;-1:-1:-1;;;124562:66:0;;16401:2:1;124562:66:0::1;::::0;::::1;16383:21:1::0;16440:2;16420:18;;;16413:30;16479:34;16459:18;;;16452:62;-1:-1:-1;;;16530:18:1;;;16523:31;16571:19;;124562:66:0::1;16199:397:1::0;124562:66:0::1;87255:10:::0;127630:32:::2;107682:42;87255:10:::0;127654:7;127630:9:::2;:32::i;:::-;-1:-1:-1::0;127680:5:0::2;::::0;127673:58:::2;::::0;-1:-1:-1;;;127673:58:0;;-1:-1:-1;;;;;9269:15:1;;;127673:58:0::2;::::0;::::2;9251:34:1::0;127716:4:0::2;9301:18:1::0;;;9294:43;9353:18;;;9346:34;;;127680:5:0;;::::2;::::0;127673:26:::2;::::0;9186:18:1;;127673:58:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;127742:23:0;::::2;;::::0;;;:15:::2;:23;::::0;;;;127784:15:::2;127742:39;::::0;::::2;:57:::0;127810:41:::2;;:52:::0;;127855:7;;127742:23;127810:52:::2;::::0;127855:7;;127810:52:::2;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;127878:27:0;::::2;;::::0;;;:19:::2;:27;::::0;;;;;::::2;;127873:272;;127942:17;::::0;:21:::2;::::0;127962:1:::2;127942:21;:::i;:::-;127922:17;:41:::0;-1:-1:-1;;;;;127978:27:0;::::2;;::::0;;;:19:::2;:27;::::0;;;;;;;:34;;-1:-1:-1;;127978:34:0::2;128008:4;127978:34:::0;;::::2;::::0;;;128027:15:::2;:23:::0;;;;;128068:15:::2;128027:38;::::0;;::::2;:56:::0;128098:22:::2;:35:::0;;;;::::2;::::0;;;;;;::::2;::::0;;-1:-1:-1;;;;;;128098:35:0::2;::::0;;::::2;::::0;;127873:272:::2;-1:-1:-1::0;;1768:1:0;2722:7;:22;127506:646::o;126114:199::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;126245:28:::1;:60:::0;;-1:-1:-1;;;;;;126245:60:0::1;-1:-1:-1::0;;;;;126245:60:0;;;::::1;::::0;;;::::1;::::0;;126114:199::o;115331:178::-;115440:4;115418:2;-1:-1:-1;;;;;107563:18:0;;107555:27;;;;;;-1:-1:-1;;;;;107601:19:0;;107615:4;107601:19;;107593:28;;;;;;115469:32:::1;115479:10;115491:2;115495:5;115469:9;:32::i;:::-;115462:39:::0;115331:178;-1:-1:-1;;;;115331:178:0:o;131758:144::-;131828:15;131863:11;:23;131875:10;131863:23;;;;;;;;;;;:31;;131856:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;131856:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;131758:144;;;:::o;127048:142::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;127154:12:::1;:28:::0;127048:142::o;131910:1823::-;131995:16;132067:12;;132046:5;:17;;;:33;;132024:121;;;;-1:-1:-1;;;132024:121:0;;15219:2:1;132024:121:0;;;15201:21:1;15258:2;15238:18;;;15231:30;15297:34;15277:18;;;15270:62;-1:-1:-1;;;15348:18:1;;;15341:36;15394:19;;132024:121:0;15017:402:1;132024:121:0;132240:31;132288:12;;132274:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;132274:27:0;;132240:61;;132312:17;132344:21;132380:913;132403:12;;132387:13;:28;132380:913;;;132432:11;;;;:::i;:::-;;;;132458:9;132851:5;:17;;;132871:1;132851:21;;;;:::i;:::-;132607:11;;132645:17;;;;;132689:15;;;;;132731:16;;;;132774;;;;132528:285;;;;132571:9;;132607:11;;132645:17;132774:16;132528:285;8520:19:1;;;8564:2;8555:12;;8548:28;;;;8601:2;8592:12;;8585:28;;;;8638:2;8629:12;;8622:28;8675:3;8666:13;;8659:29;8745:3;8723:16;-1:-1:-1;;;;;;8719:43:1;8713:3;8704:13;;8697:66;8788:3;8779:13;;8253:545;132528:285:0;;;;;;;;;;;;;132496:336;;;;;;132470:377;;:403;;;;:::i;:::-;132458:415;;132888:16;132932:9;132927:203;132951:14;:21;132947:1;:25;132927:203;;;133007:14;133022:1;133007:17;;;;;;;;:::i;:::-;;;;;;;133002:1;:22;132998:117;;;133063:4;133049:18;;133090:5;;132998:117;132974:3;;;;:::i;:::-;;;;132927:203;;;;133148:11;133144:60;;;133180:8;;;;133144:60;133250:1;133218:14;133233:13;133218:29;;;;;;;;:::i;:::-;;;;;;;;;;:33;133266:15;;;;:::i;:::-;;;;132417:876;;132380:913;;;133310:9;133305:387;133329:14;:21;133325:1;:25;133305:387;;;133377:9;133372:309;133396:14;:21;133392:1;:25;133372:309;;;133467:14;133482:1;133467:17;;;;;;;;:::i;:::-;;;;;;;133447:14;133462:1;133447:17;;;;;;;;:::i;:::-;;;;;;;:37;133443:223;;;133509:11;133523:14;133538:1;133523:17;;;;;;;;:::i;:::-;;;;;;;133509:31;;133583:14;133598:1;133583:17;;;;;;;;:::i;:::-;;;;;;;133563:14;133578:1;133563:17;;;;;;;;:::i;:::-;;;;;;:37;;;;;133643:3;133623:14;133638:1;133623:17;;;;;;;;:::i;:::-;;;;;;:23;;;;;133486:180;133443:223;133419:3;;;;:::i;:::-;;;;133372:309;;;-1:-1:-1;133352:3:0;;;;:::i;:::-;;;;133305:387;;;-1:-1:-1;133711:14:0;;131910:1823;-1:-1:-1;;;;131910:1823:0:o;121271:888::-;121498:8;121479:15;:27;;121471:36;;;;;;-1:-1:-1;;;;;121541:14:0;;;121520:18;121541:14;;;:7;:14;;;;;;;;;121617:189;;108873:119;121617:189;;;11658:25:1;11737:18;;;11730:43;;;;11809:15;;;11789:18;;;11782:43;11841:18;;;11834:34;;;11884:19;;;11877:35;;;11928:19;;;;11921:35;;;121617:189:0;;;;;;;;;;11630:19:1;;;;121617:189:0;;121593:224;;;;;;;;;121898:18;:16;:18::i;:::-;121869:66;;-1:-1:-1;;;121869:66:0;;;7323:27:1;7366:11;;;7359:27;;;;7402:12;;;7395:28;;;7439:12;;121869:66:0;;;-1:-1:-1;;121869:66:0;;;;;;;;;121845:101;;121869:66;121845:101;;;;121976:26;;;;;;;;;12688:25:1;;;12761:4;12749:17;;12729:18;;;12722:45;;;;12783:18;;;12776:34;;;12826:18;;;12819:34;;;121845:101:0;-1:-1:-1;121976:26:0;;12660:19:1;;121976:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;121967:35:0;:5;-1:-1:-1;;;;;121967:35:0;;121959:44;;;;;;122033:17;:10;122048:1;122033:14;:17::i;:::-;-1:-1:-1;;;;;122016:14:0;;;;;;;:7;:14;;;;;;;;:34;;;;122063:17;:24;;;;;:33;;;;;;;;;;;;;:41;;;122120:31;;11335:25:1;;;122063:33:0;;122016:14;;-1:-1:-1;;;;;;;;;;;122120:31:0;11308:18:1;122120:31:0;;;;;;;121460:699;;;121271:888;;;;;;;:::o;92587:149::-;91876:7;91903:12;;;:6;:12;;;;;;;;:22;;89858:16;89869:4;89858:10;:16::i;:::-;92702:26:::1;92714:4;92720:7;92702:11;:26::i;126321:148::-:0;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;126430:13:::1;:31:::0;;-1:-1:-1;;;;;;126430:31:0::1;-1:-1:-1::0;;;;;126430:31:0;;;::::1;::::0;;;::::1;::::0;;126321:148::o;126477:256::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;122633:7:::1;126604:22;;126589:12;;:37;;;;:::i;:::-;126588:51;;126580:106;;;::::0;-1:-1:-1;;;126580:106:0;;14808:2:1;126580:106:0::1;::::0;::::1;14790:21:1::0;14847:2;14827:18;;;14820:30;14886:34;14866:18;;;14859:62;-1:-1:-1;;;14937:18:1;;;14930:40;14987:19;;126580:106:0::1;14606:406:1::0;126580:106:0::1;126697:12;:28:::0;126477:256::o;128160:1099::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;17208:2:1;2402:63:0;;;17190:21:1;17247:2;17227:18;;;17220:30;17286:33;17266:18;;;17259:61;17337:18;;2402:63:0;17006:355:1;2402:63:0;1812:1;2543:7;:18;87255:10;128293:7;128228:14:::1;128368:18;87255:10:::0;128368::::1;:18::i;:::-;128357:7;:29;;128349:78;;;::::0;-1:-1:-1;;;128349:78:0;;16803:2:1;128349:78:0::1;::::0;::::1;16785:21:1::0;16842:2;16822:18;;;16815:30;16881:34;16861:18;;;16854:62;-1:-1:-1;;;16932:18:1;;;16925:34;16976:19;;128349:78:0::1;16601:400:1::0;128349:78:0::1;128538:36;::::0;-1:-1:-1;;;;;128484:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;:38:::1;;::::0;128466:56:::1;::::0;:15:::1;:56;:::i;:::-;:108;128448:397;;;122633:7;128652:23;;128635:14;:40;;;;:::i;:::-;128634:70;;;;:::i;:::-;128601:103:::0;-1:-1:-1;128736:30:0::1;128601:103:::0;128736:14;:30:::1;:::i;:::-;128788:5;::::0;128719:47;;-1:-1:-1;;;;;;128788:5:0::1;128781:22;128804:7;96468::::0;96495:6;-1:-1:-1;;;;;96495:6:0;;96422:87;128804:7:::1;128781:46;::::0;-1:-1:-1;;;;;;128781:46:0::1;::::0;;;;;;-1:-1:-1;;;;;9583:32:1;;;128781:46:0::1;::::0;::::1;9565:51:1::0;9632:18;;;9625:34;;;9538:18;;128781:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;128448:397;128864:5;::::0;128857:46:::1;::::0;-1:-1:-1;;;128857:46:0;;-1:-1:-1;;;;;9583:32:1;;;128857:46:0::1;::::0;::::1;9565:51:1::0;9632:18;;;9625:34;;;128864:5:0;;::::1;::::0;128857:22:::1;::::0;9538:18:1;;128857:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;128914:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;:43:::1;::::0;::::1;:60:::0;;;129030:15:::1;128985:42;::::0;;::::1;:60:::0;129058:32:::1;128930:6:::0;107682:42:::1;129082:7:::0;129058:9:::1;:32::i;:::-;;129107:18;129118:6;129107:10;:18::i;:::-;129103:147;;-1:-1:-1::0;;;;;129147:27:0;::::1;129177:5;129147:27:::0;;;:19:::1;:27;::::0;;;;:35;;-1:-1:-1;;129147:35:0::1;::::0;;129217:17:::1;::::0;:21:::1;::::0;129147:35;;129217:21:::1;:::i;:::-;129197:17;:41:::0;129103:147:::1;-1:-1:-1::0;;1768:1:0;2722:7;:22;-1:-1:-1;;128160:1099:0:o;133859:102::-;133906:7;133933:20;:18;:20::i;125875:231::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;126022:36:::1;:76:::0;125875:231::o;97331:201::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;97420:22:0;::::1;97412:73;;;::::0;-1:-1:-1;;;97412:73:0;;14048:2:1;97412:73:0::1;::::0;::::1;14030:21:1::0;14087:2;14067:18;;;14060:30;14126:34;14106:18;;;14099:62;-1:-1:-1;;;14177:18:1;;;14170:36;14223:19;;97412:73:0::1;13846:402:1::0;97412:73:0::1;97496:28;97515:8;97496:18;:28::i;131557:193::-:0;131605:11;;:::i;:::-;131656:1;131637:16;;:20;131629:57;;;;-1:-1:-1;;;131629:57:0;;14455:2:1;131629:57:0;;;14437:21:1;14494:2;14474:18;;;14467:30;14533:26;14513:18;;;14506:54;14577:18;;131629:57:0;14253:348:1;131629:57:0;131704:11;:33;131735:1;131716:16;;:20;;;;:::i;:::-;131704:33;;;;;;;;;;;;;;-1:-1:-1;131704:33:0;131697:45;;;;;;;131704:38;;;131697:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;131557:193;-1:-1:-1;131557:193:0:o;125411:179::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;125532:23:::1;:50:::0;125411:179::o;125598:145::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;125691:20:::1;:44:::0;;;::::1;;;;-1:-1:-1::0;;125691:44:0;;::::1;::::0;;;::::1;::::0;;125598:145::o;97692:191::-;97766:16;97785:6;;-1:-1:-1;;;;;97802:17:0;;;-1:-1:-1;;;;;;97802:17:0;;;;;;97835:40;;97785:6;;;;;;;97835:40;;97766:16;97835:40;97755:128;97692:191;:::o;101903:98::-;101961:7;101988:5;101992:1;101988;:5;:::i;:::-;101981:12;101903:98;-1:-1:-1;;;101903:98:0:o;113365:121::-;113420:7;113462:16;107682:42;113462:10;:16::i;:::-;113447:12;;:31;;;;:::i;90713:105::-;90780:30;90791:4;87255:10;90780;:30::i;111562:1619::-;111650:7;111679:16;111675:118;;111727:5;111717:30;111734:12;;111717:30;;;;11335:25:1;;11323:2;11308:18;;11189:177;111717:30:0;;;;;;;;-1:-1:-1;111769:12:0;;111762:19;;111675:118;111819:213;112023:8;111819:185;111867:122;111935:34;111952:16;107682:42;111952:10;:16::i;:::-;111935:12;;;:16;:34::i;:::-;111874:12;;111867:34;;111892:8;111867:24;:34::i;:::-;:38;;:122::i;:::-;111819:11;;:29;:185::i;:213::-;111805:227;;112063:1;112049:11;:15;112045:193;;;112096:44;112121:17;:11;:15;:17::i;112096:44::-;112081:12;:59;112045:193;;;112188:12;;:38;;112213:11;112188:16;:38::i;:::-;112173:12;:53;112045:193;112254:12;;-1:-1:-1;;;;;;112250:83:0;;;-1:-1:-1;;;;;112296:12:0;:25;112250:83;112379:12;;112364:10;;:28;;:14;:28::i;:::-;112345:16;:47;113130:12;;113113:30;;11335:25:1;;;113123:5:0;;113113:30;;11323:2:1;11308:18;113113:30:0;;;;;;;-1:-1:-1;113161:12:0;;111562:1619;;;;:::o;101147:98::-;101205:7;101232:5;101236:1;101232;:5;:::i;101504:98::-;101562:7;101589:5;101593:1;101589;:5;:::i;100766:98::-;100824:7;100851:5;100855:1;100851;:5;:::i;95114:239::-;95198:22;95206:4;95212:7;95198;:22::i;:::-;95194:152;;;95269:5;95237:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;95237:29:0;;;;;;;;;;:37;;-1:-1:-1;;95237:37:0;;;95294:40;87255:10;;95237:12;;95294:40;;95269:5;95294:40;95114:239;;:::o;94744:238::-;94828:22;94836:4;94842:7;94828;:22::i;:::-;94823:152;;94867:12;;;;94899:4;94867:12;;;;;;;;-1:-1:-1;;;;;94867:29:0;;;;;;;;;;:36;;-1:-1:-1;;94867:36:0;;;;;;;94923:40;;87255:10;;94867:12;;94923:40;;94867:12;94923:40;94744:238;;:::o;131243:306::-;131292:11;;:::i;:::-;131323:218;;;;;;;;;131342:22;:29;131323:218;;;;;131386:20;:18;:20::i;:::-;131323:218;;131421:15;131323:218;;;;131451:16;131323:218;;;;;;;;131482:48;-1:-1:-1;;;131482:48:0;;131496:16;131482:48;;;20750:42:1;-1:-1:-1;20808:18:1;;;20801:34;131517:12:0;20851:18:1;;;20844:34;131323:218:0;;;;;-1:-1:-1;;;;;131482:6:0;:13;;;;20723:18:1;;131482:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;131323:218;;;;131316:225;131243:306;-1:-1:-1;131243:306:0:o;134252:461::-;134313:7;134333:14;134350:15;134361:3;134350:10;:15::i;:::-;134379:20;;134333:32;;-1:-1:-1;134379:20:0;;;;;134376:328;;;134441:13;;134433:37;;-1:-1:-1;;;134433:37:0;;-1:-1:-1;;;;;8967:32:1;;;134433:37:0;;;8949:51:1;134416:14:0;;134441:13;;134433:32;;8922:18:1;;134433:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;134416:54;-1:-1:-1;134488:11:0;134485:64;;-1:-1:-1;134527:6:0;134252:461;-1:-1:-1;;134252:461:0:o;134485:64::-;122633:7;;134616:6;122633:7;134582:19;;:30;;;;:::i;:::-;134581:41;;;;:::i;:::-;134580:54;;;;:::i;:::-;134570:65;;:6;:65;:::i;:::-;:76;;;;:::i;113720:130::-;113825:16;;-1:-1:-1;;;;;113803:17:0;;113776:7;113803:17;;;:12;:17;;;;;;113776:7;;113803:39;;:17;:21;:39::i;115517:374::-;115629:4;115646:16;115665:27;115675:16;;115665:5;:9;;:27;;;;:::i;:::-;-1:-1:-1;;;;;115726:18:0;;;;;;:12;:18;;;;;;115646:46;;-1:-1:-1;115726:32:0;;115646:46;115726:22;:32::i;:::-;-1:-1:-1;;;;;115705:18:0;;;;;;;:12;:18;;;;;;:53;;;;115788:16;;;;;;;:30;;115809:8;115788:20;:30::i;:::-;-1:-1:-1;;;;;115769:16:0;;;;;;;:12;:16;;;;;;;:49;;;;115836:25;;;;;;-1:-1:-1;;;;;;;;;;;115836:25:0;;;115855:5;11335:25:1;;11323:2;11308:18;;11189:177;115836:25:0;;;;;;;;-1:-1:-1;115879:4:0;;115517:374;-1:-1:-1;;;;115517:374:0:o;133969:275::-;134022:7;;;134072:140;134096:22;:29;134092:33;;134072:140;;;134158:42;134174:22;134197:1;134174:25;;;;;;;;:::i;134158:42::-;134147:53;;;;:::i;:::-;;-1:-1:-1;134127:3:0;;;;:::i;:::-;;;;134072:140;;91108:505;91197:22;91205:4;91211:7;91197;:22::i;:::-;91192:414;;91385:41;91413:7;-1:-1:-1;;;;;91385:41:0;91423:2;91385:19;:41::i;:::-;91499:38;91527:4;91534:2;91499:19;:38::i;:::-;91290:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;91290:270:0;;;;;;;;;;-1:-1:-1;;;91236:358:0;;;;;;;:::i;83571:303::-;83627:6;;83657:5;83661:1;83657;:5;:::i;:::-;83646:16;-1:-1:-1;;;;83747:15:0;;;;:55;;-1:-1:-1;;;;83767:14:0;;;83787;;;83766:36;;83747:55;83739:64;;;;;;83823:6;;;83822:24;;-1:-1:-1;83844:1:0;83835:5;83839:1;83835;:5;:::i;:::-;:10;83822:24;83814:33;;;;;83969:259;84025:6;84112:1;-1:-1:-1;;84112:7:0;;:26;;;-1:-1:-1;;;;84123:15:0;;;84112:26;84104:35;;;;;;84215:5;84219:1;84215;:5;:::i;84851:129::-;84897:6;-1:-1:-1;;;84924:15:0;;;84916:24;;;;;;84962:1;84958;:5;:14;;84971:1;84958:14;;;84966:2;84967:1;84966:2;:::i;4425:451::-;4500:13;4526:19;4558:10;4562:6;4558:1;:10;:::i;:::-;:14;;4571:1;4558:14;:::i;:::-;4548:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4548:25:0;;4526:47;;-1:-1:-1;;;4584:6:0;4591:1;4584:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;4584:15:0;;;;;;;;;-1:-1:-1;;;4610:6:0;4617:1;4610:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;4610:15:0;;;;;;;;-1:-1:-1;4641:9:0;4653:10;4657:6;4653:1;:10;:::i;:::-;:14;;4666:1;4653:14;:::i;:::-;4641:26;;4636:135;4673:1;4669;:5;4636:135;;;-1:-1:-1;;;4721:5:0;4729:3;4721:11;4708:25;;;;;;;:::i;:::-;;;;4696:6;4703:1;4696:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;4696:37:0;;;;;;;;-1:-1:-1;4758:1:0;4748:11;;;;;4676:3;;;:::i;:::-;;;4636:135;;;-1:-1:-1;4789:10:0;;4781:55;;;;-1:-1:-1;;;4781:55:0;;13687:2:1;4781:55:0;;;13669:21:1;;;13706:18;;;13699:30;13765:34;13745:18;;;13738:62;13817:18;;4781:55:0;13485:356:1;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:388::-;334:6;342;395:2;383:9;374:7;370:23;366:32;363:52;;;411:1;408;401:12;363:52;450:9;437:23;469:31;494:5;469:31;:::i;:::-;519:5;-1:-1:-1;576:2:1;561:18;;548:32;589:33;548:32;589:33;:::i;:::-;641:7;631:17;;;266:388;;;;;:::o;659:456::-;736:6;744;752;805:2;793:9;784:7;780:23;776:32;773:52;;;821:1;818;811:12;773:52;860:9;847:23;879:31;904:5;879:31;:::i;:::-;929:5;-1:-1:-1;986:2:1;971:18;;958:32;999:33;958:32;999:33;:::i;:::-;659:456;;1051:7;;-1:-1:-1;;;1105:2:1;1090:18;;;;1077:32;;659:456::o;1120:829::-;1231:6;1239;1247;1255;1263;1271;1279;1332:3;1320:9;1311:7;1307:23;1303:33;1300:53;;;1349:1;1346;1339:12;1300:53;1388:9;1375:23;1407:31;1432:5;1407:31;:::i;:::-;1457:5;-1:-1:-1;1514:2:1;1499:18;;1486:32;1527:33;1486:32;1527:33;:::i;:::-;1579:7;-1:-1:-1;1633:2:1;1618:18;;1605:32;;-1:-1:-1;1684:2:1;1669:18;;1656:32;;-1:-1:-1;1740:3:1;1725:19;;1712:33;1789:4;1776:18;;1764:31;;1754:59;;1809:1;1806;1799:12;1754:59;1120:829;;;;-1:-1:-1;1120:829:1;;;;1832:7;1886:3;1871:19;;1858:33;;-1:-1:-1;1938:3:1;1923:19;;;1910:33;;1120:829;-1:-1:-1;;1120:829:1:o;1954:315::-;2022:6;2030;2083:2;2071:9;2062:7;2058:23;2054:32;2051:52;;;2099:1;2096;2089:12;2051:52;2138:9;2125:23;2157:31;2182:5;2157:31;:::i;:::-;2207:5;2259:2;2244:18;;;;2231:32;;-1:-1:-1;;;1954:315:1:o;2274:241::-;2330:6;2383:2;2371:9;2362:7;2358:23;2354:32;2351:52;;;2399:1;2396;2389:12;2351:52;2438:9;2425:23;2457:28;2479:5;2457:28;:::i;2520:245::-;2587:6;2640:2;2628:9;2619:7;2615:23;2611:32;2608:52;;;2656:1;2653;2646:12;2608:52;2688:9;2682:16;2707:28;2729:5;2707:28;:::i;2770:180::-;2829:6;2882:2;2870:9;2861:7;2857:23;2853:32;2850:52;;;2898:1;2895;2888:12;2850:52;-1:-1:-1;2921:23:1;;2770:180;-1:-1:-1;2770:180:1:o;2955:315::-;3023:6;3031;3084:2;3072:9;3063:7;3059:23;3055:32;3052:52;;;3100:1;3097;3090:12;3052:52;3136:9;3123:23;3113:33;;3196:2;3185:9;3181:18;3168:32;3209:31;3234:5;3209:31;:::i;3275:286::-;3333:6;3386:2;3374:9;3365:7;3361:23;3357:32;3354:52;;;3402:1;3399;3392:12;3354:52;3428:23;;-1:-1:-1;;;;;;3480:32:1;;3470:43;;3460:71;;3527:1;3524;3517:12;3566:391;3656:6;3709:2;3697:9;3688:7;3684:23;3680:32;3677:52;;;3725:1;3722;3715:12;3677:52;3765:9;3752:23;3798:18;3790:6;3787:30;3784:50;;;3830:1;3827;3820:12;3784:50;3853:22;;3909:3;3891:16;;;3887:26;3884:46;;;3926:1;3923;3916:12;3962:770;4044:6;4097:3;4085:9;4076:7;4072:23;4068:33;4065:53;;;4114:1;4111;4104:12;4065:53;4147:2;4141:9;4189:3;4181:6;4177:16;4259:6;4247:10;4244:22;4223:18;4211:10;4208:34;4205:62;4202:88;;;4270:18;;:::i;:::-;4310:10;4306:2;4299:22;;4358:9;4345:23;4337:6;4330:39;4430:2;4419:9;4415:18;4402:32;4397:2;4389:6;4385:15;4378:57;4496:2;4485:9;4481:18;4468:32;4463:2;4455:6;4451:15;4444:57;4562:2;4551:9;4547:18;4534:32;4529:2;4521:6;4517:15;4510:57;4617:3;4606:9;4602:19;4589:33;4631:30;4655:5;4631:30;:::i;:::-;4689:3;4677:16;;4670:31;4681:6;3962:770;-1:-1:-1;;;3962:770:1:o;4922:184::-;4992:6;5045:2;5033:9;5024:7;5020:23;5016:32;5013:52;;;5061:1;5058;5051:12;5013:52;-1:-1:-1;5084:16:1;;4922:184;-1:-1:-1;4922:184:1:o;5111:249::-;5180:6;5233:2;5221:9;5212:7;5208:23;5204:32;5201:52;;;5249:1;5246;5239:12;5201:52;5281:9;5275:16;5300:30;5324:5;5300:30;:::i;5607:330::-;5683:5;5677:12;5672:3;5665:25;5739:4;5732:5;5728:16;5722:23;5715:4;5710:3;5706:14;5699:47;5795:4;5788:5;5784:16;5778:23;5771:4;5766:3;5762:14;5755:47;5851:4;5844:5;5840:16;5834:23;5827:4;5822:3;5818:14;5811:47;5919:10;5911:4;5904:5;5900:16;5894:23;5890:40;5883:4;5878:3;5874:14;5867:64;;;5607:330::o;5942:1118::-;6072:3;6101:1;6134:6;6128:13;6164:3;6186:1;6214:9;6210:2;6206:18;6196:28;;6274:2;6263:9;6259:18;6296;6286:61;;6340:4;6332:6;6328:17;6318:27;;6286:61;6366:2;6414;6406:6;6403:14;6383:18;6380:38;6377:165;;;-1:-1:-1;;;6441:33:1;;6497:4;6494:1;6487:15;6527:4;6448:3;6515:17;6377:165;6558:18;6585:104;;;;6703:1;6698:337;;;;6551:484;;6585:104;-1:-1:-1;;6618:24:1;;6606:37;;6663:16;;;;-1:-1:-1;6585:104:1;;6698:337;21745:1;21738:14;;;21782:4;21769:18;;6810:1;6824:165;6838:6;6835:1;6832:13;6824:165;;;6916:14;;6903:11;;;6896:35;6959:16;;;;6853:10;;6824:165;;;6828:3;;7018:6;7013:3;7009:16;7002:23;;6551:484;-1:-1:-1;7051:3:1;;5942:1118;-1:-1:-1;;;;;;;;5942:1118:1:o;7462:786::-;7873:25;7868:3;7861:38;7843:3;7928:6;7922:13;7944:62;7999:6;7994:2;7989:3;7985:12;7978:4;7970:6;7966:17;7944:62;:::i;:::-;-1:-1:-1;;;8065:2:1;8025:16;;;8057:11;;;8050:40;8115:13;;8137:63;8115:13;8186:2;8178:11;;8171:4;8159:17;;8137:63;:::i;:::-;8220:17;8239:2;8216:26;;7462:786;-1:-1:-1;;;;7462:786:1:o;9670:685::-;9891:2;9943:21;;;10013:13;;9916:18;;;10035:22;;;9862:4;;9891:2;10114:15;;;;10088:2;10073:18;;;9862:4;10157:172;10171:6;10168:1;10165:13;10157:172;;;10262:13;;5466;;-1:-1:-1;;;;;5462:39:1;5450:52;;5552:4;5540:17;;;5534:24;5518:14;;;5511:48;5591:4;5582:14;;10304:15;;;;10220:61;-1:-1:-1;10193:1:1;10186:9;10157:172;;;-1:-1:-1;10346:3:1;;9670:685;-1:-1:-1;;;;;;9670:685:1:o;10360:632::-;10531:2;10583:21;;;10653:13;;10556:18;;;10675:22;;;10502:4;;10531:2;10754:15;;;;10728:2;10713:18;;;10502:4;10797:169;10811:6;10808:1;10805:13;10797:169;;;10872:13;;10860:26;;10941:15;;;;10906:12;;;;10833:1;10826:9;10797:169;;13097:383;13246:2;13235:9;13228:21;13209:4;13278:6;13272:13;13321:6;13316:2;13305:9;13301:18;13294:34;13337:66;13396:6;13391:2;13380:9;13376:18;13371:2;13363:6;13359:15;13337:66;:::i;:::-;13464:2;13443:15;-1:-1:-1;;13439:29:1;13424:45;;;;13471:2;13420:54;;13097:383;-1:-1:-1;;13097:383:1:o;15838:356::-;16040:2;16022:21;;;16059:18;;;16052:30;16118:34;16113:2;16098:18;;16091:62;16185:2;16170:18;;15838:356::o;17782:1186::-;17932:4;17961:2;17990;17979:9;17972:21;18031:3;18020:9;18016:19;18077:6;18071:13;18066:2;18055:9;18051:18;18044:41;18139:2;18131:6;18127:15;18121:22;18116:2;18105:9;18101:18;18094:50;18198:2;18190:6;18186:15;18180:22;18175:2;18164:9;18160:18;18153:50;18258:2;18250:6;18246:15;18240:22;18234:3;18223:9;18219:19;18212:51;18318:3;18310:6;18306:16;18300:23;18294:3;18283:9;18279:19;18272:52;18371:3;18363:6;18359:16;18353:23;18385:57;18437:3;18426:9;18422:19;18408:12;18385:57;:::i;:::-;-1:-1:-1;18491:3:1;18479:16;;18473:23;18515:6;18537:18;;;18530:30;18609:21;;18639:22;;;;18719:23;;;18760:1;;18692:3;18677:19;;;18770:172;18784:6;18781:1;18778:13;18770:172;;;18875:13;;5466;;-1:-1:-1;;;;;5462:39:1;5450:52;;5552:4;5540:17;;;5534:24;5518:14;;;5511:48;5591:4;5582:14;;18833:61;;18929:2;18921:6;18917:15;18907:25;;18806:1;18803;18799:9;18794:14;;18770:172;;;-1:-1:-1;18959:3:1;17782:1186;-1:-1:-1;;;;;;17782:1186:1:o;18973:240::-;19153:3;19138:19;;19166:41;19142:9;19189:6;19166:41;:::i;19400:597::-;19678:4;19720:3;19709:9;19705:19;19697:27;;19751:6;19740:9;19733:25;19794:6;19789:2;19778:9;19774:18;19767:34;19837:6;19832:2;19821:9;19817:18;19810:34;19880:6;19875:2;19864:9;19860:18;19853:34;19924:6;19918:3;19907:9;19903:19;19896:35;19940:51;19986:3;19975:9;19971:19;19963:6;19940:51;:::i;:::-;19400:597;;;;;;;;;:::o;21078:572::-;21198:4;21204:6;21264:11;21251:25;21358:2;21354:7;21343:8;21327:14;21323:29;21319:43;21299:18;21295:68;21285:96;;21377:1;21374;21367:12;21285:96;21404:33;;21456:20;;;-1:-1:-1;21499:18:1;21488:30;;21485:50;;;21531:1;21528;21521:12;21485:50;21564:4;21552:17;;-1:-1:-1;21615:1:1;21611:14;;;21595;21591:35;21581:46;;21578:66;;;21640:1;21637;21630:12;21578:66;21078:572;;;;;:::o;21798:128::-;21838:3;21869:1;21865:6;21862:1;21859:13;21856:39;;;21875:18;;:::i;:::-;-1:-1:-1;21911:9:1;;21798:128::o;21931:193::-;21970:1;21996;21986:35;;22001:18;;:::i;:::-;-1:-1:-1;;;22037:18:1;;-1:-1:-1;;22057:13:1;;22033:38;22030:64;;;22074:18;;:::i;:::-;-1:-1:-1;22108:10:1;;21931:193::o;22129:120::-;22169:1;22195;22185:35;;22200:18;;:::i;:::-;-1:-1:-1;22234:9:1;;22129:120::o;22254:553::-;22293:7;-1:-1:-1;;;;;22363:9:1;;;22391;;;22416:11;;;22435:10;;;22429:17;;22412:35;22409:61;;;22450:18;;:::i;:::-;-1:-1:-1;;;22526:1:1;22519:9;;22544:11;;;22564;;;22557:19;;22540:37;22537:63;;;22580:18;;:::i;:::-;22626:1;22623;22619:9;22609:19;;22673:1;22669:2;22664:11;22661:1;22657:19;22652:2;22648;22644:11;22640:37;22637:63;;;22680:18;;:::i;:::-;22745:1;22741:2;22736:11;22733:1;22729:19;22724:2;22720;22716:11;22712:37;22709:63;;;22752:18;;:::i;:::-;-1:-1:-1;;;22792:9:1;;;;;22254:553;-1:-1:-1;;;22254:553:1:o;22812:168::-;22852:7;22918:1;22914;22910:6;22906:14;22903:1;22900:21;22895:1;22888:9;22881:17;22877:45;22874:71;;;22925:18;;:::i;:::-;-1:-1:-1;22965:9:1;;22812:168::o;22985:125::-;23025:4;23053:1;23050;23047:8;23044:34;;;23058:18;;:::i;:::-;-1:-1:-1;23095:9:1;;22985:125::o;23115:1226::-;23264:20;23259:3;23256:29;23253:55;;;23288:18;;:::i;:::-;23337:4;23331:11;23364:3;23358:4;23351:17;23388:6;23383:3;23380:15;23377:586;;;-1:-1:-1;;;;;23445:1:1;23495:14;;;23487:23;;23484:49;;;23513:18;;:::i;:::-;23565:2;23560:3;23557:11;23553:2;23549:20;23546:46;;;23572:18;;:::i;:::-;23615:1;23629:16;;;23684:4;23670:19;;23615:1;;-1:-1:-1;23774:12:1;;;23764:23;;;23722:15;;;23712:26;23800:153;23818:2;23811:5;23808:13;23800:153;;;23893:2;23886:5;23879:17;23936:2;23931;23924:5;23920:14;23913:26;23844:1;23837:5;23833:13;23824:22;;23800:153;;;23804:3;;;;23377:586;-1:-1:-1;21745:1:1;21738:14;;;21782:4;21769:18;;23986:5;;24099:236;24113:3;24110:1;24107:10;24099:236;;;24159:81;24233:6;24220:11;24159:81;:::i;:::-;24275:2;24263:15;;;;;24323:1;24306:19;;;;;24132:1;24125:9;24099:236;;;24103:3;;;23115:1226;;;:::o;24346:258::-;24418:1;24428:113;24442:6;24439:1;24436:13;24428:113;;;24518:11;;;24512:18;24499:11;;;24492:39;24464:2;24457:10;24428:113;;;24559:6;24556:1;24553:13;24550:48;;;24594:1;24585:6;24580:3;24576:16;24569:27;24550:48;;24346:258;;;:::o;24609:136::-;24648:3;24676:5;24666:39;;24685:18;;:::i;:::-;-1:-1:-1;;;24721:18:1;;24609:136::o;24750:380::-;24829:1;24825:12;;;;24872;;;24893:61;;24947:4;24939:6;24935:17;24925:27;;24893:61;25000:2;24992:6;24989:14;24969:18;24966:38;24963:161;;;25046:10;25041:3;25037:20;25034:1;25027:31;25081:4;25078:1;25071:15;25109:4;25106:1;25099:15;25135:199;25173:3;25201:8;25244:2;25237:5;25233:14;25271:2;25262:7;25259:15;25256:41;;;25277:18;;:::i;:::-;25326:1;25313:15;;25135:199;-1:-1:-1;;;25135:199:1:o;25339:135::-;25378:3;-1:-1:-1;;25399:17:1;;25396:43;;;25419:18;;:::i;:::-;-1:-1:-1;25466:1:1;25455:13;;25339:135::o;25479:175::-;25516:3;25560:4;25553:5;25549:16;25589:4;25580:7;25577:17;25574:43;;;25597:18;;:::i;:::-;25646:1;25633:15;;25479:175;-1:-1:-1;;25479:175:1:o;25659:112::-;25691:1;25717;25707:35;;25722:18;;:::i;:::-;-1:-1:-1;25756:9:1;;25659:112::o;25776:136::-;25811:3;-1:-1:-1;;;25832:22:1;;25829:48;;;25857:18;;:::i;:::-;-1:-1:-1;25897:1:1;25893:13;;25776:136::o;25917:127::-;25978:10;25973:3;25969:20;25966:1;25959:31;26009:4;26006:1;25999:15;26033:4;26030:1;26023:15;26049:127;26110:10;26105:3;26101:20;26098:1;26091:31;26141:4;26138:1;26131:15;26165:4;26162:1;26155:15;26181:127;26242:10;26237:3;26233:20;26230:1;26223:31;26273:4;26270:1;26263:15;26297:4;26294:1;26287:15;26313:127;26374:10;26369:3;26365:20;26362:1;26355:31;26405:4;26402:1;26395:15;26429:4;26426:1;26419:15;26445:1191;26616:5;26603:19;26597:4;26590:33;26677:2;26670:5;26666:14;26653:28;26649:1;26643:4;26639:12;26632:50;26736:2;26729:5;26725:14;26712:28;26708:1;26702:4;26698:12;26691:50;26795:2;26788:5;26784:14;26771:28;26767:1;26761:4;26757:12;26750:50;26854:3;26847:5;26843:15;26830:29;26826:1;26820:4;26816:12;26809:51;26914:3;26907:5;26903:15;26890:29;26886:1;26880:4;26876:12;26869:51;26974:3;26967:5;26963:15;26950:29;26946:1;26940:4;26936:12;26929:51;27034:3;27027:5;27023:15;27010:29;27006:1;27000:4;26996:12;26989:51;27094:3;27087:5;27083:15;27070:29;27066:1;27060:4;27056:12;27049:51;27137:1;27131:4;27127:12;27187:3;27180:5;27176:15;27163:29;27201:32;27225:7;27201:32;:::i;:::-;27268:17;;-1:-1:-1;;27264:39:1;27318:10;27305:24;;;;27261:69;27242:89;;27374:108;27477:3;27466:15;;27470:5;27374:108;:::i;:::-;27491:139;27616:13;27603:11;27598:2;27592:4;27588:13;27491:139;:::i;27641:354::-;27766:5;27753:19;27781:33;27806:7;27781:33;:::i;:::-;27843:11;;-1:-1:-1;;;;;;27839:54:1;-1:-1:-1;;;;;27895:33:1;;;;27836:93;27823:107;;27984:2;27973:14;;;;27960:28;27925:1;27946:12;;;;27939:50;27641:354::o;28000:131::-;-1:-1:-1;;;;;28075:31:1;;28065:42;;28055:70;;28121:1;28118;28111:12;28136:118;28222:5;28215:13;28208:21;28201:5;28198:32;28188:60;;28244:1;28241;28234:12;28259:121;28344:10;28337:5;28333:22;28326:5;28323:33;28313:61;;28370:1;28367;28360:12
Swarm Source
ipfs://8522e5ace258e7958872548ec83df4c5bfeac0ebe65ecdff74d2110764fbf992