More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 30 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Stake Multiple | 17029636 | 656 days ago | IN | 0 ETH | 0.00045574 | ||||
Stake Multiple | 17023116 | 657 days ago | IN | 0 ETH | 0.00247785 | ||||
Stake Multiple | 17012670 | 658 days ago | IN | 0 ETH | 0.00553553 | ||||
Stake Multiple | 17010521 | 659 days ago | IN | 0 ETH | 0.00054634 | ||||
Stake Multiple | 17008575 | 659 days ago | IN | 0 ETH | 0.00226582 | ||||
Stake Multiple | 17007413 | 659 days ago | IN | 0 ETH | 0.00240801 | ||||
Stake Multiple | 17004856 | 659 days ago | IN | 0 ETH | 0.00344993 | ||||
Stake Multiple | 17001036 | 660 days ago | IN | 0 ETH | 0.02214998 | ||||
Stake Multiple | 17000713 | 660 days ago | IN | 0 ETH | 0.00046833 | ||||
Claim Rewards Ne... | 16999942 | 660 days ago | IN | 0 ETH | 0.00161639 | ||||
Claim Rewards Ne... | 16999844 | 660 days ago | IN | 0 ETH | 0.00161169 | ||||
Stake Multiple | 16999837 | 660 days ago | IN | 0 ETH | 0.00221902 | ||||
Stake Multiple | 16999639 | 660 days ago | IN | 0 ETH | 0.00273032 | ||||
Claim Rewards Ne... | 16999507 | 660 days ago | IN | 0 ETH | 0.00139823 | ||||
Stake Multiple | 16999456 | 660 days ago | IN | 0 ETH | 0.00242369 | ||||
Stake Multiple | 16999413 | 660 days ago | IN | 0 ETH | 0.0004853 | ||||
Stake Multiple | 16999408 | 660 days ago | IN | 0 ETH | 0.00048867 | ||||
Stake Multiple | 16999360 | 660 days ago | IN | 0 ETH | 0.00043677 | ||||
Stake Multiple | 16999254 | 660 days ago | IN | 0 ETH | 0.00048881 | ||||
Stake Multiple | 16999235 | 660 days ago | IN | 0 ETH | 0.01726226 | ||||
Stake Multiple | 16999228 | 660 days ago | IN | 0 ETH | 0.00411219 | ||||
Stake Multiple | 16998920 | 660 days ago | IN | 0 ETH | 0.00286142 | ||||
Stake Multiple | 16998710 | 660 days ago | IN | 0 ETH | 0.00295434 | ||||
Unstake Multiple | 16998672 | 660 days ago | IN | 0 ETH | 0.00716429 | ||||
Stake Multiple | 16998668 | 660 days ago | IN | 0 ETH | 0.00881987 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ToonCityStaking
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-04-06 */ // _________ ________ ________ ________ ________ _________ ________ ___ __ ___ ________ ________ // |\___ ___\\ __ \|\ __ \|\ ___ \ |\ ____\|\___ ___\\ __ \|\ \|\ \ |\ \|\ ___ \|\ ____\ // \|___ \ \_\ \ \|\ \ \ \|\ \ \ \\ \ \ \ \ \___|\|___ \ \_\ \ \|\ \ \ \/ /|\ \ \ \ \\ \ \ \ \___| // \ \ \ \ \ \\\ \ \ \\\ \ \ \\ \ \ \ \_____ \ \ \ \ \ \ __ \ \ ___ \ \ \ \ \\ \ \ \ \ ___ // \ \ \ \ \ \\\ \ \ \\\ \ \ \\ \ \ \|____|\ \ \ \ \ \ \ \ \ \ \ \\ \ \ \ \ \ \\ \ \ \ \|\ \ // \ \__\ \ \_______\ \_______\ \__\\ \__\ ____\_\ \ \ \__\ \ \__\ \__\ \__\\ \__\ \__\ \__\\ \__\ \_______\ // \|__| \|_______|\|_______|\|__| \|__| |\_________\ \|__| \|__|\|__|\|__| \|__|\|__|\|__| \|__|\|_______| // \|_________| // 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(int256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", 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(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", 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(uint256 p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", 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, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", 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, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", 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(uint256 p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", 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, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", 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, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", 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, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", 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, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", 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, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", 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, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", 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, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", 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, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", 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(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", 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, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", 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, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", 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, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", 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, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", 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, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", 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, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", 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, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", 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, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", 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, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", 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, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", 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, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", 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, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", 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, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", 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, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", 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, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", 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, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", 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, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", 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, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", 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, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", 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, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", 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, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", 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, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", 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, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", 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, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", 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, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", 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, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", 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: @openzeppelin/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // 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: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (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() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // 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/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev 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/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @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. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/toonstaking.sol pragma solidity ^0.8.7; contract ToonCityStaking is Ownable, ReentrancyGuard { IERC20 public rtoken; mapping(address => uint256) public rewardTokenPerBlock; mapping(address => bool) public allowedToStake; mapping(address => uint256[]) public stakeids; struct UserInfo { EnumerableSet.UintSet tokenIds; uint256 startBlock; } mapping(address => mapping(address => UserInfo)) userInfo; struct NftInfo { bool staked; uint256 startBlock; } //tokeniD to nftInfo struct mapping(address => mapping(uint256 => NftInfo)) public nftTimes; event Stake(address indexed user, uint256 amount); event UnStake(address indexed user, uint256 amount); constructor() {} function tokenIdStartBlock( address collection, uint256 tokenId ) public view returns (uint256) { return nftTimes[collection][tokenId].startBlock; } function tokenIdIsStaked( address collection, uint256 tokenId ) public view returns (bool) { return nftTimes[collection][tokenId].staked; } function setRewardTokenAddress( address _rewardTokenAddress ) external onlyOwner { rtoken = IERC20(_rewardTokenAddress); } function allowCollectionToStake( address _collection, bool _allow ) external onlyOwner { allowedToStake[_collection] = _allow; if (!_allow) rewardTokenPerBlock[_collection] = 0; } function setRewardTokenPerBlock( address _collection, uint256 _rewardTokenPerBlock ) external onlyOwner { rewardTokenPerBlock[_collection] = _rewardTokenPerBlock; } function withdrawTokens() external onlyOwner { rtoken.transfer(msg.sender, rtoken.balanceOf(address(this))); } function claimRewardsNew( address _collection, uint256 tokenId ) public nonReentrant { require( allowedToStake[_collection], "This collection is not one of our staking collections" ); uint256 _pendingRewards = pendingRewardNew(_collection, tokenId); if (_pendingRewards > 0) { require( rtoken.transfer(msg.sender, _pendingRewards), "Reward Token Transfer is failed." ); nftTimes[_collection][tokenId].startBlock = block.number; } } function claimRewardsMultipleNew( address _collection, uint256[] memory _tokenId ) public { require( allowedToStake[_collection], "This collection is not one of our staking collections" ); for (uint256 i = 0; i < _tokenId.length; i++) { claimRewardsNew(_collection, _tokenId[i]); } } function pendingRewardNew( address _collection, uint256 tokenId ) public view returns (uint256) { require( allowedToStake[_collection], "This collection is not one of our staking collections" ); require(nftTimes[_collection][tokenId].staked == true, "Not staked"); return (block.number - nftTimes[_collection][tokenId].startBlock) * rewardTokenPerBlock[_collection]; } function stakeMultiple( address _collection, uint256[] memory _tokenId ) public { for (uint256 i = 0; i < _tokenId.length; i++) { stakeNew(_collection, _tokenId[i]); } } function unstakeMultiple( address _collection, uint256[] memory _tokenId ) public { for (uint256 i = 0; i < _tokenId.length; i++) { unStakeNew(_collection, _tokenId[i]); } } function stakeNew( address _collection, uint256 tokenId ) public { require( allowedToStake[_collection], "This collection is not one of our staking collections" ); require( nftTimes[_collection][tokenId].staked == false, "Already Staked" ); require( IERC721(_collection).ownerOf(tokenId) == msg.sender, "Not Your NFT." ); nftTimes[_collection][tokenId].startBlock = block.number; nftTimes[_collection][tokenId].staked = true; stakeids[msg.sender].push(tokenId); emit Stake(msg.sender, tokenId); } function unStakeNew(address _collection, uint256 tokenId) public { require( allowedToStake[_collection], "This collection is not one of our staking collections" ); require(nftTimes[_collection][tokenId].staked == true, "Not Staked"); require( IERC721(_collection).ownerOf(tokenId) == msg.sender, "Not Your NFT." ); claimRewardsNew(_collection, tokenId); nftTimes[_collection][tokenId].startBlock = 0; nftTimes[_collection][tokenId].staked = false; uint256[] storage stakes = stakeids[msg.sender]; for (uint i = 0; i < stakes.length; i++) { if (stakes[i] == tokenId) { stakes[i] = stakes[stakes.length - 1]; stakes.pop(); break; } } emit UnStake(msg.sender, tokenId); } function stakeAll( address[] calldata _collection, uint256[][] calldata tokenIds ) external { require( _collection.length == tokenIds.length, "Not equal collection and token ids" ); for (uint256 i = 0; i < _collection.length; i++) { stakeMultiple(_collection[i], tokenIds[i]); } } function unStakeAll( address[] calldata _collection, uint256[][] calldata tokenIds ) external { require( _collection.length == tokenIds.length, "Not equal collection and token ids" ); for (uint256 i = 0; i < _collection.length; i++) { unstakeMultiple(_collection[i], tokenIds[i]); } } function fullReward1collection( address _collection, address _user ) public view returns (uint256) { require( allowedToStake[_collection], "This collection is not one of our staking collections" ); uint256[] memory howMany = stakeids[_user]; uint256 ids = howMany.length; uint256[] memory whichId = new uint256[](ids); uint256 fullPendingRewards1Collection; for (uint256 i = 0; i < ids; i++) { whichId[i] = stakeids[_user][i]; } for (uint256 i = 0; i < ids; i++) { fullPendingRewards1Collection += pendingRewardNew( _collection, whichId[i] ); } return fullPendingRewards1Collection; } function FullPendingTotal( address[] calldata _collection, address _user ) public view returns (uint256) { uint256 fullPendingTotal; for (uint256 i = 0; i < _collection.length; i++) { require( allowedToStake[_collection[i]], "This collection is not one of our staking collections" ); IERC721Enumerable nft = IERC721Enumerable(_collection[i]); //how many they own uint256 howMany = ERC721(_collection[i]).balanceOf(_user); uint256[] memory whichIds = new uint256[](howMany); //then do a loop of that many times getting token for (uint256 x = 0; x < howMany; x++) { whichIds[x] = nft.tokenOfOwnerByIndex(_user, x); } for (uint256 x = 0; x < howMany; x++) { fullPendingTotal += pendingRewardNew( _collection[x], whichIds[x] ); } } return fullPendingTotal; } function tokenIdsFromSpecificCollection( address _collection, address _user ) public view returns (uint256[] memory) { require( allowedToStake[_collection], "This collection is not one of our staking collections" ); IERC721Enumerable nft = IERC721Enumerable(_collection); //how many they own uint256 howMany = ERC721(_collection).balanceOf(_user); uint256[] memory whichIds = new uint256[](howMany); //then do a loop of that many times getting token for (uint256 x = 0; x < howMany; x++) { whichIds[x] = nft.tokenOfOwnerByIndex(_user, x); } return whichIds; } function FullPendingTotalX( address[] calldata _collection, address _user ) public view returns (uint256) { uint256 fullPendingTotal; for (uint256 i = 0; i < _collection.length; i++) { uint256[] memory whichIds = tokenIdsFromSpecificCollection( _collection[i], _user ); for (uint256 x = 0; x < whichIds.length; x++) { fullPendingTotal += pendingRewardNew( _collection[x], whichIds[x] ); } } return fullPendingTotal; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnStake","type":"event"},{"inputs":[{"internalType":"address[]","name":"_collection","type":"address[]"},{"internalType":"address","name":"_user","type":"address"}],"name":"FullPendingTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_collection","type":"address[]"},{"internalType":"address","name":"_user","type":"address"}],"name":"FullPendingTotalX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"bool","name":"_allow","type":"bool"}],"name":"allowCollectionToStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedToStake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"}],"name":"claimRewardsMultipleNew","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimRewardsNew","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"address","name":"_user","type":"address"}],"name":"fullReward1collection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftTimes","outputs":[{"internalType":"bool","name":"staked","type":"bool"},{"internalType":"uint256","name":"startBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"pendingRewardNew","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardTokenPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rtoken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardTokenAddress","type":"address"}],"name":"setRewardTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"uint256","name":"_rewardTokenPerBlock","type":"uint256"}],"name":"setRewardTokenPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_collection","type":"address[]"},{"internalType":"uint256[][]","name":"tokenIds","type":"uint256[][]"}],"name":"stakeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"}],"name":"stakeMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stakeNew","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeids","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenIdIsStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenIdStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"address","name":"_user","type":"address"}],"name":"tokenIdsFromSpecificCollection","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_collection","type":"address[]"},{"internalType":"uint256[][]","name":"tokenIds","type":"uint256[][]"}],"name":"unStakeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unStakeNew","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"}],"name":"unstakeMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5062000032620000266200003f60201b60201c565b6200004760201b60201c565b600180819055506200010b565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61333f806200011b6000396000f3fe608060405234801561001057600080fd5b50600436106101a85760003560e01c80637ceed75b116100f9578063d3bfacc911610097578063f2f7e4f211610071578063f2f7e4f2146104da578063f2fde38b1461050a578063f974a79614610526578063ffea760c14610542576101a8565b8063d3bfacc914610472578063e17a3bd31461048e578063e7ce4790146104be576101a8565b80639a6acf20116100d35780639a6acf20146103da578063a0da5287146103f6578063ae36608f14610426578063c5839a6b14610442576101a8565b80637ceed75b146103965780638d8f2adb146103b25780638da5cb5b146103bc576101a8565b806337268217116101665780636845478f116101405780636845478f1461033657806368e6619214610354578063715018a61461037057806376e88b321461037a576101a8565b806337268217146102a6578063423d950c146102d65780635a9cc4d914610306576101a8565b806265c7cc146101ad578063197236ee146101de5780631e1d5f621461020e5780631ec0ace21461022a5780632ee55a22146102465780633709e65214610276575b600080fd5b6101c760048036038101906101c2919061272f565b61055e565b6040516101d5929190612b4a565b60405180910390f35b6101f860048036038101906101f391906125f9565b61059c565b6040516102059190612b2f565b60405180910390f35b6102286004803603810190610223919061272f565b6105bc565b005b610244600480360381019061023f9190612693565b610961565b005b610260600480360381019061025b919061272f565b6109a9565b60405161026d9190612cce565b60405180910390f35b610290600480360381019061028b919061272f565b610b8f565b60405161029d9190612cce565b60405180910390f35b6102c060048036038101906102bb919061276f565b610bed565b6040516102cd9190612cce565b60405180910390f35b6102f060048036038101906102eb9190612653565b610f40565b6040516102fd9190612b0d565b60405180910390f35b610320600480360381019061031b9190612653565b611182565b60405161032d9190612cce565b60405180910390f35b61033e6113f1565b60405161034b9190612b73565b60405180910390f35b61036e600480360381019061036991906127cf565b611417565b005b61037861151c565b005b610394600480360381019061038f9190612693565b611530565b005b6103b060048036038101906103ab919061272f565b611578565b005b6103ba6119c9565b005b6103c4611b2d565b6040516103d19190612ac9565b60405180910390f35b6103f460048036038101906103ef91906125f9565b611b56565b005b610410600480360381019061040b91906125f9565b611ba2565b60405161041d9190612cce565b60405180910390f35b610440600480360381019061043b91906126ef565b611bba565b005b61045c6004803603810190610457919061276f565b611c68565b6040516104699190612cce565b60405180910390f35b61048c600480360381019061048791906127cf565b611d46565b005b6104a860048036038101906104a3919061272f565b611e4b565b6040516104b59190612cce565b60405180910390f35b6104d860048036038101906104d39190612693565b611e7c565b005b6104f460048036038101906104ef919061272f565b611f50565b6040516105019190612b2f565b60405180910390f35b610524600480360381019061051f91906125f9565b611fbb565b005b610540600480360381019061053b919061272f565b61203f565b005b61055c6004803603810190610557919061272f565b61208f565b005b6007602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900460ff16908060010154905082565b60046020528060005260406000206000915054906101000a900460ff1681565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063f90612cae565b60405180910390fd5b60001515600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060000160009054906101000a900460ff161515146106ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e690612c2e565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161073f9190612cce565b60206040518083038186803b15801561075757600080fd5b505afa15801561076b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078f9190612626565b73ffffffffffffffffffffffffffffffffffffffff16146107e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107dc90612bee565b60405180910390fd5b43600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600101819055506001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060000160006101000a81548160ff021916908315150217905550600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150553373ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a826040516109559190612cce565b60405180910390a25050565b60005b81518110156109a4576109918383838151811061098457610983613021565b5b6020026020010151611578565b808061099c90612f7a565b915050610964565b505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e90612cae565b60405180910390fd5b60011515600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060000160009054906101000a900460ff16151514610ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad590612b8e565b60405180910390fd5b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206001015443610b7d9190612e97565b610b879190612e3d565b905092915050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060010154905092915050565b60008060005b85859050811015610f345760046000878784818110610c1557610c14613021565b5b9050602002016020810190610c2a91906125f9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca890612cae565b60405180910390fd5b6000868683818110610cc657610cc5613021565b5b9050602002016020810190610cdb91906125f9565b90506000878784818110610cf257610cf1613021565b5b9050602002016020810190610d0791906125f9565b73ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b8152600401610d3f9190612ac9565b60206040518083038186803b158015610d5757600080fd5b505afa158015610d6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8f919061287d565b905060008167ffffffffffffffff811115610dad57610dac613050565b5b604051908082528060200260200182016040528015610ddb5781602001602082028036833780820191505090505b50905060005b82811015610ea6578373ffffffffffffffffffffffffffffffffffffffff16632f745c5989836040518363ffffffff1660e01b8152600401610e24929190612ae4565b60206040518083038186803b158015610e3c57600080fd5b505afa158015610e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e74919061287d565b828281518110610e8757610e86613021565b5b6020026020010181815250508080610e9e90612f7a565b915050610de1565b5060005b82811015610f1d57610efd8a8a83818110610ec857610ec7613021565b5b9050602002016020810190610edd91906125f9565b838381518110610ef057610eef613021565b5b60200260200101516109a9565b86610f089190612de7565b95508080610f1590612f7a565b915050610eaa565b505050508080610f2c90612f7a565b915050610bf3565b50809150509392505050565b6060600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc590612cae565b60405180910390fd5b600083905060008473ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b815260040161100e9190612ac9565b60206040518083038186803b15801561102657600080fd5b505afa15801561103a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105e919061287d565b905060008167ffffffffffffffff81111561107c5761107b613050565b5b6040519080825280602002602001820160405280156110aa5781602001602082028036833780820191505090505b50905060005b82811015611175578373ffffffffffffffffffffffffffffffffffffffff16632f745c5987836040518363ffffffff1660e01b81526004016110f3929190612ae4565b60206040518083038186803b15801561110b57600080fd5b505afa15801561111f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611143919061287d565b82828151811061115657611155613021565b5b602002602001018181525050808061116d90612f7a565b9150506110b0565b5080935050505092915050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611210576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120790612cae565b60405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561129b57602002820191906000526020600020905b815481526020019060010190808311611287575b5050505050905060008151905060008167ffffffffffffffff8111156112c4576112c3613050565b5b6040519080825280602002602001820160405280156112f25781602001602082028036833780820191505090505b509050600080600090505b8381101561139357600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061135657611355613021565b5b906000526020600020015483828151811061137457611373613021565b5b602002602001018181525050808061138b90612f7a565b9150506112fd565b5060005b838110156113e3576113c3888483815181106113b6576113b5613021565b5b60200260200101516109a9565b826113ce9190612de7565b915080806113db90612f7a565b915050611397565b508094505050505092915050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b81819050848490501461145f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145690612bce565b60405180910390fd5b60005b848490508110156115155761150285858381811061148357611482613021565b5b905060200201602081019061149891906125f9565b8484848181106114ab576114aa613021565b5b90506020028101906114bd9190612ce9565b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050610961565b808061150d90612f7a565b915050611462565b5050505050565b61152461228e565b61152e600061230c565b565b60005b8151811015611573576115608383838151811061155357611552613021565b5b60200260200101516105bc565b808061156b90612f7a565b915050611533565b505050565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fb90612cae565b60405180910390fd5b60011515600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060000160009054906101000a900460ff161515146116ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a290612c4e565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016116fb9190612cce565b60206040518083038186803b15801561171357600080fd5b505afa158015611727573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174b9190612626565b73ffffffffffffffffffffffffffffffffffffffff16146117a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179890612bee565b60405180910390fd5b6117ab828261208f565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600101819055506000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060000160006101000a81548160ff0219169083151502179055506000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b818054905081101561197557828282815481106118d6576118d5613021565b5b906000526020600020015414156119625781600183805490506118f99190612e97565b8154811061190a57611909613021565b5b906000526020600020015482828154811061192857611927613021565b5b90600052602060002001819055508180548061194757611946612ff2565b5b60019003818190600052602060002001600090559055611975565b808061196d90612f7a565b9150506118b6565b503373ffffffffffffffffffffffffffffffffffffffff167fb24546d975e2628748efc9aced80665e0fad66272033e5c0ea25fd3afac99795836040516119bc9190612cce565b60405180910390a2505050565b6119d161228e565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a6b9190612ac9565b60206040518083038186803b158015611a8357600080fd5b505afa158015611a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abb919061287d565b6040518363ffffffff1660e01b8152600401611ad8929190612ae4565b602060405180830381600087803b158015611af257600080fd5b505af1158015611b06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2a9190612850565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b5e61228e565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60036020528060005260406000206000915090505481565b611bc261228e565b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080611c64576000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050565b60008060005b85859050811015611d3a576000611cac878784818110611c9157611c90613021565b5b9050602002016020810190611ca691906125f9565b86610f40565b905060005b8151811015611d2557611d05888883818110611cd057611ccf613021565b5b9050602002016020810190611ce591906125f9565b838381518110611cf857611cf7613021565b5b60200260200101516109a9565b84611d109190612de7565b93508080611d1d90612f7a565b915050611cb1565b50508080611d3290612f7a565b915050611c6e565b50809150509392505050565b818190508484905014611d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8590612bce565b60405180910390fd5b60005b84849050811015611e4457611e31858583818110611db257611db1613021565b5b9050602002016020810190611dc791906125f9565b848484818110611dda57611dd9613021565b5b9050602002810190611dec9190612ce9565b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050611530565b8080611e3c90612f7a565b915050611d91565b5050505050565b60056020528160005260406000208181548110611e6757600080fd5b90600052602060002001600091509150505481565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eff90612cae565b60405180910390fd5b60005b8151811015611f4b57611f3883838381518110611f2b57611f2a613021565b5b602002602001015161208f565b8080611f4390612f7a565b915050611f0b565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060000160009054906101000a900460ff16905092915050565b611fc361228e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a90612bae565b60405180910390fd5b61203c8161230c565b50565b61204761228e565b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6120976123d0565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211a90612cae565b60405180910390fd5b600061212f83836109a9565b9050600081111561228157600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401612197929190612ae4565b602060405180830381600087803b1580156121b157600080fd5b505af11580156121c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e99190612850565b612228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221f90612c6e565b60405180910390fd5b43600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600101819055505b5061228a612420565b5050565b612296612429565b73ffffffffffffffffffffffffffffffffffffffff166122b4611b2d565b73ffffffffffffffffffffffffffffffffffffffff161461230a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230190612c0e565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60026001541415612416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240d90612c8e565b60405180910390fd5b6002600181905550565b60018081905550565b600033905090565b600061244461243f84612d71565b612d4c565b9050808382526020820190508285602086028201111561246757612466613093565b5b60005b85811015612497578161247d88826125cf565b84526020840193506020830192505060018101905061246a565b5050509392505050565b6000813590506124b0816132c4565b92915050565b6000815190506124c5816132c4565b92915050565b60008083601f8401126124e1576124e0613084565b5b8235905067ffffffffffffffff8111156124fe576124fd61307f565b5b60208301915083602082028301111561251a57612519613093565b5b9250929050565b60008083601f84011261253757612536613084565b5b8235905067ffffffffffffffff8111156125545761255361307f565b5b6020830191508360208202830111156125705761256f613093565b5b9250929050565b600082601f83011261258c5761258b613084565b5b813561259c848260208601612431565b91505092915050565b6000813590506125b4816132db565b92915050565b6000815190506125c9816132db565b92915050565b6000813590506125de816132f2565b92915050565b6000815190506125f3816132f2565b92915050565b60006020828403121561260f5761260e6130a2565b5b600061261d848285016124a1565b91505092915050565b60006020828403121561263c5761263b6130a2565b5b600061264a848285016124b6565b91505092915050565b6000806040838503121561266a576126696130a2565b5b6000612678858286016124a1565b9250506020612689858286016124a1565b9150509250929050565b600080604083850312156126aa576126a96130a2565b5b60006126b8858286016124a1565b925050602083013567ffffffffffffffff8111156126d9576126d861309d565b5b6126e585828601612577565b9150509250929050565b60008060408385031215612706576127056130a2565b5b6000612714858286016124a1565b9250506020612725858286016125a5565b9150509250929050565b60008060408385031215612746576127456130a2565b5b6000612754858286016124a1565b9250506020612765858286016125cf565b9150509250929050565b600080600060408486031215612788576127876130a2565b5b600084013567ffffffffffffffff8111156127a6576127a561309d565b5b6127b2868287016124cb565b935093505060206127c5868287016124a1565b9150509250925092565b600080600080604085870312156127e9576127e86130a2565b5b600085013567ffffffffffffffff8111156128075761280661309d565b5b612813878288016124cb565b9450945050602085013567ffffffffffffffff8111156128365761283561309d565b5b61284287828801612521565b925092505092959194509250565b600060208284031215612866576128656130a2565b5b6000612874848285016125ba565b91505092915050565b600060208284031215612893576128926130a2565b5b60006128a1848285016125e4565b91505092915050565b60006128b68383612aab565b60208301905092915050565b6128cb81612ecb565b82525050565b60006128dc82612dad565b6128e68185612dc5565b93506128f183612d9d565b8060005b8381101561292257815161290988826128aa565b975061291483612db8565b9250506001810190506128f5565b5085935050505092915050565b61293881612edd565b82525050565b61294781612f13565b82525050565b600061295a600a83612dd6565b9150612965826130b8565b602082019050919050565b600061297d602683612dd6565b9150612988826130e1565b604082019050919050565b60006129a0602283612dd6565b91506129ab82613130565b604082019050919050565b60006129c3600d83612dd6565b91506129ce8261317f565b602082019050919050565b60006129e6602083612dd6565b91506129f1826131a8565b602082019050919050565b6000612a09600e83612dd6565b9150612a14826131d1565b602082019050919050565b6000612a2c600a83612dd6565b9150612a37826131fa565b602082019050919050565b6000612a4f602083612dd6565b9150612a5a82613223565b602082019050919050565b6000612a72601f83612dd6565b9150612a7d8261324c565b602082019050919050565b6000612a95603583612dd6565b9150612aa082613275565b604082019050919050565b612ab481612f09565b82525050565b612ac381612f09565b82525050565b6000602082019050612ade60008301846128c2565b92915050565b6000604082019050612af960008301856128c2565b612b066020830184612aba565b9392505050565b60006020820190508181036000830152612b2781846128d1565b905092915050565b6000602082019050612b44600083018461292f565b92915050565b6000604082019050612b5f600083018561292f565b612b6c6020830184612aba565b9392505050565b6000602082019050612b88600083018461293e565b92915050565b60006020820190508181036000830152612ba78161294d565b9050919050565b60006020820190508181036000830152612bc781612970565b9050919050565b60006020820190508181036000830152612be781612993565b9050919050565b60006020820190508181036000830152612c07816129b6565b9050919050565b60006020820190508181036000830152612c27816129d9565b9050919050565b60006020820190508181036000830152612c47816129fc565b9050919050565b60006020820190508181036000830152612c6781612a1f565b9050919050565b60006020820190508181036000830152612c8781612a42565b9050919050565b60006020820190508181036000830152612ca781612a65565b9050919050565b60006020820190508181036000830152612cc781612a88565b9050919050565b6000602082019050612ce36000830184612aba565b92915050565b60008083356001602003843603038112612d0657612d0561308e565b5b80840192508235915067ffffffffffffffff821115612d2857612d27613089565b5b602083019250602082023603831315612d4457612d43613098565b5b509250929050565b6000612d56612d67565b9050612d628282612f49565b919050565b6000604051905090565b600067ffffffffffffffff821115612d8c57612d8b613050565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612df282612f09565b9150612dfd83612f09565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e3257612e31612fc3565b5b828201905092915050565b6000612e4882612f09565b9150612e5383612f09565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e8c57612e8b612fc3565b5b828202905092915050565b6000612ea282612f09565b9150612ead83612f09565b925082821015612ec057612ebf612fc3565b5b828203905092915050565b6000612ed682612ee9565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612f1e82612f25565b9050919050565b6000612f3082612f37565b9050919050565b6000612f4282612ee9565b9050919050565b612f52826130a7565b810181811067ffffffffffffffff82111715612f7157612f70613050565b5b80604052505050565b6000612f8582612f09565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612fb857612fb7612fc3565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f74207374616b656400000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420657175616c20636f6c6c656374696f6e20616e6420746f6b656e206960008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420596f7572204e46542e00000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f416c7265616479205374616b6564000000000000000000000000000000000000600082015250565b7f4e6f74205374616b656400000000000000000000000000000000000000000000600082015250565b7f52657761726420546f6b656e205472616e73666572206973206661696c65642e600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f5468697320636f6c6c656374696f6e206973206e6f74206f6e65206f66206f7560008201527f72207374616b696e6720636f6c6c656374696f6e730000000000000000000000602082015250565b6132cd81612ecb565b81146132d857600080fd5b50565b6132e481612edd565b81146132ef57600080fd5b50565b6132fb81612f09565b811461330657600080fd5b5056fea2646970667358221220b32ddb07e277d5d69f1ef52ab749719650831000d7b7dd2f5f74dde2905e7e5864736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a85760003560e01c80637ceed75b116100f9578063d3bfacc911610097578063f2f7e4f211610071578063f2f7e4f2146104da578063f2fde38b1461050a578063f974a79614610526578063ffea760c14610542576101a8565b8063d3bfacc914610472578063e17a3bd31461048e578063e7ce4790146104be576101a8565b80639a6acf20116100d35780639a6acf20146103da578063a0da5287146103f6578063ae36608f14610426578063c5839a6b14610442576101a8565b80637ceed75b146103965780638d8f2adb146103b25780638da5cb5b146103bc576101a8565b806337268217116101665780636845478f116101405780636845478f1461033657806368e6619214610354578063715018a61461037057806376e88b321461037a576101a8565b806337268217146102a6578063423d950c146102d65780635a9cc4d914610306576101a8565b806265c7cc146101ad578063197236ee146101de5780631e1d5f621461020e5780631ec0ace21461022a5780632ee55a22146102465780633709e65214610276575b600080fd5b6101c760048036038101906101c2919061272f565b61055e565b6040516101d5929190612b4a565b60405180910390f35b6101f860048036038101906101f391906125f9565b61059c565b6040516102059190612b2f565b60405180910390f35b6102286004803603810190610223919061272f565b6105bc565b005b610244600480360381019061023f9190612693565b610961565b005b610260600480360381019061025b919061272f565b6109a9565b60405161026d9190612cce565b60405180910390f35b610290600480360381019061028b919061272f565b610b8f565b60405161029d9190612cce565b60405180910390f35b6102c060048036038101906102bb919061276f565b610bed565b6040516102cd9190612cce565b60405180910390f35b6102f060048036038101906102eb9190612653565b610f40565b6040516102fd9190612b0d565b60405180910390f35b610320600480360381019061031b9190612653565b611182565b60405161032d9190612cce565b60405180910390f35b61033e6113f1565b60405161034b9190612b73565b60405180910390f35b61036e600480360381019061036991906127cf565b611417565b005b61037861151c565b005b610394600480360381019061038f9190612693565b611530565b005b6103b060048036038101906103ab919061272f565b611578565b005b6103ba6119c9565b005b6103c4611b2d565b6040516103d19190612ac9565b60405180910390f35b6103f460048036038101906103ef91906125f9565b611b56565b005b610410600480360381019061040b91906125f9565b611ba2565b60405161041d9190612cce565b60405180910390f35b610440600480360381019061043b91906126ef565b611bba565b005b61045c6004803603810190610457919061276f565b611c68565b6040516104699190612cce565b60405180910390f35b61048c600480360381019061048791906127cf565b611d46565b005b6104a860048036038101906104a3919061272f565b611e4b565b6040516104b59190612cce565b60405180910390f35b6104d860048036038101906104d39190612693565b611e7c565b005b6104f460048036038101906104ef919061272f565b611f50565b6040516105019190612b2f565b60405180910390f35b610524600480360381019061051f91906125f9565b611fbb565b005b610540600480360381019061053b919061272f565b61203f565b005b61055c6004803603810190610557919061272f565b61208f565b005b6007602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900460ff16908060010154905082565b60046020528060005260406000206000915054906101000a900460ff1681565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063f90612cae565b60405180910390fd5b60001515600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060000160009054906101000a900460ff161515146106ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e690612c2e565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161073f9190612cce565b60206040518083038186803b15801561075757600080fd5b505afa15801561076b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078f9190612626565b73ffffffffffffffffffffffffffffffffffffffff16146107e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107dc90612bee565b60405180910390fd5b43600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600101819055506001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060000160006101000a81548160ff021916908315150217905550600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150553373ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a826040516109559190612cce565b60405180910390a25050565b60005b81518110156109a4576109918383838151811061098457610983613021565b5b6020026020010151611578565b808061099c90612f7a565b915050610964565b505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e90612cae565b60405180910390fd5b60011515600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060000160009054906101000a900460ff16151514610ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad590612b8e565b60405180910390fd5b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206001015443610b7d9190612e97565b610b879190612e3d565b905092915050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060010154905092915050565b60008060005b85859050811015610f345760046000878784818110610c1557610c14613021565b5b9050602002016020810190610c2a91906125f9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca890612cae565b60405180910390fd5b6000868683818110610cc657610cc5613021565b5b9050602002016020810190610cdb91906125f9565b90506000878784818110610cf257610cf1613021565b5b9050602002016020810190610d0791906125f9565b73ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b8152600401610d3f9190612ac9565b60206040518083038186803b158015610d5757600080fd5b505afa158015610d6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8f919061287d565b905060008167ffffffffffffffff811115610dad57610dac613050565b5b604051908082528060200260200182016040528015610ddb5781602001602082028036833780820191505090505b50905060005b82811015610ea6578373ffffffffffffffffffffffffffffffffffffffff16632f745c5989836040518363ffffffff1660e01b8152600401610e24929190612ae4565b60206040518083038186803b158015610e3c57600080fd5b505afa158015610e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e74919061287d565b828281518110610e8757610e86613021565b5b6020026020010181815250508080610e9e90612f7a565b915050610de1565b5060005b82811015610f1d57610efd8a8a83818110610ec857610ec7613021565b5b9050602002016020810190610edd91906125f9565b838381518110610ef057610eef613021565b5b60200260200101516109a9565b86610f089190612de7565b95508080610f1590612f7a565b915050610eaa565b505050508080610f2c90612f7a565b915050610bf3565b50809150509392505050565b6060600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc590612cae565b60405180910390fd5b600083905060008473ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b815260040161100e9190612ac9565b60206040518083038186803b15801561102657600080fd5b505afa15801561103a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105e919061287d565b905060008167ffffffffffffffff81111561107c5761107b613050565b5b6040519080825280602002602001820160405280156110aa5781602001602082028036833780820191505090505b50905060005b82811015611175578373ffffffffffffffffffffffffffffffffffffffff16632f745c5987836040518363ffffffff1660e01b81526004016110f3929190612ae4565b60206040518083038186803b15801561110b57600080fd5b505afa15801561111f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611143919061287d565b82828151811061115657611155613021565b5b602002602001018181525050808061116d90612f7a565b9150506110b0565b5080935050505092915050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611210576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120790612cae565b60405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561129b57602002820191906000526020600020905b815481526020019060010190808311611287575b5050505050905060008151905060008167ffffffffffffffff8111156112c4576112c3613050565b5b6040519080825280602002602001820160405280156112f25781602001602082028036833780820191505090505b509050600080600090505b8381101561139357600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061135657611355613021565b5b906000526020600020015483828151811061137457611373613021565b5b602002602001018181525050808061138b90612f7a565b9150506112fd565b5060005b838110156113e3576113c3888483815181106113b6576113b5613021565b5b60200260200101516109a9565b826113ce9190612de7565b915080806113db90612f7a565b915050611397565b508094505050505092915050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b81819050848490501461145f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145690612bce565b60405180910390fd5b60005b848490508110156115155761150285858381811061148357611482613021565b5b905060200201602081019061149891906125f9565b8484848181106114ab576114aa613021565b5b90506020028101906114bd9190612ce9565b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050610961565b808061150d90612f7a565b915050611462565b5050505050565b61152461228e565b61152e600061230c565b565b60005b8151811015611573576115608383838151811061155357611552613021565b5b60200260200101516105bc565b808061156b90612f7a565b915050611533565b505050565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fb90612cae565b60405180910390fd5b60011515600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060000160009054906101000a900460ff161515146116ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a290612c4e565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016116fb9190612cce565b60206040518083038186803b15801561171357600080fd5b505afa158015611727573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174b9190612626565b73ffffffffffffffffffffffffffffffffffffffff16146117a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179890612bee565b60405180910390fd5b6117ab828261208f565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600101819055506000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060000160006101000a81548160ff0219169083151502179055506000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b818054905081101561197557828282815481106118d6576118d5613021565b5b906000526020600020015414156119625781600183805490506118f99190612e97565b8154811061190a57611909613021565b5b906000526020600020015482828154811061192857611927613021565b5b90600052602060002001819055508180548061194757611946612ff2565b5b60019003818190600052602060002001600090559055611975565b808061196d90612f7a565b9150506118b6565b503373ffffffffffffffffffffffffffffffffffffffff167fb24546d975e2628748efc9aced80665e0fad66272033e5c0ea25fd3afac99795836040516119bc9190612cce565b60405180910390a2505050565b6119d161228e565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a6b9190612ac9565b60206040518083038186803b158015611a8357600080fd5b505afa158015611a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abb919061287d565b6040518363ffffffff1660e01b8152600401611ad8929190612ae4565b602060405180830381600087803b158015611af257600080fd5b505af1158015611b06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2a9190612850565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b5e61228e565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60036020528060005260406000206000915090505481565b611bc261228e565b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080611c64576000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050565b60008060005b85859050811015611d3a576000611cac878784818110611c9157611c90613021565b5b9050602002016020810190611ca691906125f9565b86610f40565b905060005b8151811015611d2557611d05888883818110611cd057611ccf613021565b5b9050602002016020810190611ce591906125f9565b838381518110611cf857611cf7613021565b5b60200260200101516109a9565b84611d109190612de7565b93508080611d1d90612f7a565b915050611cb1565b50508080611d3290612f7a565b915050611c6e565b50809150509392505050565b818190508484905014611d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8590612bce565b60405180910390fd5b60005b84849050811015611e4457611e31858583818110611db257611db1613021565b5b9050602002016020810190611dc791906125f9565b848484818110611dda57611dd9613021565b5b9050602002810190611dec9190612ce9565b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050611530565b8080611e3c90612f7a565b915050611d91565b5050505050565b60056020528160005260406000208181548110611e6757600080fd5b90600052602060002001600091509150505481565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eff90612cae565b60405180910390fd5b60005b8151811015611f4b57611f3883838381518110611f2b57611f2a613021565b5b602002602001015161208f565b8080611f4390612f7a565b915050611f0b565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060000160009054906101000a900460ff16905092915050565b611fc361228e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a90612bae565b60405180910390fd5b61203c8161230c565b50565b61204761228e565b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6120976123d0565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211a90612cae565b60405180910390fd5b600061212f83836109a9565b9050600081111561228157600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401612197929190612ae4565b602060405180830381600087803b1580156121b157600080fd5b505af11580156121c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e99190612850565b612228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221f90612c6e565b60405180910390fd5b43600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600101819055505b5061228a612420565b5050565b612296612429565b73ffffffffffffffffffffffffffffffffffffffff166122b4611b2d565b73ffffffffffffffffffffffffffffffffffffffff161461230a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230190612c0e565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60026001541415612416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240d90612c8e565b60405180910390fd5b6002600181905550565b60018081905550565b600033905090565b600061244461243f84612d71565b612d4c565b9050808382526020820190508285602086028201111561246757612466613093565b5b60005b85811015612497578161247d88826125cf565b84526020840193506020830192505060018101905061246a565b5050509392505050565b6000813590506124b0816132c4565b92915050565b6000815190506124c5816132c4565b92915050565b60008083601f8401126124e1576124e0613084565b5b8235905067ffffffffffffffff8111156124fe576124fd61307f565b5b60208301915083602082028301111561251a57612519613093565b5b9250929050565b60008083601f84011261253757612536613084565b5b8235905067ffffffffffffffff8111156125545761255361307f565b5b6020830191508360208202830111156125705761256f613093565b5b9250929050565b600082601f83011261258c5761258b613084565b5b813561259c848260208601612431565b91505092915050565b6000813590506125b4816132db565b92915050565b6000815190506125c9816132db565b92915050565b6000813590506125de816132f2565b92915050565b6000815190506125f3816132f2565b92915050565b60006020828403121561260f5761260e6130a2565b5b600061261d848285016124a1565b91505092915050565b60006020828403121561263c5761263b6130a2565b5b600061264a848285016124b6565b91505092915050565b6000806040838503121561266a576126696130a2565b5b6000612678858286016124a1565b9250506020612689858286016124a1565b9150509250929050565b600080604083850312156126aa576126a96130a2565b5b60006126b8858286016124a1565b925050602083013567ffffffffffffffff8111156126d9576126d861309d565b5b6126e585828601612577565b9150509250929050565b60008060408385031215612706576127056130a2565b5b6000612714858286016124a1565b9250506020612725858286016125a5565b9150509250929050565b60008060408385031215612746576127456130a2565b5b6000612754858286016124a1565b9250506020612765858286016125cf565b9150509250929050565b600080600060408486031215612788576127876130a2565b5b600084013567ffffffffffffffff8111156127a6576127a561309d565b5b6127b2868287016124cb565b935093505060206127c5868287016124a1565b9150509250925092565b600080600080604085870312156127e9576127e86130a2565b5b600085013567ffffffffffffffff8111156128075761280661309d565b5b612813878288016124cb565b9450945050602085013567ffffffffffffffff8111156128365761283561309d565b5b61284287828801612521565b925092505092959194509250565b600060208284031215612866576128656130a2565b5b6000612874848285016125ba565b91505092915050565b600060208284031215612893576128926130a2565b5b60006128a1848285016125e4565b91505092915050565b60006128b68383612aab565b60208301905092915050565b6128cb81612ecb565b82525050565b60006128dc82612dad565b6128e68185612dc5565b93506128f183612d9d565b8060005b8381101561292257815161290988826128aa565b975061291483612db8565b9250506001810190506128f5565b5085935050505092915050565b61293881612edd565b82525050565b61294781612f13565b82525050565b600061295a600a83612dd6565b9150612965826130b8565b602082019050919050565b600061297d602683612dd6565b9150612988826130e1565b604082019050919050565b60006129a0602283612dd6565b91506129ab82613130565b604082019050919050565b60006129c3600d83612dd6565b91506129ce8261317f565b602082019050919050565b60006129e6602083612dd6565b91506129f1826131a8565b602082019050919050565b6000612a09600e83612dd6565b9150612a14826131d1565b602082019050919050565b6000612a2c600a83612dd6565b9150612a37826131fa565b602082019050919050565b6000612a4f602083612dd6565b9150612a5a82613223565b602082019050919050565b6000612a72601f83612dd6565b9150612a7d8261324c565b602082019050919050565b6000612a95603583612dd6565b9150612aa082613275565b604082019050919050565b612ab481612f09565b82525050565b612ac381612f09565b82525050565b6000602082019050612ade60008301846128c2565b92915050565b6000604082019050612af960008301856128c2565b612b066020830184612aba565b9392505050565b60006020820190508181036000830152612b2781846128d1565b905092915050565b6000602082019050612b44600083018461292f565b92915050565b6000604082019050612b5f600083018561292f565b612b6c6020830184612aba565b9392505050565b6000602082019050612b88600083018461293e565b92915050565b60006020820190508181036000830152612ba78161294d565b9050919050565b60006020820190508181036000830152612bc781612970565b9050919050565b60006020820190508181036000830152612be781612993565b9050919050565b60006020820190508181036000830152612c07816129b6565b9050919050565b60006020820190508181036000830152612c27816129d9565b9050919050565b60006020820190508181036000830152612c47816129fc565b9050919050565b60006020820190508181036000830152612c6781612a1f565b9050919050565b60006020820190508181036000830152612c8781612a42565b9050919050565b60006020820190508181036000830152612ca781612a65565b9050919050565b60006020820190508181036000830152612cc781612a88565b9050919050565b6000602082019050612ce36000830184612aba565b92915050565b60008083356001602003843603038112612d0657612d0561308e565b5b80840192508235915067ffffffffffffffff821115612d2857612d27613089565b5b602083019250602082023603831315612d4457612d43613098565b5b509250929050565b6000612d56612d67565b9050612d628282612f49565b919050565b6000604051905090565b600067ffffffffffffffff821115612d8c57612d8b613050565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612df282612f09565b9150612dfd83612f09565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e3257612e31612fc3565b5b828201905092915050565b6000612e4882612f09565b9150612e5383612f09565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e8c57612e8b612fc3565b5b828202905092915050565b6000612ea282612f09565b9150612ead83612f09565b925082821015612ec057612ebf612fc3565b5b828203905092915050565b6000612ed682612ee9565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612f1e82612f25565b9050919050565b6000612f3082612f37565b9050919050565b6000612f4282612ee9565b9050919050565b612f52826130a7565b810181811067ffffffffffffffff82111715612f7157612f70613050565b5b80604052505050565b6000612f8582612f09565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612fb857612fb7612fc3565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f74207374616b656400000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420657175616c20636f6c6c656374696f6e20616e6420746f6b656e206960008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420596f7572204e46542e00000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f416c7265616479205374616b6564000000000000000000000000000000000000600082015250565b7f4e6f74205374616b656400000000000000000000000000000000000000000000600082015250565b7f52657761726420546f6b656e205472616e73666572206973206661696c65642e600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f5468697320636f6c6c656374696f6e206973206e6f74206f6e65206f66206f7560008201527f72207374616b696e6720636f6c6c656374696f6e730000000000000000000000602082015250565b6132cd81612ecb565b81146132d857600080fd5b50565b6132e481612edd565b81146132ef57600080fd5b50565b6132fb81612f09565b811461330657600080fd5b5056fea2646970667358221220b32ddb07e277d5d69f1ef52ab749719650831000d7b7dd2f5f74dde2905e7e5864736f6c63430008070033
Deployed Bytecode Sourcemap
152224:9530:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;152764:63;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;152372:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;156058:694;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;155818:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;155090:484;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;152976:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;159284:1090;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;160382:718;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;158466:810;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;152284:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;158071:387;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;105373:103;;;:::i;:::-;;155582:228;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;156760:912;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;153953:124;;;:::i;:::-;;104725:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;153353:150;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;152311:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;153511:225;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;161108:643;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;157680:383;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;152425:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;154696:386;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;153169:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105631:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;153744;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;154085:603;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;152764:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;152372:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;156058:694::-;156179:14;:27;156194:11;156179:27;;;;;;;;;;;;;;;;;;;;;;;;;156157:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;156361:5;156320:46;;:8;:21;156329:11;156320:21;;;;;;;;;;;;;;;:30;156342:7;156320:30;;;;;;;;;;;:37;;;;;;;;;;;;:46;;;156298:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;156482:10;156441:51;;156449:11;156441:28;;;156470:7;156441:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;;156419:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;156590:12;156546:8;:21;156555:11;156546:21;;;;;;;;;;;;;;;:30;156568:7;156546:30;;;;;;;;;;;:41;;:56;;;;156653:4;156613:8;:21;156622:11;156613:21;;;;;;;;;;;;;;;:30;156635:7;156613:30;;;;;;;;;;;:37;;;:44;;;;;;;;;;;;;;;;;;156668:8;:20;156677:10;156668:20;;;;;;;;;;;;;;;156694:7;156668:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;156724:10;156718:26;;;156736:7;156718:26;;;;;;:::i;:::-;;;;;;;;156058:694;;:::o;155818:232::-;155939:9;155934:109;155958:8;:15;155954:1;:19;155934:109;;;155995:36;156006:11;156019:8;156028:1;156019:11;;;;;;;;:::i;:::-;;;;;;;;155995:10;:36::i;:::-;155975:3;;;;;:::i;:::-;;;;155934:109;;;;155818:232;;:::o;155090:484::-;155200:7;155242:14;:27;155257:11;155242:27;;;;;;;;;;;;;;;;;;;;;;;;;155220:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;155410:4;155369:45;;:8;:21;155378:11;155369:21;;;;;;;;;;;;;;;:30;155391:7;155369:30;;;;;;;;;;;:37;;;;;;;;;;;;:45;;;155361:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;155534:19;:32;155554:11;155534:32;;;;;;;;;;;;;;;;155476:8;:21;155485:11;155476:21;;;;;;;;;;;;;;;:30;155498:7;155476:30;;;;;;;;;;;:41;;;155461:12;:56;;;;:::i;:::-;155460:106;;;;:::i;:::-;155440:126;;155090:484;;;;:::o;152976:185::-;153086:7;153113:8;:20;153122:10;153113:20;;;;;;;;;;;;;;;:29;153134:7;153113:29;;;;;;;;;;;:40;;;153106:47;;152976:185;;;;:::o;159284:1090::-;159403:7;159423:24;159463:9;159458:875;159482:11;;:18;;159478:1;:22;159458:875;;;159548:14;:30;159563:11;;159575:1;159563:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;159548:30;;;;;;;;;;;;;;;;;;;;;;;;;159522:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;159682:21;159724:11;;159736:1;159724:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;159682:57;;159787:15;159812:11;;159824:1;159812:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;159805:32;;;159838:5;159805:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;159787:57;;159859:25;159901:7;159887:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;159859:50;;159994:9;159989:120;160013:7;160009:1;:11;159989:120;;;160060:3;:23;;;160084:5;160091:1;160060:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;160046:8;160055:1;160046:11;;;;;;;;:::i;:::-;;;;;;;:47;;;;;160022:3;;;;;:::i;:::-;;;;159989:120;;;;160128:9;160123:199;160147:7;160143:1;:11;160123:199;;;160200:106;160239:11;;160251:1;160239:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;160276:8;160285:1;160276:11;;;;;;;;:::i;:::-;;;;;;;;160200:16;:106::i;:::-;160180:126;;;;;:::i;:::-;;;160156:3;;;;;:::i;:::-;;;;160123:199;;;;159507:826;;;159502:3;;;;;:::i;:::-;;;;159458:875;;;;160350:16;160343:23;;;159284:1090;;;;;:::o;160382:718::-;160504:16;160555:14;:27;160570:11;160555:27;;;;;;;;;;;;;;;;;;;;;;;;;160533:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;160674:21;160716:11;160674:54;;160768:15;160793:11;160786:29;;;160816:5;160786:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;160768:54;;160833:25;160875:7;160861:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;160833:50;;160960:9;160955:112;160979:7;160975:1;:11;160955:112;;;161022:3;:23;;;161046:5;161053:1;161022:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;161008:8;161017:1;161008:11;;;;;;;;:::i;:::-;;;;;;;:47;;;;;160988:3;;;;;:::i;:::-;;;;160955:112;;;;161084:8;161077:15;;;;;160382:718;;;;:::o;158466:810::-;158579:7;158621:14;:27;158636:11;158621:27;;;;;;;;;;;;;;;;;;;;;;;;;158599:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;158740:24;158767:8;:15;158776:5;158767:15;;;;;;;;;;;;;;;158740:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;158793:11;158807:7;:14;158793:28;;158832:24;158873:3;158859:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;158832:45;;158888:37;158941:9;158953:1;158941:13;;158936:92;158960:3;158956:1;:7;158936:92;;;158998:8;:15;159007:5;158998:15;;;;;;;;;;;;;;;159014:1;158998:18;;;;;;;;:::i;:::-;;;;;;;;;;158985:7;158993:1;158985:10;;;;;;;;:::i;:::-;;;;;;;:31;;;;;158965:3;;;;;:::i;:::-;;;;158936:92;;;;159043:9;159038:184;159062:3;159058:1;:7;159038:184;;;159120:90;159155:11;159185:7;159193:1;159185:10;;;;;;;;:::i;:::-;;;;;;;;159120:16;:90::i;:::-;159087:123;;;;;:::i;:::-;;;159067:3;;;;;:::i;:::-;;;;159038:184;;;;159239:29;159232:36;;;;;;158466:810;;;;:::o;152284:20::-;;;;;;;;;;;;;:::o;158071:387::-;158243:8;;:15;;158221:11;;:18;;:37;158199:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;158336:9;158331:120;158355:11;;:18;;158351:1;:22;158331:120;;;158395:44;158411:11;;158423:1;158411:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;158427:8;;158436:1;158427:11;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;158395:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:44::i;:::-;158375:3;;;;;:::i;:::-;;;;158331:120;;;;158071:387;;;;:::o;105373:103::-;104611:13;:11;:13::i;:::-;105438:30:::1;105465:1;105438:18;:30::i;:::-;105373:103::o:0;155582:228::-;155701:9;155696:107;155720:8;:15;155716:1;:19;155696:107;;;155757:34;155766:11;155779:8;155788:1;155779:11;;;;;;;;:::i;:::-;;;;;;;;155757:8;:34::i;:::-;155737:3;;;;;:::i;:::-;;;;155696:107;;;;155582:228;;:::o;156760:912::-;156858:14;:27;156873:11;156858:27;;;;;;;;;;;;;;;;;;;;;;;;;156836:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;157026:4;156985:45;;:8;:21;156994:11;156985:21;;;;;;;;;;;;;;;:30;157007:7;156985:30;;;;;;;;;;;:37;;;;;;;;;;;;:45;;;156977:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;157119:10;157078:51;;157086:11;157078:28;;;157107:7;157078:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;;157056:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;157183:37;157199:11;157212:7;157183:15;:37::i;:::-;157275:1;157231:8;:21;157240:11;157231:21;;;;;;;;;;;;;;;:30;157253:7;157231:30;;;;;;;;;;;:41;;:45;;;;157327:5;157287:8;:21;157296:11;157287:21;;;;;;;;;;;;;;;:30;157309:7;157287:30;;;;;;;;;;;:37;;;:45;;;;;;;;;;;;;;;;;;157343:24;157370:8;:20;157379:10;157370:20;;;;;;;;;;;;;;;157343:47;;157406:6;157401:220;157422:6;:13;;;;157418:1;:17;157401:220;;;157474:7;157461:6;157468:1;157461:9;;;;;;;;:::i;:::-;;;;;;;;;;:20;157457:153;;;157514:6;157537:1;157521:6;:13;;;;:17;;;;:::i;:::-;157514:25;;;;;;;;:::i;:::-;;;;;;;;;;157502:6;157509:1;157502:9;;;;;;;;:::i;:::-;;;;;;;;;:37;;;;157558:6;:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;157589:5;;157457:153;157437:3;;;;;:::i;:::-;;;;157401:220;;;;157644:10;157636:28;;;157656:7;157636:28;;;;;;:::i;:::-;;;;;;;;156825:847;156760:912;;:::o;153953:124::-;104611:13;:11;:13::i;:::-;154009:6:::1;;;;;;;;;;;:15;;;154025:10;154037:6;;;;;;;;;;;:16;;;154062:4;154037:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;154009:60;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;153953:124::o:0;104725:87::-;104771:7;104798:6;;;;;;;;;;;104791:13;;104725:87;:::o;153353:150::-;104611:13;:11;:13::i;:::-;153475:19:::1;153459:6;;:36;;;;;;;;;;;;;;;;;;153353:150:::0;:::o;152311:54::-;;;;;;;;;;;;;;;;;:::o;153511:225::-;104611:13;:11;:13::i;:::-;153662:6:::1;153632:14;:27;153647:11;153632:27;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;153684:6;153679:49;;153727:1;153692:19;:32;153712:11;153692:32;;;;;;;;;;;;;;;:36;;;;153679:49;153511:225:::0;;:::o;161108:643::-;161228:7;161248:24;161288:9;161283:427;161307:11;;:18;;161303:1;:22;161283:427;;;161347:25;161375:102;161424:11;;161436:1;161424:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;161457:5;161375:30;:102::i;:::-;161347:130;;161497:9;161492:207;161516:8;:15;161512:1;:19;161492:207;;;161577:106;161616:11;;161628:1;161616:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;161653:8;161662:1;161653:11;;;;;;;;:::i;:::-;;;;;;;;161577:16;:106::i;:::-;161557:126;;;;;:::i;:::-;;;161533:3;;;;;:::i;:::-;;;;161492:207;;;;161332:378;161327:3;;;;;:::i;:::-;;;;161283:427;;;;161727:16;161720:23;;;161108:643;;;;;:::o;157680:383::-;157850:8;;:15;;157828:11;;:18;;:37;157806:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;157943:9;157938:118;157962:11;;:18;;157958:1;:22;157938:118;;;158002:42;158016:11;;158028:1;158016:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;158032:8;;158041:1;158032:11;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;158002:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:42::i;:::-;157982:3;;;;;:::i;:::-;;;;157938:118;;;;157680:383;;;;:::o;152425:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;154696:386::-;154842:14;:27;154857:11;154842:27;;;;;;;;;;;;;;;;;;;;;;;;;154820:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;154966:9;154961:114;154985:8;:15;154981:1;:19;154961:114;;;155022:41;155038:11;155051:8;155060:1;155051:11;;;;;;;;:::i;:::-;;;;;;;;155022:15;:41::i;:::-;155002:3;;;;;:::i;:::-;;;;154961:114;;;;154696:386;;:::o;153169:176::-;153277:4;153301:8;:20;153310:10;153301:20;;;;;;;;;;;;;;;:29;153322:7;153301:29;;;;;;;;;;;:36;;;;;;;;;;;;153294:43;;153169:176;;;;:::o;105631:201::-;104611:13;:11;:13::i;:::-;105740:1:::1;105720:22;;:8;:22;;;;105712:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;105796:28;105815:8;105796:18;:28::i;:::-;105631:201:::0;:::o;153744:::-;104611:13;:11;:13::i;:::-;153917:20:::1;153882:19;:32;153902:11;153882:32;;;;;;;;;;;;;;;:55;;;;153744:201:::0;;:::o;154085:603::-;85332:21;:19;:21::i;:::-;154226:14:::1;:27;154241:11;154226:27;;;;;;;;;;;;;;;;;;;;;;;;;154204:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;154345:23;154371:38;154388:11;154401:7;154371:16;:38::i;:::-;154345:64;;154442:1;154424:15;:19;154420:261;;;154486:6;;;;;;;;;;;:15;;;154502:10;154514:15;154486:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;154460:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;154657:12;154613:8;:21;154622:11;154613:21;;;;;;;;;;;;;;;:30;154635:7;154613:30;;;;;;;;;;;:41;;:56;;;;154420:261;154193:495;85376:20:::0;:18;:20::i;:::-;154085:603;;:::o;104890:132::-;104965:12;:10;:12::i;:::-;104954:23;;:7;:5;:7::i;:::-;:23;;;104946:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;104890:132::o;105992:191::-;106066:16;106085:6;;;;;;;;;;;106066:25;;106111:8;106102:6;;:17;;;;;;;;;;;;;;;;;;106166:8;106135:40;;106156:8;106135:40;;;;;;;;;;;;106055:128;105992:191;:::o;85412:293::-;84814:1;85546:7;;:19;;85538:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;84814:1;85679:7;:18;;;;85412:293::o;85713:213::-;84770:1;85896:7;:22;;;;85713:213::o;103276:98::-;103329:7;103356:10;103349:17;;103276:98;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:139::-;798:5;836:6;823:20;814:29;;852:33;879:5;852:33;:::i;:::-;752:139;;;;:::o;897:143::-;954:5;985:6;979:13;970:22;;1001:33;1028:5;1001:33;:::i;:::-;897:143;;;;:::o;1063:568::-;1136:8;1146:6;1196:3;1189:4;1181:6;1177:17;1173:27;1163:122;;1204:79;;:::i;:::-;1163:122;1317:6;1304:20;1294:30;;1347:18;1339:6;1336:30;1333:117;;;1369:79;;:::i;:::-;1333:117;1483:4;1475:6;1471:17;1459:29;;1537:3;1529:4;1521:6;1517:17;1507:8;1503:32;1500:41;1497:128;;;1544:79;;:::i;:::-;1497:128;1063:568;;;;;:::o;1656:595::-;1756:8;1766:6;1816:3;1809:4;1801:6;1797:17;1793:27;1783:122;;1824:79;;:::i;:::-;1783:122;1937:6;1924:20;1914:30;;1967:18;1959:6;1956:30;1953:117;;;1989:79;;:::i;:::-;1953:117;2103:4;2095:6;2091:17;2079:29;;2157:3;2149:4;2141:6;2137:17;2127:8;2123:32;2120:41;2117:128;;;2164:79;;:::i;:::-;2117:128;1656:595;;;;;:::o;2274:370::-;2345:5;2394:3;2387:4;2379:6;2375:17;2371:27;2361:122;;2402:79;;:::i;:::-;2361:122;2519:6;2506:20;2544:94;2634:3;2626:6;2619:4;2611:6;2607:17;2544:94;:::i;:::-;2535:103;;2351:293;2274:370;;;;:::o;2650:133::-;2693:5;2731:6;2718:20;2709:29;;2747:30;2771:5;2747:30;:::i;:::-;2650:133;;;;:::o;2789:137::-;2843:5;2874:6;2868:13;2859:22;;2890:30;2914:5;2890:30;:::i;:::-;2789:137;;;;:::o;2932:139::-;2978:5;3016:6;3003:20;2994:29;;3032:33;3059:5;3032:33;:::i;:::-;2932:139;;;;:::o;3077:143::-;3134:5;3165:6;3159:13;3150:22;;3181:33;3208:5;3181:33;:::i;:::-;3077:143;;;;:::o;3226:329::-;3285:6;3334:2;3322:9;3313:7;3309:23;3305:32;3302:119;;;3340:79;;:::i;:::-;3302:119;3460:1;3485:53;3530:7;3521:6;3510:9;3506:22;3485:53;:::i;:::-;3475:63;;3431:117;3226:329;;;;:::o;3561:351::-;3631:6;3680:2;3668:9;3659:7;3655:23;3651:32;3648:119;;;3686:79;;:::i;:::-;3648:119;3806:1;3831:64;3887:7;3878:6;3867:9;3863:22;3831:64;:::i;:::-;3821:74;;3777:128;3561:351;;;;:::o;3918:474::-;3986:6;3994;4043:2;4031:9;4022:7;4018:23;4014:32;4011:119;;;4049:79;;:::i;:::-;4011:119;4169:1;4194:53;4239:7;4230:6;4219:9;4215:22;4194:53;:::i;:::-;4184:63;;4140:117;4296:2;4322:53;4367:7;4358:6;4347:9;4343:22;4322:53;:::i;:::-;4312:63;;4267:118;3918:474;;;;;:::o;4398:684::-;4491:6;4499;4548:2;4536:9;4527:7;4523:23;4519:32;4516:119;;;4554:79;;:::i;:::-;4516:119;4674:1;4699:53;4744:7;4735:6;4724:9;4720:22;4699:53;:::i;:::-;4689:63;;4645:117;4829:2;4818:9;4814:18;4801:32;4860:18;4852:6;4849:30;4846:117;;;4882:79;;:::i;:::-;4846:117;4987:78;5057:7;5048:6;5037:9;5033:22;4987:78;:::i;:::-;4977:88;;4772:303;4398:684;;;;;:::o;5088:468::-;5153:6;5161;5210:2;5198:9;5189:7;5185:23;5181:32;5178:119;;;5216:79;;:::i;:::-;5178:119;5336:1;5361:53;5406:7;5397:6;5386:9;5382:22;5361:53;:::i;:::-;5351:63;;5307:117;5463:2;5489:50;5531:7;5522:6;5511:9;5507:22;5489:50;:::i;:::-;5479:60;;5434:115;5088:468;;;;;:::o;5562:474::-;5630:6;5638;5687:2;5675:9;5666:7;5662:23;5658:32;5655:119;;;5693:79;;:::i;:::-;5655:119;5813:1;5838:53;5883:7;5874:6;5863:9;5859:22;5838:53;:::i;:::-;5828:63;;5784:117;5940:2;5966:53;6011:7;6002:6;5991:9;5987:22;5966:53;:::i;:::-;5956:63;;5911:118;5562:474;;;;;:::o;6042:704::-;6137:6;6145;6153;6202:2;6190:9;6181:7;6177:23;6173:32;6170:119;;;6208:79;;:::i;:::-;6170:119;6356:1;6345:9;6341:17;6328:31;6386:18;6378:6;6375:30;6372:117;;;6408:79;;:::i;:::-;6372:117;6521:80;6593:7;6584:6;6573:9;6569:22;6521:80;:::i;:::-;6503:98;;;;6299:312;6650:2;6676:53;6721:7;6712:6;6701:9;6697:22;6676:53;:::i;:::-;6666:63;;6621:118;6042:704;;;;;:::o;6752:988::-;6901:6;6909;6917;6925;6974:2;6962:9;6953:7;6949:23;6945:32;6942:119;;;6980:79;;:::i;:::-;6942:119;7128:1;7117:9;7113:17;7100:31;7158:18;7150:6;7147:30;7144:117;;;7180:79;;:::i;:::-;7144:117;7293:80;7365:7;7356:6;7345:9;7341:22;7293:80;:::i;:::-;7275:98;;;;7071:312;7450:2;7439:9;7435:18;7422:32;7481:18;7473:6;7470:30;7467:117;;;7503:79;;:::i;:::-;7467:117;7616:107;7715:7;7706:6;7695:9;7691:22;7616:107;:::i;:::-;7598:125;;;;7393:340;6752:988;;;;;;;:::o;7746:345::-;7813:6;7862:2;7850:9;7841:7;7837:23;7833:32;7830:119;;;7868:79;;:::i;:::-;7830:119;7988:1;8013:61;8066:7;8057:6;8046:9;8042:22;8013:61;:::i;:::-;8003:71;;7959:125;7746:345;;;;:::o;8097:351::-;8167:6;8216:2;8204:9;8195:7;8191:23;8187:32;8184:119;;;8222:79;;:::i;:::-;8184:119;8342:1;8367:64;8423:7;8414:6;8403:9;8399:22;8367:64;:::i;:::-;8357:74;;8313:128;8097:351;;;;:::o;8454:179::-;8523:10;8544:46;8586:3;8578:6;8544:46;:::i;:::-;8622:4;8617:3;8613:14;8599:28;;8454:179;;;;:::o;8639:118::-;8726:24;8744:5;8726:24;:::i;:::-;8721:3;8714:37;8639:118;;:::o;8793:732::-;8912:3;8941:54;8989:5;8941:54;:::i;:::-;9011:86;9090:6;9085:3;9011:86;:::i;:::-;9004:93;;9121:56;9171:5;9121:56;:::i;:::-;9200:7;9231:1;9216:284;9241:6;9238:1;9235:13;9216:284;;;9317:6;9311:13;9344:63;9403:3;9388:13;9344:63;:::i;:::-;9337:70;;9430:60;9483:6;9430:60;:::i;:::-;9420:70;;9276:224;9263:1;9260;9256:9;9251:14;;9216:284;;;9220:14;9516:3;9509:10;;8917:608;;;8793:732;;;;:::o;9531:109::-;9612:21;9627:5;9612:21;:::i;:::-;9607:3;9600:34;9531:109;;:::o;9646:161::-;9748:52;9794:5;9748:52;:::i;:::-;9743:3;9736:65;9646:161;;:::o;9813:366::-;9955:3;9976:67;10040:2;10035:3;9976:67;:::i;:::-;9969:74;;10052:93;10141:3;10052:93;:::i;:::-;10170:2;10165:3;10161:12;10154:19;;9813:366;;;:::o;10185:::-;10327:3;10348:67;10412:2;10407:3;10348:67;:::i;:::-;10341:74;;10424:93;10513:3;10424:93;:::i;:::-;10542:2;10537:3;10533:12;10526:19;;10185:366;;;:::o;10557:::-;10699:3;10720:67;10784:2;10779:3;10720:67;:::i;:::-;10713:74;;10796:93;10885:3;10796:93;:::i;:::-;10914:2;10909:3;10905:12;10898:19;;10557:366;;;:::o;10929:::-;11071:3;11092:67;11156:2;11151:3;11092:67;:::i;:::-;11085:74;;11168:93;11257:3;11168:93;:::i;:::-;11286:2;11281:3;11277:12;11270:19;;10929:366;;;:::o;11301:::-;11443:3;11464:67;11528:2;11523:3;11464:67;:::i;:::-;11457:74;;11540:93;11629:3;11540:93;:::i;:::-;11658:2;11653:3;11649:12;11642:19;;11301:366;;;:::o;11673:::-;11815:3;11836:67;11900:2;11895:3;11836:67;:::i;:::-;11829:74;;11912:93;12001:3;11912:93;:::i;:::-;12030:2;12025:3;12021:12;12014:19;;11673:366;;;:::o;12045:::-;12187:3;12208:67;12272:2;12267:3;12208:67;:::i;:::-;12201:74;;12284:93;12373:3;12284:93;:::i;:::-;12402:2;12397:3;12393:12;12386:19;;12045:366;;;:::o;12417:::-;12559:3;12580:67;12644:2;12639:3;12580:67;:::i;:::-;12573:74;;12656:93;12745:3;12656:93;:::i;:::-;12774:2;12769:3;12765:12;12758:19;;12417:366;;;:::o;12789:::-;12931:3;12952:67;13016:2;13011:3;12952:67;:::i;:::-;12945:74;;13028:93;13117:3;13028:93;:::i;:::-;13146:2;13141:3;13137:12;13130:19;;12789:366;;;:::o;13161:::-;13303:3;13324:67;13388:2;13383:3;13324:67;:::i;:::-;13317:74;;13400:93;13489:3;13400:93;:::i;:::-;13518:2;13513:3;13509:12;13502:19;;13161:366;;;:::o;13533:108::-;13610:24;13628:5;13610:24;:::i;:::-;13605:3;13598:37;13533:108;;:::o;13647:118::-;13734:24;13752:5;13734:24;:::i;:::-;13729:3;13722:37;13647:118;;:::o;13771:222::-;13864:4;13902:2;13891:9;13887:18;13879:26;;13915:71;13983:1;13972:9;13968:17;13959:6;13915:71;:::i;:::-;13771:222;;;;:::o;13999:332::-;14120:4;14158:2;14147:9;14143:18;14135:26;;14171:71;14239:1;14228:9;14224:17;14215:6;14171:71;:::i;:::-;14252:72;14320:2;14309:9;14305:18;14296:6;14252:72;:::i;:::-;13999:332;;;;;:::o;14337:373::-;14480:4;14518:2;14507:9;14503:18;14495:26;;14567:9;14561:4;14557:20;14553:1;14542:9;14538:17;14531:47;14595:108;14698:4;14689:6;14595:108;:::i;:::-;14587:116;;14337:373;;;;:::o;14716:210::-;14803:4;14841:2;14830:9;14826:18;14818:26;;14854:65;14916:1;14905:9;14901:17;14892:6;14854:65;:::i;:::-;14716:210;;;;:::o;14932:320::-;15047:4;15085:2;15074:9;15070:18;15062:26;;15098:65;15160:1;15149:9;15145:17;15136:6;15098:65;:::i;:::-;15173:72;15241:2;15230:9;15226:18;15217:6;15173:72;:::i;:::-;14932:320;;;;;:::o;15258:252::-;15366:4;15404:2;15393:9;15389:18;15381:26;;15417:86;15500:1;15489:9;15485:17;15476:6;15417:86;:::i;:::-;15258:252;;;;:::o;15516:419::-;15682:4;15720:2;15709:9;15705:18;15697:26;;15769:9;15763:4;15759:20;15755:1;15744:9;15740:17;15733:47;15797:131;15923:4;15797:131;:::i;:::-;15789:139;;15516:419;;;:::o;15941:::-;16107:4;16145:2;16134:9;16130:18;16122:26;;16194:9;16188:4;16184:20;16180:1;16169:9;16165:17;16158:47;16222:131;16348:4;16222:131;:::i;:::-;16214:139;;15941:419;;;:::o;16366:::-;16532:4;16570:2;16559:9;16555:18;16547:26;;16619:9;16613:4;16609:20;16605:1;16594:9;16590:17;16583:47;16647:131;16773:4;16647:131;:::i;:::-;16639:139;;16366:419;;;:::o;16791:::-;16957:4;16995:2;16984:9;16980:18;16972:26;;17044:9;17038:4;17034:20;17030:1;17019:9;17015:17;17008:47;17072:131;17198:4;17072:131;:::i;:::-;17064:139;;16791:419;;;:::o;17216:::-;17382:4;17420:2;17409:9;17405:18;17397:26;;17469:9;17463:4;17459:20;17455:1;17444:9;17440:17;17433:47;17497:131;17623:4;17497:131;:::i;:::-;17489:139;;17216:419;;;:::o;17641:::-;17807:4;17845:2;17834:9;17830:18;17822:26;;17894:9;17888:4;17884:20;17880:1;17869:9;17865:17;17858:47;17922:131;18048:4;17922:131;:::i;:::-;17914:139;;17641:419;;;:::o;18066:::-;18232:4;18270:2;18259:9;18255:18;18247:26;;18319:9;18313:4;18309:20;18305:1;18294:9;18290:17;18283:47;18347:131;18473:4;18347:131;:::i;:::-;18339:139;;18066:419;;;:::o;18491:::-;18657:4;18695:2;18684:9;18680:18;18672:26;;18744:9;18738:4;18734:20;18730:1;18719:9;18715:17;18708:47;18772:131;18898:4;18772:131;:::i;:::-;18764:139;;18491:419;;;:::o;18916:::-;19082:4;19120:2;19109:9;19105:18;19097:26;;19169:9;19163:4;19159:20;19155:1;19144:9;19140:17;19133:47;19197:131;19323:4;19197:131;:::i;:::-;19189:139;;18916:419;;;:::o;19341:::-;19507:4;19545:2;19534:9;19530:18;19522:26;;19594:9;19588:4;19584:20;19580:1;19569:9;19565:17;19558:47;19622:131;19748:4;19622:131;:::i;:::-;19614:139;;19341:419;;;:::o;19766:222::-;19859:4;19897:2;19886:9;19882:18;19874:26;;19910:71;19978:1;19967:9;19963:17;19954:6;19910:71;:::i;:::-;19766:222;;;;:::o;19994:740::-;20087:4;20093:6;20149:11;20136:25;20249:1;20243:4;20239:12;20228:8;20212:14;20208:29;20204:48;20184:18;20180:73;20170:168;;20257:79;;:::i;:::-;20170:168;20369:18;20359:8;20355:33;20347:41;;20421:4;20408:18;20398:28;;20449:18;20441:6;20438:30;20435:117;;;20471:79;;:::i;:::-;20435:117;20579:2;20573:4;20569:13;20561:21;;20636:4;20628:6;20624:17;20608:14;20604:38;20598:4;20594:49;20591:136;;;20646:79;;:::i;:::-;20591:136;20100:634;19994:740;;;;;:::o;20740:129::-;20774:6;20801:20;;:::i;:::-;20791:30;;20830:33;20858:4;20850:6;20830:33;:::i;:::-;20740:129;;;:::o;20875:75::-;20908:6;20941:2;20935:9;20925:19;;20875:75;:::o;20956:311::-;21033:4;21123:18;21115:6;21112:30;21109:56;;;21145:18;;:::i;:::-;21109:56;21195:4;21187:6;21183:17;21175:25;;21255:4;21249;21245:15;21237:23;;20956:311;;;:::o;21273:132::-;21340:4;21363:3;21355:11;;21393:4;21388:3;21384:14;21376:22;;21273:132;;;:::o;21411:114::-;21478:6;21512:5;21506:12;21496:22;;21411:114;;;:::o;21531:113::-;21601:4;21633;21628:3;21624:14;21616:22;;21531:113;;;:::o;21650:184::-;21749:11;21783:6;21778:3;21771:19;21823:4;21818:3;21814:14;21799:29;;21650:184;;;;:::o;21840:169::-;21924:11;21958:6;21953:3;21946:19;21998:4;21993:3;21989:14;21974:29;;21840:169;;;;:::o;22015:305::-;22055:3;22074:20;22092:1;22074:20;:::i;:::-;22069:25;;22108:20;22126:1;22108:20;:::i;:::-;22103:25;;22262:1;22194:66;22190:74;22187:1;22184:81;22181:107;;;22268:18;;:::i;:::-;22181:107;22312:1;22309;22305:9;22298:16;;22015:305;;;;:::o;22326:348::-;22366:7;22389:20;22407:1;22389:20;:::i;:::-;22384:25;;22423:20;22441:1;22423:20;:::i;:::-;22418:25;;22611:1;22543:66;22539:74;22536:1;22533:81;22528:1;22521:9;22514:17;22510:105;22507:131;;;22618:18;;:::i;:::-;22507:131;22666:1;22663;22659:9;22648:20;;22326:348;;;;:::o;22680:191::-;22720:4;22740:20;22758:1;22740:20;:::i;:::-;22735:25;;22774:20;22792:1;22774:20;:::i;:::-;22769:25;;22813:1;22810;22807:8;22804:34;;;22818:18;;:::i;:::-;22804:34;22863:1;22860;22856:9;22848:17;;22680:191;;;;:::o;22877:96::-;22914:7;22943:24;22961:5;22943:24;:::i;:::-;22932:35;;22877:96;;;:::o;22979:90::-;23013:7;23056:5;23049:13;23042:21;23031:32;;22979:90;;;:::o;23075:126::-;23112:7;23152:42;23145:5;23141:54;23130:65;;23075:126;;;:::o;23207:77::-;23244:7;23273:5;23262:16;;23207:77;;;:::o;23290:141::-;23355:9;23388:37;23419:5;23388:37;:::i;:::-;23375:50;;23290:141;;;:::o;23437:126::-;23487:9;23520:37;23551:5;23520:37;:::i;:::-;23507:50;;23437:126;;;:::o;23569:113::-;23619:9;23652:24;23670:5;23652:24;:::i;:::-;23639:37;;23569:113;;;:::o;23688:281::-;23771:27;23793:4;23771:27;:::i;:::-;23763:6;23759:40;23901:6;23889:10;23886:22;23865:18;23853:10;23850:34;23847:62;23844:88;;;23912:18;;:::i;:::-;23844:88;23952:10;23948:2;23941:22;23731:238;23688:281;;:::o;23975:233::-;24014:3;24037:24;24055:5;24037:24;:::i;:::-;24028:33;;24083:66;24076:5;24073:77;24070:103;;;24153:18;;:::i;:::-;24070:103;24200:1;24193:5;24189:13;24182:20;;23975:233;;;:::o;24214:180::-;24262:77;24259:1;24252:88;24359:4;24356:1;24349:15;24383:4;24380:1;24373:15;24400:180;24448:77;24445:1;24438:88;24545:4;24542:1;24535:15;24569:4;24566:1;24559:15;24586:180;24634:77;24631:1;24624:88;24731:4;24728:1;24721:15;24755:4;24752:1;24745:15;24772:180;24820:77;24817:1;24810:88;24917:4;24914:1;24907:15;24941:4;24938:1;24931:15;24958:117;25067:1;25064;25057:12;25081:117;25190:1;25187;25180:12;25204:117;25313:1;25310;25303:12;25327:117;25436:1;25433;25426:12;25450:117;25559:1;25556;25549:12;25573:117;25682:1;25679;25672:12;25696:117;25805:1;25802;25795:12;25819:117;25928:1;25925;25918:12;25942:102;25983:6;26034:2;26030:7;26025:2;26018:5;26014:14;26010:28;26000:38;;25942:102;;;:::o;26050:160::-;26190:12;26186:1;26178:6;26174:14;26167:36;26050:160;:::o;26216:225::-;26356:34;26352:1;26344:6;26340:14;26333:58;26425:8;26420:2;26412:6;26408:15;26401:33;26216:225;:::o;26447:221::-;26587:34;26583:1;26575:6;26571:14;26564:58;26656:4;26651:2;26643:6;26639:15;26632:29;26447:221;:::o;26674:163::-;26814:15;26810:1;26802:6;26798:14;26791:39;26674:163;:::o;26843:182::-;26983:34;26979:1;26971:6;26967:14;26960:58;26843:182;:::o;27031:164::-;27171:16;27167:1;27159:6;27155:14;27148:40;27031:164;:::o;27201:160::-;27341:12;27337:1;27329:6;27325:14;27318:36;27201:160;:::o;27367:182::-;27507:34;27503:1;27495:6;27491:14;27484:58;27367:182;:::o;27555:181::-;27695:33;27691:1;27683:6;27679:14;27672:57;27555:181;:::o;27742:240::-;27882:34;27878:1;27870:6;27866:14;27859:58;27951:23;27946:2;27938:6;27934:15;27927:48;27742:240;:::o;27988:122::-;28061:24;28079:5;28061:24;:::i;:::-;28054:5;28051:35;28041:63;;28100:1;28097;28090:12;28041:63;27988:122;:::o;28116:116::-;28186:21;28201:5;28186:21;:::i;:::-;28179:5;28176:32;28166:60;;28222:1;28219;28212:12;28166:60;28116:116;:::o;28238:122::-;28311:24;28329:5;28311:24;:::i;:::-;28304:5;28301:35;28291:63;;28350:1;28347;28340:12;28291:63;28238:122;:::o
Swarm Source
ipfs://b32ddb07e277d5d69f1ef52ab749719650831000d7b7dd2f5f74dde2905e7e58
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.