Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- Lottery
- Optimization enabled
- false
- Compiler version
- v0.8.20+commit.a1b79de6
- EVM Version
- paris
- Verified at
- 2024-05-29T12:44:58.411503Z
Constructor Arguments
0x000000000000000000000000393f1423aa5d058a3e893d0f70ce6e12b34e63df000000000000000000000000780fb5aca83f2e3f57ee18cc3094988ef49d8c3d0000000000000000000000000ca83dd56af172a1e04b667d6e64446d0b88c4a4000000000000000000000000bb78efaaaf9223b4840ea7defdc379a13b16399b
Arg [0] (address) : 0x393f1423aa5d058a3e893d0f70ce6e12b34e63df
Arg [1] (address) : 0x780fb5aca83f2e3f57ee18cc3094988ef49d8c3d
Arg [2] (address) : 0x0ca83dd56af172a1e04b667d6e64446d0b88c4a4
Arg [3] (address) : 0xbb78efaaaf9223b4840ea7defdc379a13b16399b
contracts/Lottery.sol
// SPDX-License-Identifier: Unlicensed pragma solidity 0.8.20; import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import "./utils/VRFConsumerBaseV2.sol"; import "./interfaces/IErinaceusVRF.sol"; import "hardhat/console.sol"; interface ILolik { function submit(address _referral) external payable returns (uint256); function swap(uint256 amount) external; function getPooledFtnByShares(uint256 _sharesAmount) external view returns (uint256); function getSharesByPooledFtn(uint256 _ftnAmount) external view returns (uint256); } contract Lottery is VRFConsumerBaseV2, Ownable { uint256 public currentPoolID; uint256 public nextPoolID; uint256 public day; // test IErinaceusVRF public erinaceusVRF; ILolik public Lolik; ILolik public LolikWithdraw; IERC20 public stFTN; uint64 public subID; uint16 public requestConfirmations; uint32 public gasLimit; bytes32 public keyHash; // tokens that are not claimed yet uint256 public remainingTokens; uint256 public teamRewards; uint256 public totalDeposit; address public team; struct Pool { uint256 poolStart; uint32 countOfWinners; uint256 totalDeposit; uint256 totalTickets; uint256 duration; uint256 lastUpdateTime; uint256[] winnersInPool; uint256 rewardForRound; PoolStatus poolStatus; } struct PoolFlag { uint256 totalDeposit; uint256 totalTickets; uint256 lastUpdateTime; } struct User { uint256 depositFTN; uint256 tickets; uint256 lastUpdatedTime; } // poolId => current user ID mapping(uint256 => uint256) public currentUserIDInPool; // poolId => Pool struct mapping(uint256 => Pool) public poolInfo; // poolId => flagId => poolFlag struct mapping(uint256 => mapping(uint256 => PoolFlag)) public poolFlag; // User address => poolID => UserID mapping(address => mapping(uint256 => uint256)) public userID; // PoolID => UserID => UserInfo mapping(uint256 => mapping(uint256 => User)) public userInfo; enum PoolStatus { notStarted, started, finished } event NewRoundAdded(uint256 indexed id, uint256 duration, uint256 start, uint256 countOfWinners); event RoundFinished(uint256 indexed id, uint256 rewardsForRound, uint256 totalDeposit); event Stake(address indexed user, uint256 amount); event UnStake(address indexed user, uint256 amount); constructor( address _erinaceusVRF, address _vaultContract, address _withdrowalContract, address _team ) VRFConsumerBaseV2(_erinaceusVRF) { erinaceusVRF = IErinaceusVRF(_erinaceusVRF); LolikWithdraw = ILolik(_withdrowalContract); Lolik = ILolik(_vaultContract); stFTN = IERC20(_vaultContract); team = _team; day = 28000; } fallback() external payable {} receive() external payable {} function vrfSetup( uint64 _subID, bytes32 _keyHash, uint32 _gasLimit, uint16 _requestConfirmations ) external onlyOwner{ subID = _subID; keyHash = _keyHash; gasLimit = _gasLimit; requestConfirmations = _requestConfirmations; } function newRound(uint256 duration, uint32 countOfWinners) external onlyOwner { currentPoolID = nextPoolID; if(currentPoolID > 0){ require( poolInfo[currentPoolID - 1].poolStatus == PoolStatus.finished, "Previous pool is not finished" ); } poolInfo[currentPoolID].duration = duration; poolInfo[currentPoolID].poolStart = block.timestamp; poolInfo[currentPoolID].poolStatus = PoolStatus.started; poolInfo[currentPoolID].countOfWinners = countOfWinners; poolInfo[currentPoolID].winnersInPool = new uint256[](countOfWinners); nextPoolID +=1; emit NewRoundAdded(currentPoolID, duration, block.timestamp, countOfWinners); } function finalizeRound() external { Pool storage pool = poolInfo[currentPoolID]; uint256 length = currentUserIDInPool[currentPoolID] / 100; require(pool.poolStart + pool.duration <= block.timestamp, "Pool is still active"); uint256 timestamp = block.timestamp; if (block.timestamp > pool.poolStart + pool.duration) { timestamp = pool.poolStart + pool.duration; } for (uint256 i; i <= length; i++) { poolFlag[currentPoolID][i].totalTickets += poolFlag[currentPoolID][i].totalDeposit * ((timestamp - poolFlag[currentPoolID][i].lastUpdateTime) / day); poolFlag[currentPoolID][i].lastUpdateTime = timestamp; } pool.totalTickets += pool.totalDeposit * ((timestamp - pool.lastUpdateTime) / day); pool.lastUpdateTime = timestamp; erinaceusVRF.requestRandomWords( keyHash, subID, requestConfirmations, gasLimit, pool.countOfWinners ); pool.poolStatus = PoolStatus.finished; pool.rewardForRound = (stFTN.balanceOf(address(this)) - remainingTokens - pool.totalDeposit) * pool.totalDeposit / totalDeposit; console.log(" ~ finalizeRound ~ pool.rewardForRound:", pool.rewardForRound); remainingTokens += pool.rewardForRound + pool.totalDeposit; teamRewards = stFTN.balanceOf(address(this)) - remainingTokens; emit RoundFinished(currentPoolID, pool.rewardForRound, pool.totalDeposit); } function stake() external payable { Pool storage pool = poolInfo[currentPoolID]; uint256 userId = userID[msg.sender][currentPoolID]; require( pool.poolStatus == PoolStatus.started, "Pool is not started yet" ); require(msg.value > 0, "Nothing to stake"); if (userId == 0) { userId = currentUserIDInPool[currentPoolID]; } User storage user = userInfo[currentPoolID][userId]; userID[msg.sender][currentPoolID] = userId; uint256 amount = Lolik.submit{value: msg.value}(address(this)); amount = Lolik.getPooledFtnByShares(amount); _updatePool(msg.sender, amount, true); userInfo[currentPoolID][userId] = User({ depositFTN: user.depositFTN += amount, tickets: user.tickets, lastUpdatedTime: block.timestamp }); totalDeposit += amount; if (userId == currentUserIDInPool[currentPoolID]) { currentUserIDInPool[currentPoolID]++; } emit Stake(msg.sender, amount); } function unstake(uint256 _amount, uint256 _poolID) external { uint256 userId = userID[msg.sender][_poolID]; User storage user = userInfo[_poolID][userId]; Pool storage pool = poolInfo[_poolID]; require(user.depositFTN >= _amount, "Insufficient deposit"); stFTN.approve(address(LolikWithdraw), _amount); LolikWithdraw.swap(_amount); if(_poolID == currentPoolID){ _updatePool(msg.sender, _amount, false); }else{ remainingTokens -= _amount; } totalDeposit -= _amount; user.depositFTN -= _amount; uint256 timestamp = block.timestamp; if (block.timestamp > pool.poolStart + pool.duration) { timestamp = pool.poolStart + pool.duration; } user.lastUpdatedTime = timestamp; _sendViaCall(payable(msg.sender), _amount); emit UnStake(msg.sender, _amount); } function fulfillRandomWords( uint256 requestId, uint256[] memory randomWords ) internal virtual override { poolInfo[currentPoolID].winnersInPool = randomWords; } function claimTeamRewards() external { if(teamRewards > 0){ stFTN.approve(address(LolikWithdraw), teamRewards); LolikWithdraw.swap(teamRewards); _sendViaCall(payable(team), teamRewards); teamRewards = 0; } } function check(uint256 poolID) public view returns (uint256[] memory winingNumbers) { uint256 userId = userID[msg.sender][poolID]; Pool memory pool = poolInfo[poolID]; User memory user = userInfo[poolID][userId]; uint256 userIsInFlag = userId / 100; uint256[] memory flagRange = new uint256[](2); if (userIsInFlag > 0) { for (uint256 i; i < userIsInFlag; i++) { flagRange[0] += poolFlag[poolID][i].totalTickets; } } flagRange[1] = flagRange[0] + poolFlag[poolID][userIsInFlag].totalTickets - 1; uint256[] memory usersTicketsRange = new uint256[](2); uint256 timestamp = block.timestamp; if (block.timestamp > pool.poolStart + pool.duration) { timestamp = pool.poolStart + pool.duration; } if (userId > 0) { for (uint256 j = userIsInFlag * 100; j < userId; j++) { usersTicketsRange[0] += userInfo[poolID][j].tickets + userInfo[poolID][j].depositFTN * ((timestamp - userInfo[poolID][j].lastUpdatedTime) / day); } usersTicketsRange[0] += flagRange[0]; } else { usersTicketsRange[0] = flagRange[0]; } usersTicketsRange[1] = usersTicketsRange[0] + user.tickets + user.depositFTN * ((timestamp - user.lastUpdatedTime) / day) - 1; uint256[] memory tempWiningNumbers = new uint256[]( poolInfo[poolID].countOfWinners ); uint256 index; for (uint32 k; k < pool.countOfWinners; k++) { if ( usersTicketsRange[0] <= pool.winnersInPool[k] && pool.winnersInPool[k] <= usersTicketsRange[1] ) { tempWiningNumbers[index] = pool.winnersInPool[k]; index++; } } if (index > 0) { winingNumbers = new uint256[](index); for (uint256 i; i < index; i++) { winingNumbers[i] = tempWiningNumbers[i]; } } } function claim(uint256 poolID) external { uint256[] memory winningNumbers = check(poolID); Pool memory pool = poolInfo[currentPoolID]; if (winningNumbers.length > 0) { stFTN.approve(address(LolikWithdraw), pool.rewardForRound * winningNumbers.length / pool.countOfWinners); LolikWithdraw.swap(pool.rewardForRound * winningNumbers.length / pool.countOfWinners); _sendViaCall(payable(msg.sender), pool.rewardForRound * winningNumbers.length / pool.countOfWinners); remainingTokens -= pool.rewardForRound * winningNumbers.length / pool.countOfWinners; } } function _updatePool( address userAddress, uint256 amount, bool isStake ) internal { Pool storage pool = poolInfo[currentPoolID]; uint256 timestamp = block.timestamp; if (block.timestamp > pool.poolStart + pool.duration) { timestamp = pool.poolStart + pool.duration; } pool.totalTickets += pool.totalDeposit * ((timestamp - pool.lastUpdateTime) / day); pool.lastUpdateTime = timestamp; if (amount > 0) { if (isStake) { pool.totalDeposit += amount; uint256 userId = userID[userAddress][currentPoolID]; User storage user = userInfo[currentPoolID][userId]; { uint256 id = userId / 100; poolFlag[currentPoolID][id].totalTickets += poolFlag[currentPoolID][id].totalDeposit * ((timestamp - poolFlag[currentPoolID][id].lastUpdateTime) / day); poolFlag[currentPoolID][id].totalDeposit += amount; poolFlag[currentPoolID][id].lastUpdateTime = timestamp; } if (user.depositFTN > 0) { user.tickets += user.depositFTN * ((timestamp - user.lastUpdatedTime) / day); } if(totalDeposit + amount > 0) { pool.rewardForRound = (stFTN.balanceOf(address(this)) - remainingTokens - pool.totalDeposit) * pool.totalDeposit / (totalDeposit + amount); teamRewards = stFTN.balanceOf(address(this)) - remainingTokens - pool.totalDeposit - pool.rewardForRound; } } else { pool.totalDeposit -= amount; uint256 userId = userID[userAddress][currentPoolID]; User storage user = userInfo[currentPoolID][userId]; { uint256 id = userId / 100; poolFlag[currentPoolID][id].totalTickets += poolFlag[currentPoolID][id].totalDeposit * ((timestamp - poolFlag[currentPoolID][id].lastUpdateTime) / day); poolFlag[currentPoolID][id].totalDeposit -= amount; poolFlag[currentPoolID][id].lastUpdateTime = timestamp; } user.tickets += user.depositFTN * ((timestamp - user.lastUpdatedTime) / day); if(totalDeposit - amount > 0) { pool.rewardForRound = (stFTN.balanceOf(address(this)) - remainingTokens - pool.totalDeposit) * pool.totalDeposit / (totalDeposit - amount); teamRewards = stFTN.balanceOf(address(this)) - remainingTokens - pool.totalDeposit - pool.rewardForRound; } } } } function getChance(address _user) public view returns (uint256 chance){ uint256 userId = userID[_user][currentPoolID]; User memory user = userInfo[currentPoolID][userId]; Pool memory pool = poolInfo[currentPoolID]; uint256 timestamp = block.timestamp; if (block.timestamp > pool.poolStart + pool.duration) { timestamp = pool.poolStart + pool.duration; } uint256 userTickets = user.tickets + user.depositFTN * ((timestamp - user.lastUpdatedTime) / day); uint256 totalTickets = pool.totalTickets + pool.totalDeposit * ((timestamp - pool.lastUpdateTime) / day); chance = userTickets * 1e18 / totalTickets; } function _sendViaCall(address payable to, uint256 amount) internal { (bool sent, ) = to.call{value: amount}(""); if (!sent) { revert(); } } }
@openzeppelin/contracts/access/Ownable.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @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. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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); } }
@openzeppelin/contracts/security/ReentrancyGuard.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.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; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } }
@openzeppelin/contracts/token/ERC20/IERC20.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.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); }
@openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
contracts/interfaces/IErinaceusVRF.sol
// SPDX-License-Identifier: MIT pragma solidity 0.8.20; interface IErinaceusVRF { function requestRandomWords( bytes32 keyHash, uint64 subId, uint16 requestConfirmations, uint32 callbackGasLimit, uint32 numWords ) external; }
contracts/utils/VRFConsumerBaseV2.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** **************************************************************************** * @notice Interface for contracts using VRF randomness * ***************************************************************************** * @dev PURPOSE * * @dev Reggie the Random Oracle (not his real job) wants to provide randomness * @dev to Vera the verifier in such a way that Vera can be sure he's not * @dev making his output up to suit himself. Reggie provides Vera a public key * @dev to which he knows the secret key. Each time Vera provides a seed to * @dev Reggie, he gives back a value which is computed completely * @dev deterministically from the seed and the secret key. * * @dev Reggie provides a proof by which Vera can verify that the output was * @dev correctly computed once Reggie tells it to her, but without that proof, * @dev the output is indistinguishable to her from a uniform random sample * @dev from the output space. * * @dev The purpose of this contract is to make it easy for unrelated contracts * @dev to talk to Vera the verifier about the work Reggie is doing, to provide * @dev simple access to a verifiable source of randomness. It ensures 2 things: * @dev 1. The fulfillment came from the ErinaceusVRF * @dev 2. The consumer contract implements fulfillRandomWords. * ***************************************************************************** * @dev USAGE * * @dev Calling contracts must inherit from VRFConsumerBase, and can * @dev initialize VRFConsumerBase's attributes in their constructor as * @dev shown: * * @dev contract VRFConsumer { * @dev constructor(<other arguments>, address _erinaceusVRF, address _link) * @dev VRFConsumerBase(_erinaceusVRF) public { * @dev <initialization with other arguments goes here> * @dev } * @dev } * * @dev The oracle will have given you an ID for the VRF keypair they have * @dev committed to (let's call it keyHash). Create subscription, fund it * @dev and your consumer contract as a consumer of it (see ErinaceusVRFInterface * @dev subscription management functions). * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations, * @dev callbackGasLimit, numWords), * @dev see (ErinaceusVRFInterface for a description of the arguments). * * @dev Once the ErinaceusVRF has received and validated the oracle's response * @dev to your request, it will call your contract's fulfillRandomWords method. * * @dev The randomness argument to fulfillRandomWords is a set of random words * @dev generated from your requestId and the blockHash of the request. * * @dev If your contract could have concurrent requests open, you can use the * @dev requestId returned from requestRandomWords to track which response is associated * @dev with which randomness request. * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind, * @dev if your contract could have multiple requests in flight simultaneously. * * @dev Colliding `requestId`s are cryptographically impossible as long as seeds * @dev differ. * * ***************************************************************************** * @dev SECURITY CONSIDERATIONS * * @dev A method with the ability to call your fulfillRandomness method directly * @dev could spoof a VRF response with any random value, so it's critical that * @dev it cannot be directly called by anything other than this base contract * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method). * * @dev For your users to trust that your contract's random behavior is free * @dev from malicious interference, it's best if you can write it so that all * @dev behaviors implied by a VRF response are executed *during* your * @dev fulfillRandomness method. If your contract must store the response (or * @dev anything derived from it) and use it later, you must ensure that any * @dev user-significant behavior which depends on that stored value cannot be * @dev manipulated by a subsequent VRF request. * * @dev Similarly, both miners and the VRF oracle itself have some influence * @dev over the order in which VRF responses appear on the blockchain, so if * @dev your contract could have multiple VRF requests in flight simultaneously, * @dev you must ensure that the order in which the VRF responses arrive cannot * @dev be used to manipulate your contract's user-significant behavior. * * @dev Since the block hash of the block which contains the requestRandomness * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful * @dev miner could, in principle, fork the blockchain to evict the block * @dev containing the request, forcing the request to be included in a * @dev different block with a different hash, and therefore a different input * @dev to the VRF. However, such an attack would incur a substantial economic * @dev cost. This cost scales with the number of blocks the VRF oracle waits * @dev until it calls responds to a request. It is for this reason that * @dev that you can signal to an oracle you'd like them to wait longer before * @dev responding to the request (however this is not enforced in the contract * @dev and so remains effective only in the case of unmodified oracle software). */ abstract contract VRFConsumerBaseV2 { error OnlyErinaceusCanFulfill(address have, address want); // solhint-disable-next-line chainlink-solidity/prefix-immutable-variables-with-i address private immutable erinaceusVRF; /** * @param _erinaceusVRF address of ErinaceusVRF contract */ constructor(address _erinaceusVRF) { erinaceusVRF = _erinaceusVRF; } /** * @notice fulfillRandomness handles the VRF response. Your contract must * @notice implement it. See "SECURITY CONSIDERATIONS" above for important * @notice principles to keep in mind when implementing your fulfillRandomness * @notice method. * * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this * @dev signature, and will call it once it has verified the proof * @dev associated with the randomness. (It is triggered via a call to * @dev rawFulfillRandomness, below.) * * @param requestId The Id initially returned by requestRandomness * @param randomWords the VRF output expanded to the requested number of words */ // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual; // rawFulfillRandomness is called by ErinaceusVRF when it receives a valid VRF // proof. rawFulfillRandomness then calls fulfillRandomness, after validating // the origin of the call function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external { if (msg.sender != erinaceusVRF) { revert OnlyErinaceusCanFulfill(msg.sender, erinaceusVRF); } fulfillRandomWords(requestId, randomWords); } }
hardhat/console.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; function _sendLogPayloadImplementation(bytes memory payload) internal view { address consoleAddress = CONSOLE_ADDRESS; /// @solidity memory-safe-assembly assembly { pop( staticcall( gas(), consoleAddress, add(payload, 32), mload(payload), 0, 0 ) ) } } function _castToPure( function(bytes memory) internal view fnIn ) internal pure returns (function(bytes memory) pure fnOut) { assembly { fnOut := fnIn } } function _sendLogPayload(bytes memory payload) internal pure { _castToPure(_sendLogPayloadImplementation)(payload); } function log() internal pure { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure { _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 pure { _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 pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure { _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 pure { _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 pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal pure { _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 pure { _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 pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal pure { _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 pure { _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 pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal pure { _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 pure { _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 pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal pure { _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 pure { _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 pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
Compiler Settings
{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":false},"metadata":{"useLiteralContent":true},"libraries":{},"evmVersion":"paris"}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_erinaceusVRF","internalType":"address"},{"type":"address","name":"_vaultContract","internalType":"address"},{"type":"address","name":"_withdrowalContract","internalType":"address"},{"type":"address","name":"_team","internalType":"address"}]},{"type":"error","name":"OnlyErinaceusCanFulfill","inputs":[{"type":"address","name":"have","internalType":"address"},{"type":"address","name":"want","internalType":"address"}]},{"type":"event","name":"NewRoundAdded","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":true},{"type":"uint256","name":"duration","internalType":"uint256","indexed":false},{"type":"uint256","name":"start","internalType":"uint256","indexed":false},{"type":"uint256","name":"countOfWinners","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RoundFinished","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":true},{"type":"uint256","name":"rewardsForRound","internalType":"uint256","indexed":false},{"type":"uint256","name":"totalDeposit","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Stake","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UnStake","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"fallback","stateMutability":"payable"},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ILolik"}],"name":"Lolik","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ILolik"}],"name":"LolikWithdraw","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"winingNumbers","internalType":"uint256[]"}],"name":"check","inputs":[{"type":"uint256","name":"poolID","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claim","inputs":[{"type":"uint256","name":"poolID","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimTeamRewards","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"currentPoolID","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"currentUserIDInPool","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"day","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IErinaceusVRF"}],"name":"erinaceusVRF","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"finalizeRound","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint32","name":"","internalType":"uint32"}],"name":"gasLimit","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"chance","internalType":"uint256"}],"name":"getChance","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"keyHash","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"newRound","inputs":[{"type":"uint256","name":"duration","internalType":"uint256"},{"type":"uint32","name":"countOfWinners","internalType":"uint32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nextPoolID","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"totalDeposit","internalType":"uint256"},{"type":"uint256","name":"totalTickets","internalType":"uint256"},{"type":"uint256","name":"lastUpdateTime","internalType":"uint256"}],"name":"poolFlag","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"poolStart","internalType":"uint256"},{"type":"uint32","name":"countOfWinners","internalType":"uint32"},{"type":"uint256","name":"totalDeposit","internalType":"uint256"},{"type":"uint256","name":"totalTickets","internalType":"uint256"},{"type":"uint256","name":"duration","internalType":"uint256"},{"type":"uint256","name":"lastUpdateTime","internalType":"uint256"},{"type":"uint256","name":"rewardForRound","internalType":"uint256"},{"type":"uint8","name":"poolStatus","internalType":"enum Lottery.PoolStatus"}],"name":"poolInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rawFulfillRandomWords","inputs":[{"type":"uint256","name":"requestId","internalType":"uint256"},{"type":"uint256[]","name":"randomWords","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"remainingTokens","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"requestConfirmations","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"stFTN","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"stake","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint64","name":"","internalType":"uint64"}],"name":"subID","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"team","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"teamRewards","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalDeposit","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unstake","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"uint256","name":"_poolID","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"userID","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"depositFTN","internalType":"uint256"},{"type":"uint256","name":"tickets","internalType":"uint256"},{"type":"uint256","name":"lastUpdatedTime","internalType":"uint256"}],"name":"userInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"vrfSetup","inputs":[{"type":"uint64","name":"_subID","internalType":"uint64"},{"type":"bytes32","name":"_keyHash","internalType":"bytes32"},{"type":"uint32","name":"_gasLimit","internalType":"uint32"},{"type":"uint16","name":"_requestConfirmations","internalType":"uint16"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x60a06040523480156200001157600080fd5b5060405162004b1c38038062004b1c83398181016040528101906200003791906200031b565b838073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050506200008d62000081620001e560201b60201c565b620001ed60201b60201c565b83600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550616d60600381905550505050506200038d565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002e382620002b6565b9050919050565b620002f581620002d6565b81146200030157600080fd5b50565b6000815190506200031581620002ea565b92915050565b60008060008060808587031215620003385762000337620002b1565b5b6000620003488782880162000304565b94505060206200035b8782880162000304565b93505060406200036e8782880162000304565b9250506060620003818782880162000304565b91505092959194509250565b60805161476c620003b060003960008181610ddb0152610e2f015261476c6000f3fe6080604052600436106101f25760003560e01c806376ce29811161010d578063b345dc8c116100a0578063f2fde38b1161006f578063f2fde38b146106e5578063f41dfe2b1461070e578063f6153ccd14610739578063f68016b714610764578063fb2846291461078f576101f9565b8063b345dc8c14610627578063bf58390314610666578063cc4b97e114610691578063d7070ae2146106ba576101f9565b80638da5cb5b116100dc5780638da5cb5b1461057d5780639e2c8a5b146105a8578063aec47759146105d1578063b0fb162f146105fc576101f9565b806376ce2981146104ab5780637b76ac91146104e857806385f2aef2146105135780638921b0ca1461053e576101f9565b80633a4b66f11161018557806362a58fb81161015457806362a58fb814610401578063669f0e821461042c5780636acf26b914610469578063715018a614610494576101f9565b80633a4b66f114610364578063576a31701461036e5780635f72f4501461039957806361728f39146103d6576101f9565b80632add13c7116101c15780632add13c7146102a85780633121e7d7146102d3578063379607f514610310578063390724ac14610339576101f9565b80631526fe27146101fb578063195a79401461023f5780631e820325146102685780631fe543e31461027f576101f9565b366101f957005b005b34801561020757600080fd5b50610222600480360381019061021d919061369e565b6107a6565b604051610236989796959493929190613770565b60405180910390f35b34801561024b57600080fd5b50610266600480360381019061026191906138ca565b61080b565b005b34801561027457600080fd5b5061027d610887565b005b34801561028b57600080fd5b506102a660048036038101906102a19190613a8a565b610dd9565b005b3480156102b457600080fd5b506102bd610e99565b6040516102ca9190613ae6565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190613b5f565b610e9f565b6040516103079190613ae6565b60405180910390f35b34801561031c57600080fd5b506103376004803603810190610332919061369e565b611145565b005b34801561034557600080fd5b5061034e611483565b60405161035b9190613ae6565b60405180910390f35b61036c611489565b005b34801561037a57600080fd5b506103836118d7565b6040516103909190613beb565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb919061369e565b6118fd565b6040516103cd9190613cc4565b60405180910390f35b3480156103e257600080fd5b506103eb61210a565b6040516103f89190613cf5565b60405180910390f35b34801561040d57600080fd5b50610416612110565b6040516104239190613d1f565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e919061369e565b61212a565b6040516104609190613ae6565b60405180910390f35b34801561047557600080fd5b5061047e612142565b60405161048b9190613d5b565b60405180910390f35b3480156104a057600080fd5b506104a9612168565b005b3480156104b757600080fd5b506104d260048036038101906104cd9190613d76565b61217c565b6040516104df9190613ae6565b60405180910390f35b3480156104f457600080fd5b506104fd6121a1565b60405161050a9190613ae6565b60405180910390f35b34801561051f57600080fd5b506105286121a7565b6040516105359190613dc5565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190613de0565b6121cd565b60405161057493929190613e20565b60405180910390f35b34801561058957600080fd5b50610592612204565b60405161059f9190613dc5565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190613de0565b61222d565b005b3480156105dd57600080fd5b506105e6612560565b6040516105f39190613e78565b60405180910390f35b34801561060857600080fd5b50610611612586565b60405161061e9190613ea2565b60405180910390f35b34801561063357600080fd5b5061064e60048036038101906106499190613de0565b61259a565b60405161065d93929190613e20565b60405180910390f35b34801561067257600080fd5b5061067b6125d1565b6040516106889190613ae6565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190613ebd565b6125d7565b005b3480156106c657600080fd5b506106cf612813565b6040516106dc9190613ae6565b60405180910390f35b3480156106f157600080fd5b5061070c60048036038101906107079190613b5f565b612819565b005b34801561071a57600080fd5b5061072361289c565b6040516107309190613d5b565b60405180910390f35b34801561074557600080fd5b5061074e6128c2565b60405161075b9190613ae6565b60405180910390f35b34801561077057600080fd5b506107796128c8565b6040516107869190613efd565b60405180910390f35b34801561079b57600080fd5b506107a46128de565b005b600f6020528060005260406000206000915090508060000154908060010160009054906101000a900463ffffffff16908060020154908060030154908060040154908060050154908060070154908060080160009054906101000a900460ff16905088565b610813612a76565b83600760146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508260098190555081600860006101000a81548163ffffffff021916908363ffffffff160217905550806007601c6101000a81548161ffff021916908361ffff16021790555050505050565b6000600f60006001548152602001908152602001600020905060006064600e60006001548152602001908152602001600020546108c49190613f76565b905042826004015483600001546108db9190613fa7565b111561091c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091390614038565b60405180910390fd5b6000429050826004015483600001546109359190613fa7565b42111561095357826004015483600001546109509190613fa7565b90505b60005b828111610a5357600354601060006001548152602001908152602001600020600083815260200190815260200160002060020154836109959190614058565b61099f9190613f76565b6010600060015481526020019081526020016000206000838152602001908152602001600020600001546109d3919061408c565b60106000600154815260200190815260200160002060008381526020019081526020016000206001016000828254610a0b9190613fa7565b92505081905550816010600060015481526020019081526020016000206000838152602001908152602001600020600201819055508080610a4b906140ce565b915050610956565b50600354836005015482610a679190614058565b610a719190613f76565b8360020154610a80919061408c565b836003016000828254610a939190613fa7565b92505081905550808360050181905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d30600954600760149054906101000a900467ffffffffffffffff166007601c9054906101000a900461ffff16600860009054906101000a900463ffffffff168860010160009054906101000a900463ffffffff166040518663ffffffff1660e01b8152600401610b54959493929190614116565b600060405180830381600087803b158015610b6e57600080fd5b505af1158015610b82573d6000803e3d6000fd5b5050505060028360080160006101000a81548160ff02191690836002811115610bae57610bad6136f9565b5b0217905550600c5483600201548460020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c1e9190613dc5565b602060405180830381865afa158015610c3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5f919061417e565b610c699190614058565b610c739190614058565b610c7d919061408c565b610c879190613f76565b8360070181905550610cb5604051806060016040528060278152602001614710602791398460070154612af4565b82600201548360070154610cc99190613fa7565b600a6000828254610cda9190613fa7565b92505081905550600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d3f9190613dc5565b602060405180830381865afa158015610d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d80919061417e565b610d8a9190614058565b600b819055506001547f87d39ec94082b342cc157bbd80096ad2fa03e1698a57924ad16e36709cb0e28784600701548560020154604051610dcc9291906141ab565b60405180910390a2505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e8b57337f00000000000000000000000000000000000000000000000000000000000000006040517f1cdc5ebb000000000000000000000000000000000000000000000000000000008152600401610e829291906141d4565b60405180910390fd5b610e958282612b90565b5050565b60015481565b600080601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600154815260200190815260200160002054905060006012600060015481526020019081526020016000206000838152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505090506000600f6000600154815260200190815260200160002060405180610120016040529081600082015481526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820180548060200260200160405190810160405280929190818152602001828054801561101457602002820191906000526020600020905b815481526020019060010190808311611000575b50505050508152602001600782015481526020016008820160009054906101000a900460ff16600281111561104c5761104b6136f9565b5b600281111561105e5761105d6136f9565b5b81525050905060004290508160800151826000015161107d9190613fa7565b42111561109b57816080015182600001516110989190613fa7565b90505b60006003548460400151836110b09190614058565b6110ba9190613f76565b84600001516110c9919061408c565b84602001516110d89190613fa7565b905060006003548460a00151846110ef9190614058565b6110f99190613f76565b8460400151611108919061408c565b84606001516111179190613fa7565b905080670de0b6b3a76400008361112e919061408c565b6111389190613f76565b9650505050505050919050565b6000611150826118fd565b90506000600f6000600154815260200190815260200160002060405180610120016040529081600082015481526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820180548060200260200160405190810160405280929190818152602001828054801561121c57602002820191906000526020600020905b815481526020019060010190808311611208575b50505050508152602001600782015481526020016008820160009054906101000a900460ff166002811115611254576112536136f9565b5b6002811115611266576112656136f9565b5b81525050905060008251111561147e57600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836020015163ffffffff1685518560e001516112f3919061408c565b6112fd9190613f76565b6040518363ffffffff1660e01b815260040161131a9291906141fd565b6020604051808303816000875af1158015611339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135d919061425e565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394b918de826020015163ffffffff1684518460e001516113b8919061408c565b6113c29190613f76565b6040518263ffffffff1660e01b81526004016113de9190613ae6565b600060405180830381600087803b1580156113f857600080fd5b505af115801561140c573d6000803e3d6000fd5b5050505061143f33826020015163ffffffff1684518460e00151611430919061408c565b61143a9190613f76565b612bc1565b806020015163ffffffff1682518260e0015161145b919061408c565b6114659190613f76565b600a60008282546114769190614058565b925050819055505b505050565b60025481565b6000600f6000600154815260200190815260200160002090506000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060015481526020019081526020016000205490506001600281111561150d5761150c6136f9565b5b8260080160009054906101000a900460ff166002811115611531576115306136f9565b5b14611571576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611568906142d7565b60405180910390fd5b600034116115b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ab90614343565b60405180910390fd5b600081036115d557600e600060015481526020019081526020016000205490505b60006012600060015481526020019081526020016000206000838152602001908152602001600020905081601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001548152602001908152602001600020819055506000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a1903eab34306040518363ffffffff1660e01b81526004016116b49190613dc5565b60206040518083038185885af11580156116d2573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906116f7919061417e565b9050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d48764e826040518263ffffffff1660e01b81526004016117549190613ae6565b602060405180830381865afa158015611771573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611795919061417e565b90506117a333826001612c3c565b6040518060600160405280828460000160008282546117c29190613fa7565b92505081905581526020018360010154815260200142815250601260006001548152602001908152602001600020600085815260200190815260200160002060008201518160000155602082015181600101556040820151816002015590505080600c60008282546118349190613fa7565b92505081905550600e6000600154815260200190815260200160002054830361188357600e60006001548152602001908152602001600020600081548092919061187d906140ce565b91905055505b3373ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a826040516118c99190613ae6565b60405180910390a250505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000205490506000600f600085815260200190815260200160002060405180610120016040529081600082015481526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201805480602002602001604051908101604052809291908181526020018280548015611a1c57602002820191906000526020600020905b815481526020019060010190808311611a08575b50505050508152602001600782015481526020016008820160009054906101000a900460ff166002811115611a5457611a536136f9565b5b6002811115611a6657611a656136f9565b5b8152505090506000601260008681526020019081526020016000206000848152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505090506000606484611acc9190613f76565b90506000600267ffffffffffffffff811115611aeb57611aea613947565b5b604051908082528060200260200182016040528015611b195781602001602082028036833780820191505090505b5090506000821115611b9c5760005b82811015611b9a576010600089815260200190815260200160002060008281526020019081526020016000206001015482600081518110611b6c57611b6b614363565b5b60200260200101818151611b809190613fa7565b915081815250508080611b92906140ce565b915050611b28565b505b60016010600089815260200190815260200160002060008481526020019081526020016000206001015482600081518110611bda57611bd9614363565b5b6020026020010151611bec9190613fa7565b611bf69190614058565b81600181518110611c0a57611c09614363565b5b6020026020010181815250506000600267ffffffffffffffff811115611c3357611c32613947565b5b604051908082528060200260200182016040528015611c615781602001602082028036833780820191505090505b509050600042905085608001518660000151611c7d9190613fa7565b421115611c9b5785608001518660000151611c989190613fa7565b90505b6000871115611df5576000606485611cb3919061408c565b90505b87811015611da457600354601260008c815260200190815260200160002060008381526020019081526020016000206002015483611cf49190614058565b611cfe9190613f76565b601260008c8152602001908152602001600020600083815260200190815260200160002060000154611d30919061408c565b601260008c8152602001908152602001600020600083815260200190815260200160002060010154611d629190613fa7565b83600081518110611d7657611d75614363565b5b60200260200101818151611d8a9190613fa7565b915081815250508080611d9c906140ce565b915050611cb6565b5082600081518110611db957611db8614363565b5b602002602001015182600081518110611dd557611dd4614363565b5b60200260200101818151611de99190613fa7565b91508181525050611e32565b82600081518110611e0957611e08614363565b5b602002602001015182600081518110611e2557611e24614363565b5b6020026020010181815250505b6001600354866040015183611e479190614058565b611e519190613f76565b8660000151611e60919061408c565b866020015184600081518110611e7957611e78614363565b5b6020026020010151611e8b9190613fa7565b611e959190613fa7565b611e9f9190614058565b82600181518110611eb357611eb2614363565b5b6020026020010181815250506000600f60008b815260200190815260200160002060010160009054906101000a900463ffffffff1663ffffffff1667ffffffffffffffff811115611f0757611f06613947565b5b604051908082528060200260200182016040528015611f355781602001602082028036833780820191505090505b5090506000805b886020015163ffffffff168163ffffffff16101561204d578860c001518163ffffffff1681518110611f7157611f70614363565b5b602002602001015185600081518110611f8d57611f8c614363565b5b602002602001015111158015611fe2575084600181518110611fb257611fb1614363565b5b60200260200101518960c001518263ffffffff1681518110611fd757611fd6614363565b5b602002602001015111155b1561203a578860c001518163ffffffff168151811061200457612003614363565b5b602002602001015183838151811061201f5761201e614363565b5b6020026020010181815250508180612036906140ce565b9250505b808061204590614392565b915050611f3c565b5060008111156120fc578067ffffffffffffffff81111561207157612070613947565b5b60405190808252806020026020018201604052801561209f5781602001602082028036833780820191505090505b50995060005b818110156120fa578281815181106120c0576120bf614363565b5b60200260200101518b82815181106120db576120da614363565b5b60200260200101818152505080806120f2906140ce565b9150506120a5565b505b505050505050505050919050565b60095481565b600760149054906101000a900467ffffffffffffffff1681565b600e6020528060005260406000206000915090505481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612170612a76565b61217a60006134ce565b565b6011602052816000526040600020602052806000526040600020600091509150505481565b60035481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6010602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020549050600060126000848152602001908152602001600020600083815260200190815260200160002090506000600f600085815260200190815260200160002090508482600001541015612308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ff9061440a565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518363ffffffff1660e01b81526004016123879291906141fd565b6020604051808303816000875af11580156123a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ca919061425e565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394b918de866040518263ffffffff1660e01b81526004016124269190613ae6565b600060405180830381600087803b15801561244057600080fd5b505af1158015612454573d6000803e3d6000fd5b5050505060015484036124725761246d33866000612c3c565b61248c565b84600a60008282546124849190614058565b925050819055505b84600c600082825461249e9190614058565b92505081905550848260000160008282546124b99190614058565b925050819055506000429050816004015482600001546124d99190613fa7565b4211156124f757816004015482600001546124f49190613fa7565b90505b80836002018190555061250a3387612bc1565b3373ffffffffffffffffffffffffffffffffffffffff167fb24546d975e2628748efc9aced80665e0fad66272033e5c0ea25fd3afac99795876040516125509190613ae6565b60405180910390a2505050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6007601c9054906101000a900461ffff1681565b6012602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b600a5481565b6125df612a76565b6002546001819055506000600154111561268a57600280811115612606576126056136f9565b5b600f6000600180546126189190614058565b815260200190815260200160002060080160009054906101000a900460ff166002811115612649576126486136f9565b5b14612689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268090614476565b60405180910390fd5b5b81600f600060015481526020019081526020016000206004018190555042600f60006001548152602001908152602001600020600001819055506001600f6000600154815260200190815260200160002060080160006101000a81548160ff02191690836002811115612700576126ff6136f9565b5b021790555080600f6000600154815260200190815260200160002060010160006101000a81548163ffffffff021916908363ffffffff1602179055508063ffffffff1667ffffffffffffffff81111561275c5761275b613947565b5b60405190808252806020026020018201604052801561278a5781602001602082028036833780820191505090505b50600f6000600154815260200190815260200160002060060190805190602001906127b69291906135e0565b506001600260008282546127ca9190613fa7565b925050819055506001547fcf30947cc5e4faa736b723018e806822835db29e1b1c2e6d140f95e19d8ede85834284604051612807939291906144c7565b60405180910390a25050565b600b5481565b612821612a76565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288790614570565b60405180910390fd5b612899816134ce565b50565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b600860009054906101000a900463ffffffff1681565b6000600b541115612a7457600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b546040518363ffffffff1660e01b815260040161296a9291906141fd565b6020604051808303816000875af1158015612989573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ad919061425e565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394b918de600b546040518263ffffffff1660e01b8152600401612a0b9190613ae6565b600060405180830381600087803b158015612a2557600080fd5b505af1158015612a39573d6000803e3d6000fd5b50505050612a6b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b54612bc1565b6000600b819055505b565b612a7e613592565b73ffffffffffffffffffffffffffffffffffffffff16612a9c612204565b73ffffffffffffffffffffffffffffffffffffffff1614612af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae9906145dc565b60405180910390fd5b565b612b8c8282604051602401612b0a92919061466a565b6040516020818303038152906040527fb60e72cc000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061359a565b5050565b80600f600060015481526020019081526020016000206006019080519060200190612bbc9291906135e0565b505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612be7906146cb565b60006040518083038185875af1925050503d8060008114612c24576040519150601f19603f3d011682016040523d82523d6000602084013e612c29565b606091505b5050905080612c3757600080fd5b505050565b6000600f600060015481526020019081526020016000209050600042905081600401548260000154612c6e9190613fa7565b421115612c8c5781600401548260000154612c899190613fa7565b90505b600354826005015482612c9f9190614058565b612ca99190613f76565b8260020154612cb8919061408c565b826003016000828254612ccb9190613fa7565b9250508190555080826005018190555060008411156134c75782156130e15783826002016000828254612cfe9190613fa7565b925050819055506000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060015481526020019081526020016000205490506000601260006001548152602001908152602001600020600083815260200190815260200160002090506000606483612d959190613f76565b905060035460106000600154815260200190815260200160002060008381526020019081526020016000206002015485612dcf9190614058565b612dd99190613f76565b601060006001548152602001908152602001600020600083815260200190815260200160002060000154612e0d919061408c565b60106000600154815260200190815260200160002060008381526020019081526020016000206001016000828254612e459190613fa7565b925050819055508660106000600154815260200190815260200160002060008381526020019081526020016000206000016000828254612e859190613fa7565b925050819055508360106000600154815260200190815260200160002060008381526020019081526020016000206002018190555050600081600001541115612f0f57600354816002015484612edb9190614058565b612ee59190613f76565b8160000154612ef4919061408c565b816001016000828254612f079190613fa7565b925050819055505b600086600c54612f1f9190613fa7565b11156130da5785600c54612f339190613fa7565b84600201548560020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612f9b9190613dc5565b602060405180830381865afa158015612fb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fdc919061417e565b612fe69190614058565b612ff09190614058565b612ffa919061408c565b6130049190613f76565b846007018190555083600701548460020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016130749190613dc5565b602060405180830381865afa158015613091573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130b5919061417e565b6130bf9190614058565b6130c99190614058565b6130d39190614058565b600b819055505b50506134c6565b838260020160008282546130f59190614058565b925050819055506000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001548152602001908152602001600020549050600060126000600154815260200190815260200160002060008381526020019081526020016000209050600060648361318c9190613f76565b9050600354601060006001548152602001908152602001600020600083815260200190815260200160002060020154856131c69190614058565b6131d09190613f76565b601060006001548152602001908152602001600020600083815260200190815260200160002060000154613204919061408c565b6010600060015481526020019081526020016000206000838152602001908152602001600020600101600082825461323c9190613fa7565b92505081905550866010600060015481526020019081526020016000206000838152602001908152602001600020600001600082825461327c9190614058565b9250508190555083601060006001548152602001908152602001600020600083815260200190815260200160002060020181905550506003548160020154846132c59190614058565b6132cf9190613f76565b81600001546132de919061408c565b8160010160008282546132f19190613fa7565b92505081905550600086600c546133089190614058565b11156134c35785600c5461331c9190614058565b84600201548560020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016133849190613dc5565b602060405180830381865afa1580156133a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c5919061417e565b6133cf9190614058565b6133d99190614058565b6133e3919061408c565b6133ed9190613f76565b846007018190555083600701548460020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161345d9190613dc5565b602060405180830381865afa15801561347a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061349e919061417e565b6134a89190614058565b6134b29190614058565b6134bc9190614058565b600b819055505b50505b5b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6135b1816135a96135b46135d5565b63ffffffff16565b50565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b61362d819050919050565b82805482825590600052602060002090810192821561361c579160200282015b8281111561361b578251825591602001919060010190613600565b5b5090506136299190613637565b5090565b6136356146e0565b565b5b80821115613650576000816000905550600101613638565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61367b81613668565b811461368657600080fd5b50565b60008135905061369881613672565b92915050565b6000602082840312156136b4576136b361365e565b5b60006136c284828501613689565b91505092915050565b6136d481613668565b82525050565b600063ffffffff82169050919050565b6136f3816136da565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613739576137386136f9565b5b50565b600081905061374a82613728565b919050565b600061375a8261373c565b9050919050565b61376a8161374f565b82525050565b600061010082019050613786600083018b6136cb565b613793602083018a6136ea565b6137a060408301896136cb565b6137ad60608301886136cb565b6137ba60808301876136cb565b6137c760a08301866136cb565b6137d460c08301856136cb565b6137e160e0830184613761565b9998505050505050505050565b600067ffffffffffffffff82169050919050565b61380b816137ee565b811461381657600080fd5b50565b60008135905061382881613802565b92915050565b6000819050919050565b6138418161382e565b811461384c57600080fd5b50565b60008135905061385e81613838565b92915050565b61386d816136da565b811461387857600080fd5b50565b60008135905061388a81613864565b92915050565b600061ffff82169050919050565b6138a781613890565b81146138b257600080fd5b50565b6000813590506138c48161389e565b92915050565b600080600080608085870312156138e4576138e361365e565b5b60006138f287828801613819565b94505060206139038782880161384f565b93505060406139148782880161387b565b9250506060613925878288016138b5565b91505092959194509250565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61397f82613936565b810181811067ffffffffffffffff8211171561399e5761399d613947565b5b80604052505050565b60006139b1613654565b90506139bd8282613976565b919050565b600067ffffffffffffffff8211156139dd576139dc613947565b5b602082029050602081019050919050565b600080fd5b6000613a06613a01846139c2565b6139a7565b90508083825260208201905060208402830185811115613a2957613a286139ee565b5b835b81811015613a525780613a3e8882613689565b845260208401935050602081019050613a2b565b5050509392505050565b600082601f830112613a7157613a70613931565b5b8135613a818482602086016139f3565b91505092915050565b60008060408385031215613aa157613aa061365e565b5b6000613aaf85828601613689565b925050602083013567ffffffffffffffff811115613ad057613acf613663565b5b613adc85828601613a5c565b9150509250929050565b6000602082019050613afb60008301846136cb565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b2c82613b01565b9050919050565b613b3c81613b21565b8114613b4757600080fd5b50565b600081359050613b5981613b33565b92915050565b600060208284031215613b7557613b7461365e565b5b6000613b8384828501613b4a565b91505092915050565b6000819050919050565b6000613bb1613bac613ba784613b01565b613b8c565b613b01565b9050919050565b6000613bc382613b96565b9050919050565b6000613bd582613bb8565b9050919050565b613be581613bca565b82525050565b6000602082019050613c006000830184613bdc565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613c3b81613668565b82525050565b6000613c4d8383613c32565b60208301905092915050565b6000602082019050919050565b6000613c7182613c06565b613c7b8185613c11565b9350613c8683613c22565b8060005b83811015613cb7578151613c9e8882613c41565b9750613ca983613c59565b925050600181019050613c8a565b5085935050505092915050565b60006020820190508181036000830152613cde8184613c66565b905092915050565b613cef8161382e565b82525050565b6000602082019050613d0a6000830184613ce6565b92915050565b613d19816137ee565b82525050565b6000602082019050613d346000830184613d10565b92915050565b6000613d4582613bb8565b9050919050565b613d5581613d3a565b82525050565b6000602082019050613d706000830184613d4c565b92915050565b60008060408385031215613d8d57613d8c61365e565b5b6000613d9b85828601613b4a565b9250506020613dac85828601613689565b9150509250929050565b613dbf81613b21565b82525050565b6000602082019050613dda6000830184613db6565b92915050565b60008060408385031215613df757613df661365e565b5b6000613e0585828601613689565b9250506020613e1685828601613689565b9150509250929050565b6000606082019050613e3560008301866136cb565b613e4260208301856136cb565b613e4f60408301846136cb565b949350505050565b6000613e6282613bb8565b9050919050565b613e7281613e57565b82525050565b6000602082019050613e8d6000830184613e69565b92915050565b613e9c81613890565b82525050565b6000602082019050613eb76000830184613e93565b92915050565b60008060408385031215613ed457613ed361365e565b5b6000613ee285828601613689565b9250506020613ef38582860161387b565b9150509250929050565b6000602082019050613f1260008301846136ea565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f8182613668565b9150613f8c83613668565b925082613f9c57613f9b613f18565b5b828204905092915050565b6000613fb282613668565b9150613fbd83613668565b9250828201905080821115613fd557613fd4613f47565b5b92915050565b600082825260208201905092915050565b7f506f6f6c206973207374696c6c20616374697665000000000000000000000000600082015250565b6000614022601483613fdb565b915061402d82613fec565b602082019050919050565b6000602082019050818103600083015261405181614015565b9050919050565b600061406382613668565b915061406e83613668565b925082820390508181111561408657614085613f47565b5b92915050565b600061409782613668565b91506140a283613668565b92508282026140b081613668565b915082820484148315176140c7576140c6613f47565b5b5092915050565b60006140d982613668565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361410b5761410a613f47565b5b600182019050919050565b600060a08201905061412b6000830188613ce6565b6141386020830187613d10565b6141456040830186613e93565b61415260608301856136ea565b61415f60808301846136ea565b9695505050505050565b60008151905061417881613672565b92915050565b6000602082840312156141945761419361365e565b5b60006141a284828501614169565b91505092915050565b60006040820190506141c060008301856136cb565b6141cd60208301846136cb565b9392505050565b60006040820190506141e96000830185613db6565b6141f66020830184613db6565b9392505050565b60006040820190506142126000830185613db6565b61421f60208301846136cb565b9392505050565b60008115159050919050565b61423b81614226565b811461424657600080fd5b50565b60008151905061425881614232565b92915050565b6000602082840312156142745761427361365e565b5b600061428284828501614249565b91505092915050565b7f506f6f6c206973206e6f74207374617274656420796574000000000000000000600082015250565b60006142c1601783613fdb565b91506142cc8261428b565b602082019050919050565b600060208201905081810360008301526142f0816142b4565b9050919050565b7f4e6f7468696e6720746f207374616b6500000000000000000000000000000000600082015250565b600061432d601083613fdb565b9150614338826142f7565b602082019050919050565b6000602082019050818103600083015261435c81614320565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061439d826136da565b915063ffffffff82036143b3576143b2613f47565b5b600182019050919050565b7f496e73756666696369656e74206465706f736974000000000000000000000000600082015250565b60006143f4601483613fdb565b91506143ff826143be565b602082019050919050565b60006020820190508181036000830152614423816143e7565b9050919050565b7f50726576696f757320706f6f6c206973206e6f742066696e6973686564000000600082015250565b6000614460601d83613fdb565b915061446b8261442a565b602082019050919050565b6000602082019050818103600083015261448f81614453565b9050919050565b60006144b16144ac6144a7846136da565b613b8c565b613668565b9050919050565b6144c181614496565b82525050565b60006060820190506144dc60008301866136cb565b6144e960208301856136cb565b6144f660408301846144b8565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061455a602683613fdb565b9150614565826144fe565b604082019050919050565b600060208201905081810360008301526145898161454d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006145c6602083613fdb565b91506145d182614590565b602082019050919050565b600060208201905081810360008301526145f5816145b9565b9050919050565b600081519050919050565b60005b8381101561462557808201518184015260208101905061460a565b60008484015250505050565b600061463c826145fc565b6146468185613fdb565b9350614656818560208601614607565b61465f81613936565b840191505092915050565b600060408201905081810360008301526146848185614631565b905061469360208301846136cb565b9392505050565b600081905092915050565b50565b60006146b560008361469a565b91506146c0826146a5565b600082019050919050565b60006146d6826146a8565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fdfe207e2066696e616c697a65526f756e64207e20706f6f6c2e726577617264466f72526f756e643aa264697066735822122087ea59d6812c1b1fe65b0145bf4574529f97ba43eb0100d7f3746f3e0b8eb33564736f6c63430008140033000000000000000000000000393f1423aa5d058a3e893d0f70ce6e12b34e63df000000000000000000000000780fb5aca83f2e3f57ee18cc3094988ef49d8c3d0000000000000000000000000ca83dd56af172a1e04b667d6e64446d0b88c4a4000000000000000000000000bb78efaaaf9223b4840ea7defdc379a13b16399b
Deployed ByteCode
0x6080604052600436106101f25760003560e01c806376ce29811161010d578063b345dc8c116100a0578063f2fde38b1161006f578063f2fde38b146106e5578063f41dfe2b1461070e578063f6153ccd14610739578063f68016b714610764578063fb2846291461078f576101f9565b8063b345dc8c14610627578063bf58390314610666578063cc4b97e114610691578063d7070ae2146106ba576101f9565b80638da5cb5b116100dc5780638da5cb5b1461057d5780639e2c8a5b146105a8578063aec47759146105d1578063b0fb162f146105fc576101f9565b806376ce2981146104ab5780637b76ac91146104e857806385f2aef2146105135780638921b0ca1461053e576101f9565b80633a4b66f11161018557806362a58fb81161015457806362a58fb814610401578063669f0e821461042c5780636acf26b914610469578063715018a614610494576101f9565b80633a4b66f114610364578063576a31701461036e5780635f72f4501461039957806361728f39146103d6576101f9565b80632add13c7116101c15780632add13c7146102a85780633121e7d7146102d3578063379607f514610310578063390724ac14610339576101f9565b80631526fe27146101fb578063195a79401461023f5780631e820325146102685780631fe543e31461027f576101f9565b366101f957005b005b34801561020757600080fd5b50610222600480360381019061021d919061369e565b6107a6565b604051610236989796959493929190613770565b60405180910390f35b34801561024b57600080fd5b50610266600480360381019061026191906138ca565b61080b565b005b34801561027457600080fd5b5061027d610887565b005b34801561028b57600080fd5b506102a660048036038101906102a19190613a8a565b610dd9565b005b3480156102b457600080fd5b506102bd610e99565b6040516102ca9190613ae6565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190613b5f565b610e9f565b6040516103079190613ae6565b60405180910390f35b34801561031c57600080fd5b506103376004803603810190610332919061369e565b611145565b005b34801561034557600080fd5b5061034e611483565b60405161035b9190613ae6565b60405180910390f35b61036c611489565b005b34801561037a57600080fd5b506103836118d7565b6040516103909190613beb565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb919061369e565b6118fd565b6040516103cd9190613cc4565b60405180910390f35b3480156103e257600080fd5b506103eb61210a565b6040516103f89190613cf5565b60405180910390f35b34801561040d57600080fd5b50610416612110565b6040516104239190613d1f565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e919061369e565b61212a565b6040516104609190613ae6565b60405180910390f35b34801561047557600080fd5b5061047e612142565b60405161048b9190613d5b565b60405180910390f35b3480156104a057600080fd5b506104a9612168565b005b3480156104b757600080fd5b506104d260048036038101906104cd9190613d76565b61217c565b6040516104df9190613ae6565b60405180910390f35b3480156104f457600080fd5b506104fd6121a1565b60405161050a9190613ae6565b60405180910390f35b34801561051f57600080fd5b506105286121a7565b6040516105359190613dc5565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190613de0565b6121cd565b60405161057493929190613e20565b60405180910390f35b34801561058957600080fd5b50610592612204565b60405161059f9190613dc5565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190613de0565b61222d565b005b3480156105dd57600080fd5b506105e6612560565b6040516105f39190613e78565b60405180910390f35b34801561060857600080fd5b50610611612586565b60405161061e9190613ea2565b60405180910390f35b34801561063357600080fd5b5061064e60048036038101906106499190613de0565b61259a565b60405161065d93929190613e20565b60405180910390f35b34801561067257600080fd5b5061067b6125d1565b6040516106889190613ae6565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190613ebd565b6125d7565b005b3480156106c657600080fd5b506106cf612813565b6040516106dc9190613ae6565b60405180910390f35b3480156106f157600080fd5b5061070c60048036038101906107079190613b5f565b612819565b005b34801561071a57600080fd5b5061072361289c565b6040516107309190613d5b565b60405180910390f35b34801561074557600080fd5b5061074e6128c2565b60405161075b9190613ae6565b60405180910390f35b34801561077057600080fd5b506107796128c8565b6040516107869190613efd565b60405180910390f35b34801561079b57600080fd5b506107a46128de565b005b600f6020528060005260406000206000915090508060000154908060010160009054906101000a900463ffffffff16908060020154908060030154908060040154908060050154908060070154908060080160009054906101000a900460ff16905088565b610813612a76565b83600760146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508260098190555081600860006101000a81548163ffffffff021916908363ffffffff160217905550806007601c6101000a81548161ffff021916908361ffff16021790555050505050565b6000600f60006001548152602001908152602001600020905060006064600e60006001548152602001908152602001600020546108c49190613f76565b905042826004015483600001546108db9190613fa7565b111561091c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091390614038565b60405180910390fd5b6000429050826004015483600001546109359190613fa7565b42111561095357826004015483600001546109509190613fa7565b90505b60005b828111610a5357600354601060006001548152602001908152602001600020600083815260200190815260200160002060020154836109959190614058565b61099f9190613f76565b6010600060015481526020019081526020016000206000838152602001908152602001600020600001546109d3919061408c565b60106000600154815260200190815260200160002060008381526020019081526020016000206001016000828254610a0b9190613fa7565b92505081905550816010600060015481526020019081526020016000206000838152602001908152602001600020600201819055508080610a4b906140ce565b915050610956565b50600354836005015482610a679190614058565b610a719190613f76565b8360020154610a80919061408c565b836003016000828254610a939190613fa7565b92505081905550808360050181905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d30600954600760149054906101000a900467ffffffffffffffff166007601c9054906101000a900461ffff16600860009054906101000a900463ffffffff168860010160009054906101000a900463ffffffff166040518663ffffffff1660e01b8152600401610b54959493929190614116565b600060405180830381600087803b158015610b6e57600080fd5b505af1158015610b82573d6000803e3d6000fd5b5050505060028360080160006101000a81548160ff02191690836002811115610bae57610bad6136f9565b5b0217905550600c5483600201548460020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c1e9190613dc5565b602060405180830381865afa158015610c3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5f919061417e565b610c699190614058565b610c739190614058565b610c7d919061408c565b610c879190613f76565b8360070181905550610cb5604051806060016040528060278152602001614710602791398460070154612af4565b82600201548360070154610cc99190613fa7565b600a6000828254610cda9190613fa7565b92505081905550600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d3f9190613dc5565b602060405180830381865afa158015610d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d80919061417e565b610d8a9190614058565b600b819055506001547f87d39ec94082b342cc157bbd80096ad2fa03e1698a57924ad16e36709cb0e28784600701548560020154604051610dcc9291906141ab565b60405180910390a2505050565b7f000000000000000000000000393f1423aa5d058a3e893d0f70ce6e12b34e63df73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e8b57337f000000000000000000000000393f1423aa5d058a3e893d0f70ce6e12b34e63df6040517f1cdc5ebb000000000000000000000000000000000000000000000000000000008152600401610e829291906141d4565b60405180910390fd5b610e958282612b90565b5050565b60015481565b600080601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600154815260200190815260200160002054905060006012600060015481526020019081526020016000206000838152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505090506000600f6000600154815260200190815260200160002060405180610120016040529081600082015481526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820180548060200260200160405190810160405280929190818152602001828054801561101457602002820191906000526020600020905b815481526020019060010190808311611000575b50505050508152602001600782015481526020016008820160009054906101000a900460ff16600281111561104c5761104b6136f9565b5b600281111561105e5761105d6136f9565b5b81525050905060004290508160800151826000015161107d9190613fa7565b42111561109b57816080015182600001516110989190613fa7565b90505b60006003548460400151836110b09190614058565b6110ba9190613f76565b84600001516110c9919061408c565b84602001516110d89190613fa7565b905060006003548460a00151846110ef9190614058565b6110f99190613f76565b8460400151611108919061408c565b84606001516111179190613fa7565b905080670de0b6b3a76400008361112e919061408c565b6111389190613f76565b9650505050505050919050565b6000611150826118fd565b90506000600f6000600154815260200190815260200160002060405180610120016040529081600082015481526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820180548060200260200160405190810160405280929190818152602001828054801561121c57602002820191906000526020600020905b815481526020019060010190808311611208575b50505050508152602001600782015481526020016008820160009054906101000a900460ff166002811115611254576112536136f9565b5b6002811115611266576112656136f9565b5b81525050905060008251111561147e57600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836020015163ffffffff1685518560e001516112f3919061408c565b6112fd9190613f76565b6040518363ffffffff1660e01b815260040161131a9291906141fd565b6020604051808303816000875af1158015611339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135d919061425e565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394b918de826020015163ffffffff1684518460e001516113b8919061408c565b6113c29190613f76565b6040518263ffffffff1660e01b81526004016113de9190613ae6565b600060405180830381600087803b1580156113f857600080fd5b505af115801561140c573d6000803e3d6000fd5b5050505061143f33826020015163ffffffff1684518460e00151611430919061408c565b61143a9190613f76565b612bc1565b806020015163ffffffff1682518260e0015161145b919061408c565b6114659190613f76565b600a60008282546114769190614058565b925050819055505b505050565b60025481565b6000600f6000600154815260200190815260200160002090506000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060015481526020019081526020016000205490506001600281111561150d5761150c6136f9565b5b8260080160009054906101000a900460ff166002811115611531576115306136f9565b5b14611571576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611568906142d7565b60405180910390fd5b600034116115b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ab90614343565b60405180910390fd5b600081036115d557600e600060015481526020019081526020016000205490505b60006012600060015481526020019081526020016000206000838152602001908152602001600020905081601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001548152602001908152602001600020819055506000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a1903eab34306040518363ffffffff1660e01b81526004016116b49190613dc5565b60206040518083038185885af11580156116d2573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906116f7919061417e565b9050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d48764e826040518263ffffffff1660e01b81526004016117549190613ae6565b602060405180830381865afa158015611771573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611795919061417e565b90506117a333826001612c3c565b6040518060600160405280828460000160008282546117c29190613fa7565b92505081905581526020018360010154815260200142815250601260006001548152602001908152602001600020600085815260200190815260200160002060008201518160000155602082015181600101556040820151816002015590505080600c60008282546118349190613fa7565b92505081905550600e6000600154815260200190815260200160002054830361188357600e60006001548152602001908152602001600020600081548092919061187d906140ce565b91905055505b3373ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a826040516118c99190613ae6565b60405180910390a250505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000205490506000600f600085815260200190815260200160002060405180610120016040529081600082015481526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201805480602002602001604051908101604052809291908181526020018280548015611a1c57602002820191906000526020600020905b815481526020019060010190808311611a08575b50505050508152602001600782015481526020016008820160009054906101000a900460ff166002811115611a5457611a536136f9565b5b6002811115611a6657611a656136f9565b5b8152505090506000601260008681526020019081526020016000206000848152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505090506000606484611acc9190613f76565b90506000600267ffffffffffffffff811115611aeb57611aea613947565b5b604051908082528060200260200182016040528015611b195781602001602082028036833780820191505090505b5090506000821115611b9c5760005b82811015611b9a576010600089815260200190815260200160002060008281526020019081526020016000206001015482600081518110611b6c57611b6b614363565b5b60200260200101818151611b809190613fa7565b915081815250508080611b92906140ce565b915050611b28565b505b60016010600089815260200190815260200160002060008481526020019081526020016000206001015482600081518110611bda57611bd9614363565b5b6020026020010151611bec9190613fa7565b611bf69190614058565b81600181518110611c0a57611c09614363565b5b6020026020010181815250506000600267ffffffffffffffff811115611c3357611c32613947565b5b604051908082528060200260200182016040528015611c615781602001602082028036833780820191505090505b509050600042905085608001518660000151611c7d9190613fa7565b421115611c9b5785608001518660000151611c989190613fa7565b90505b6000871115611df5576000606485611cb3919061408c565b90505b87811015611da457600354601260008c815260200190815260200160002060008381526020019081526020016000206002015483611cf49190614058565b611cfe9190613f76565b601260008c8152602001908152602001600020600083815260200190815260200160002060000154611d30919061408c565b601260008c8152602001908152602001600020600083815260200190815260200160002060010154611d629190613fa7565b83600081518110611d7657611d75614363565b5b60200260200101818151611d8a9190613fa7565b915081815250508080611d9c906140ce565b915050611cb6565b5082600081518110611db957611db8614363565b5b602002602001015182600081518110611dd557611dd4614363565b5b60200260200101818151611de99190613fa7565b91508181525050611e32565b82600081518110611e0957611e08614363565b5b602002602001015182600081518110611e2557611e24614363565b5b6020026020010181815250505b6001600354866040015183611e479190614058565b611e519190613f76565b8660000151611e60919061408c565b866020015184600081518110611e7957611e78614363565b5b6020026020010151611e8b9190613fa7565b611e959190613fa7565b611e9f9190614058565b82600181518110611eb357611eb2614363565b5b6020026020010181815250506000600f60008b815260200190815260200160002060010160009054906101000a900463ffffffff1663ffffffff1667ffffffffffffffff811115611f0757611f06613947565b5b604051908082528060200260200182016040528015611f355781602001602082028036833780820191505090505b5090506000805b886020015163ffffffff168163ffffffff16101561204d578860c001518163ffffffff1681518110611f7157611f70614363565b5b602002602001015185600081518110611f8d57611f8c614363565b5b602002602001015111158015611fe2575084600181518110611fb257611fb1614363565b5b60200260200101518960c001518263ffffffff1681518110611fd757611fd6614363565b5b602002602001015111155b1561203a578860c001518163ffffffff168151811061200457612003614363565b5b602002602001015183838151811061201f5761201e614363565b5b6020026020010181815250508180612036906140ce565b9250505b808061204590614392565b915050611f3c565b5060008111156120fc578067ffffffffffffffff81111561207157612070613947565b5b60405190808252806020026020018201604052801561209f5781602001602082028036833780820191505090505b50995060005b818110156120fa578281815181106120c0576120bf614363565b5b60200260200101518b82815181106120db576120da614363565b5b60200260200101818152505080806120f2906140ce565b9150506120a5565b505b505050505050505050919050565b60095481565b600760149054906101000a900467ffffffffffffffff1681565b600e6020528060005260406000206000915090505481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612170612a76565b61217a60006134ce565b565b6011602052816000526040600020602052806000526040600020600091509150505481565b60035481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6010602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020549050600060126000848152602001908152602001600020600083815260200190815260200160002090506000600f600085815260200190815260200160002090508482600001541015612308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ff9061440a565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518363ffffffff1660e01b81526004016123879291906141fd565b6020604051808303816000875af11580156123a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ca919061425e565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394b918de866040518263ffffffff1660e01b81526004016124269190613ae6565b600060405180830381600087803b15801561244057600080fd5b505af1158015612454573d6000803e3d6000fd5b5050505060015484036124725761246d33866000612c3c565b61248c565b84600a60008282546124849190614058565b925050819055505b84600c600082825461249e9190614058565b92505081905550848260000160008282546124b99190614058565b925050819055506000429050816004015482600001546124d99190613fa7565b4211156124f757816004015482600001546124f49190613fa7565b90505b80836002018190555061250a3387612bc1565b3373ffffffffffffffffffffffffffffffffffffffff167fb24546d975e2628748efc9aced80665e0fad66272033e5c0ea25fd3afac99795876040516125509190613ae6565b60405180910390a2505050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6007601c9054906101000a900461ffff1681565b6012602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b600a5481565b6125df612a76565b6002546001819055506000600154111561268a57600280811115612606576126056136f9565b5b600f6000600180546126189190614058565b815260200190815260200160002060080160009054906101000a900460ff166002811115612649576126486136f9565b5b14612689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268090614476565b60405180910390fd5b5b81600f600060015481526020019081526020016000206004018190555042600f60006001548152602001908152602001600020600001819055506001600f6000600154815260200190815260200160002060080160006101000a81548160ff02191690836002811115612700576126ff6136f9565b5b021790555080600f6000600154815260200190815260200160002060010160006101000a81548163ffffffff021916908363ffffffff1602179055508063ffffffff1667ffffffffffffffff81111561275c5761275b613947565b5b60405190808252806020026020018201604052801561278a5781602001602082028036833780820191505090505b50600f6000600154815260200190815260200160002060060190805190602001906127b69291906135e0565b506001600260008282546127ca9190613fa7565b925050819055506001547fcf30947cc5e4faa736b723018e806822835db29e1b1c2e6d140f95e19d8ede85834284604051612807939291906144c7565b60405180910390a25050565b600b5481565b612821612a76565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288790614570565b60405180910390fd5b612899816134ce565b50565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b600860009054906101000a900463ffffffff1681565b6000600b541115612a7457600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b546040518363ffffffff1660e01b815260040161296a9291906141fd565b6020604051808303816000875af1158015612989573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ad919061425e565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394b918de600b546040518263ffffffff1660e01b8152600401612a0b9190613ae6565b600060405180830381600087803b158015612a2557600080fd5b505af1158015612a39573d6000803e3d6000fd5b50505050612a6b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b54612bc1565b6000600b819055505b565b612a7e613592565b73ffffffffffffffffffffffffffffffffffffffff16612a9c612204565b73ffffffffffffffffffffffffffffffffffffffff1614612af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae9906145dc565b60405180910390fd5b565b612b8c8282604051602401612b0a92919061466a565b6040516020818303038152906040527fb60e72cc000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061359a565b5050565b80600f600060015481526020019081526020016000206006019080519060200190612bbc9291906135e0565b505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612be7906146cb565b60006040518083038185875af1925050503d8060008114612c24576040519150601f19603f3d011682016040523d82523d6000602084013e612c29565b606091505b5050905080612c3757600080fd5b505050565b6000600f600060015481526020019081526020016000209050600042905081600401548260000154612c6e9190613fa7565b421115612c8c5781600401548260000154612c899190613fa7565b90505b600354826005015482612c9f9190614058565b612ca99190613f76565b8260020154612cb8919061408c565b826003016000828254612ccb9190613fa7565b9250508190555080826005018190555060008411156134c75782156130e15783826002016000828254612cfe9190613fa7565b925050819055506000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060015481526020019081526020016000205490506000601260006001548152602001908152602001600020600083815260200190815260200160002090506000606483612d959190613f76565b905060035460106000600154815260200190815260200160002060008381526020019081526020016000206002015485612dcf9190614058565b612dd99190613f76565b601060006001548152602001908152602001600020600083815260200190815260200160002060000154612e0d919061408c565b60106000600154815260200190815260200160002060008381526020019081526020016000206001016000828254612e459190613fa7565b925050819055508660106000600154815260200190815260200160002060008381526020019081526020016000206000016000828254612e859190613fa7565b925050819055508360106000600154815260200190815260200160002060008381526020019081526020016000206002018190555050600081600001541115612f0f57600354816002015484612edb9190614058565b612ee59190613f76565b8160000154612ef4919061408c565b816001016000828254612f079190613fa7565b925050819055505b600086600c54612f1f9190613fa7565b11156130da5785600c54612f339190613fa7565b84600201548560020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612f9b9190613dc5565b602060405180830381865afa158015612fb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fdc919061417e565b612fe69190614058565b612ff09190614058565b612ffa919061408c565b6130049190613f76565b846007018190555083600701548460020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016130749190613dc5565b602060405180830381865afa158015613091573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130b5919061417e565b6130bf9190614058565b6130c99190614058565b6130d39190614058565b600b819055505b50506134c6565b838260020160008282546130f59190614058565b925050819055506000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001548152602001908152602001600020549050600060126000600154815260200190815260200160002060008381526020019081526020016000209050600060648361318c9190613f76565b9050600354601060006001548152602001908152602001600020600083815260200190815260200160002060020154856131c69190614058565b6131d09190613f76565b601060006001548152602001908152602001600020600083815260200190815260200160002060000154613204919061408c565b6010600060015481526020019081526020016000206000838152602001908152602001600020600101600082825461323c9190613fa7565b92505081905550866010600060015481526020019081526020016000206000838152602001908152602001600020600001600082825461327c9190614058565b9250508190555083601060006001548152602001908152602001600020600083815260200190815260200160002060020181905550506003548160020154846132c59190614058565b6132cf9190613f76565b81600001546132de919061408c565b8160010160008282546132f19190613fa7565b92505081905550600086600c546133089190614058565b11156134c35785600c5461331c9190614058565b84600201548560020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016133849190613dc5565b602060405180830381865afa1580156133a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c5919061417e565b6133cf9190614058565b6133d99190614058565b6133e3919061408c565b6133ed9190613f76565b846007018190555083600701548460020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161345d9190613dc5565b602060405180830381865afa15801561347a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061349e919061417e565b6134a89190614058565b6134b29190614058565b6134bc9190614058565b600b819055505b50505b5b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6135b1816135a96135b46135d5565b63ffffffff16565b50565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b61362d819050919050565b82805482825590600052602060002090810192821561361c579160200282015b8281111561361b578251825591602001919060010190613600565b5b5090506136299190613637565b5090565b6136356146e0565b565b5b80821115613650576000816000905550600101613638565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61367b81613668565b811461368657600080fd5b50565b60008135905061369881613672565b92915050565b6000602082840312156136b4576136b361365e565b5b60006136c284828501613689565b91505092915050565b6136d481613668565b82525050565b600063ffffffff82169050919050565b6136f3816136da565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613739576137386136f9565b5b50565b600081905061374a82613728565b919050565b600061375a8261373c565b9050919050565b61376a8161374f565b82525050565b600061010082019050613786600083018b6136cb565b613793602083018a6136ea565b6137a060408301896136cb565b6137ad60608301886136cb565b6137ba60808301876136cb565b6137c760a08301866136cb565b6137d460c08301856136cb565b6137e160e0830184613761565b9998505050505050505050565b600067ffffffffffffffff82169050919050565b61380b816137ee565b811461381657600080fd5b50565b60008135905061382881613802565b92915050565b6000819050919050565b6138418161382e565b811461384c57600080fd5b50565b60008135905061385e81613838565b92915050565b61386d816136da565b811461387857600080fd5b50565b60008135905061388a81613864565b92915050565b600061ffff82169050919050565b6138a781613890565b81146138b257600080fd5b50565b6000813590506138c48161389e565b92915050565b600080600080608085870312156138e4576138e361365e565b5b60006138f287828801613819565b94505060206139038782880161384f565b93505060406139148782880161387b565b9250506060613925878288016138b5565b91505092959194509250565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61397f82613936565b810181811067ffffffffffffffff8211171561399e5761399d613947565b5b80604052505050565b60006139b1613654565b90506139bd8282613976565b919050565b600067ffffffffffffffff8211156139dd576139dc613947565b5b602082029050602081019050919050565b600080fd5b6000613a06613a01846139c2565b6139a7565b90508083825260208201905060208402830185811115613a2957613a286139ee565b5b835b81811015613a525780613a3e8882613689565b845260208401935050602081019050613a2b565b5050509392505050565b600082601f830112613a7157613a70613931565b5b8135613a818482602086016139f3565b91505092915050565b60008060408385031215613aa157613aa061365e565b5b6000613aaf85828601613689565b925050602083013567ffffffffffffffff811115613ad057613acf613663565b5b613adc85828601613a5c565b9150509250929050565b6000602082019050613afb60008301846136cb565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b2c82613b01565b9050919050565b613b3c81613b21565b8114613b4757600080fd5b50565b600081359050613b5981613b33565b92915050565b600060208284031215613b7557613b7461365e565b5b6000613b8384828501613b4a565b91505092915050565b6000819050919050565b6000613bb1613bac613ba784613b01565b613b8c565b613b01565b9050919050565b6000613bc382613b96565b9050919050565b6000613bd582613bb8565b9050919050565b613be581613bca565b82525050565b6000602082019050613c006000830184613bdc565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613c3b81613668565b82525050565b6000613c4d8383613c32565b60208301905092915050565b6000602082019050919050565b6000613c7182613c06565b613c7b8185613c11565b9350613c8683613c22565b8060005b83811015613cb7578151613c9e8882613c41565b9750613ca983613c59565b925050600181019050613c8a565b5085935050505092915050565b60006020820190508181036000830152613cde8184613c66565b905092915050565b613cef8161382e565b82525050565b6000602082019050613d0a6000830184613ce6565b92915050565b613d19816137ee565b82525050565b6000602082019050613d346000830184613d10565b92915050565b6000613d4582613bb8565b9050919050565b613d5581613d3a565b82525050565b6000602082019050613d706000830184613d4c565b92915050565b60008060408385031215613d8d57613d8c61365e565b5b6000613d9b85828601613b4a565b9250506020613dac85828601613689565b9150509250929050565b613dbf81613b21565b82525050565b6000602082019050613dda6000830184613db6565b92915050565b60008060408385031215613df757613df661365e565b5b6000613e0585828601613689565b9250506020613e1685828601613689565b9150509250929050565b6000606082019050613e3560008301866136cb565b613e4260208301856136cb565b613e4f60408301846136cb565b949350505050565b6000613e6282613bb8565b9050919050565b613e7281613e57565b82525050565b6000602082019050613e8d6000830184613e69565b92915050565b613e9c81613890565b82525050565b6000602082019050613eb76000830184613e93565b92915050565b60008060408385031215613ed457613ed361365e565b5b6000613ee285828601613689565b9250506020613ef38582860161387b565b9150509250929050565b6000602082019050613f1260008301846136ea565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f8182613668565b9150613f8c83613668565b925082613f9c57613f9b613f18565b5b828204905092915050565b6000613fb282613668565b9150613fbd83613668565b9250828201905080821115613fd557613fd4613f47565b5b92915050565b600082825260208201905092915050565b7f506f6f6c206973207374696c6c20616374697665000000000000000000000000600082015250565b6000614022601483613fdb565b915061402d82613fec565b602082019050919050565b6000602082019050818103600083015261405181614015565b9050919050565b600061406382613668565b915061406e83613668565b925082820390508181111561408657614085613f47565b5b92915050565b600061409782613668565b91506140a283613668565b92508282026140b081613668565b915082820484148315176140c7576140c6613f47565b5b5092915050565b60006140d982613668565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361410b5761410a613f47565b5b600182019050919050565b600060a08201905061412b6000830188613ce6565b6141386020830187613d10565b6141456040830186613e93565b61415260608301856136ea565b61415f60808301846136ea565b9695505050505050565b60008151905061417881613672565b92915050565b6000602082840312156141945761419361365e565b5b60006141a284828501614169565b91505092915050565b60006040820190506141c060008301856136cb565b6141cd60208301846136cb565b9392505050565b60006040820190506141e96000830185613db6565b6141f66020830184613db6565b9392505050565b60006040820190506142126000830185613db6565b61421f60208301846136cb565b9392505050565b60008115159050919050565b61423b81614226565b811461424657600080fd5b50565b60008151905061425881614232565b92915050565b6000602082840312156142745761427361365e565b5b600061428284828501614249565b91505092915050565b7f506f6f6c206973206e6f74207374617274656420796574000000000000000000600082015250565b60006142c1601783613fdb565b91506142cc8261428b565b602082019050919050565b600060208201905081810360008301526142f0816142b4565b9050919050565b7f4e6f7468696e6720746f207374616b6500000000000000000000000000000000600082015250565b600061432d601083613fdb565b9150614338826142f7565b602082019050919050565b6000602082019050818103600083015261435c81614320565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061439d826136da565b915063ffffffff82036143b3576143b2613f47565b5b600182019050919050565b7f496e73756666696369656e74206465706f736974000000000000000000000000600082015250565b60006143f4601483613fdb565b91506143ff826143be565b602082019050919050565b60006020820190508181036000830152614423816143e7565b9050919050565b7f50726576696f757320706f6f6c206973206e6f742066696e6973686564000000600082015250565b6000614460601d83613fdb565b915061446b8261442a565b602082019050919050565b6000602082019050818103600083015261448f81614453565b9050919050565b60006144b16144ac6144a7846136da565b613b8c565b613668565b9050919050565b6144c181614496565b82525050565b60006060820190506144dc60008301866136cb565b6144e960208301856136cb565b6144f660408301846144b8565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061455a602683613fdb565b9150614565826144fe565b604082019050919050565b600060208201905081810360008301526145898161454d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006145c6602083613fdb565b91506145d182614590565b602082019050919050565b600060208201905081810360008301526145f5816145b9565b9050919050565b600081519050919050565b60005b8381101561462557808201518184015260208101905061460a565b60008484015250505050565b600061463c826145fc565b6146468185613fdb565b9350614656818560208601614607565b61465f81613936565b840191505092915050565b600060408201905081810360008301526146848185614631565b905061469360208301846136cb565b9392505050565b600081905092915050565b50565b60006146b560008361469a565b91506146c0826146a5565b600082019050919050565b60006146d6826146a8565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fdfe207e2066696e616c697a65526f756e64207e20706f6f6c2e726577617264466f72526f756e643aa264697066735822122087ea59d6812c1b1fe65b0145bf4574529f97ba43eb0100d7f3746f3e0b8eb33564736f6c63430008140033