Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- SyndicateFarmer
- Optimization enabled
- false
- Compiler version
- v0.8.20+commit.a1b79de6
- EVM Version
- default
- Verified at
- 2024-04-29T02:50:11.298098Z
Contract source code
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
interface IWPLS is IERC20 {
function deposit() external payable;
function withdraw(uint256) external;
}
interface IMasterChef {
function deposit(uint256 _pid, uint256 _amount) external;
function withdraw(uint256 _pid, uint256 _amount) external;
function emergencyWithdraw(uint256 _pid) external;
function pendingInc(uint256 _pid, address _user) external view returns (uint256);
function userInfo(uint256 _pid, address _user) external view returns (uint256 amount, uint256 rewardDebt);
function poolInfo(uint256 _pid) external view returns (IERC20 lpToken, uint256 allocPoint, uint256 lastRewardBlock, uint256 accCakePerShare);
}
interface ISwapRouter01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB);
function removeLiquidityETH(address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
function swapTokensForExactTokens(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
interface ISwapRouter is ISwapRouter01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
}
interface ISwapPair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
interface IAccessControl {
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
error AccessControlBadConfirmation();
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
function hasRole(bytes32 role, address account) external view returns (bool);
function getRoleAdmin(bytes32 role) external view returns (bytes32);
function grantRole(bytes32 role, address account) external;
function revokeRole(bytes32 role, address account) external;
function renounceRole(bytes32 role, address callerConfirmation) external;
}
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
abstract contract ERC165 is IERC165 {
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
}
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address account => bool) hasRole;
bytes32 adminRole;
}
mapping(bytes32 role => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
function hasRole(bytes32 role, address account) public view virtual returns (bool) {
return _roles[role].hasRole[account];
}
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert AccessControlUnauthorizedAccount(account, role);
}
}
function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
return _roles[role].adminRole;
}
function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
function renounceRole(bytes32 role, address callerConfirmation) public virtual {
if (callerConfirmation != _msgSender()) {
revert AccessControlBadConfirmation();
}
_revokeRole(role, callerConfirmation);
}
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
if (!hasRole(role, account)) {
_roles[role].hasRole[account] = true;
emit RoleGranted(role, account, _msgSender());
return true;
} else {
return false;
}
}
function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
if (hasRole(role, account)) {
_roles[role].hasRole[account] = false;
emit RoleRevoked(role, account, _msgSender());
return true;
} else {
return false;
}
}
}
contract SyndicateFarmer is AccessControl, ReentrancyGuard {
IWPLS public constant WPLS = IWPLS(0xA1077a294dDE1B09bB078844df40758a5D0f9a27);
IERC20 public constant DAI = IERC20(0xefD766cCb38EaF1dfd701853BFCe31359239F305);
IERC20 public constant INC = IERC20(0x2fa878Ab3F87CC1C9737Fc071108F904c0B0C95d);
IMasterChef public constant masterchef = IMasterChef(0xB2Ca4A66d3e57a5a9A12043B6bAD28249fE302d4);
ISwapRouter public constant swapRouterV1 = ISwapRouter(0x98bf93ebf5c380C0e6Ae8e192A7e2AE08edAcc02);
ISwapRouter public constant swapRouterV2 = ISwapRouter(0x165C3410fC91EF562C50559f7d2289fEbed552d9);
bytes32 public constant AUTHORIZED_ROLE = keccak256("AUTHORIZED_ROLE");
uint256 public constant FST = 3 minutes;
address public outputRecipient;
uint16 public claimPerc;
constructor () {
WPLS.approve(address(swapRouterV1), type(uint256).max);
WPLS.approve(address(swapRouterV2), type(uint256).max);
INC.approve(address(swapRouterV1), type(uint256).max);
INC.approve(address(swapRouterV2), type(uint256).max);
outputRecipient = msg.sender;
_grantRole(AUTHORIZED_ROLE, msg.sender);
claimPerc = 9600; // 96%
}
receive () payable external {
WPLS.deposit{value: msg.value}();
}
////////////////////
// VIEW FUNCTIONS //
////////////////////
// Get the addresses of tokens required to make LP
function tokensFor(uint256 _pid) public view returns (IERC20 token0, IERC20 token1) {
(IERC20 lpToken, , ,) = masterchef.poolInfo(_pid);
ISwapPair lp = ISwapPair(address(lpToken));
token0 = IERC20(lp.token0());
token1 = IERC20(lp.token1());
}
// Get the swap path from one token to another
function swapPath(address from, address to) public pure returns (address[] memory path) {
if (from == address(WPLS) || to == address(WPLS)) {
path = new address[](2);
path[0] = from;
path[1] = to;
} else {
path = new address[](3);
path[0] = from;
path[1] = address(WPLS);
path[2] = to;
}
}
// Get the current earnings in a pool
function earningsInPool(uint256 _pid) public view returns (uint256 incEarnings) {
incEarnings = masterchef.pendingInc(_pid, address(this));
}
// Get the current staked LP in a pool
function stakedLP(uint256 _pid) public view returns (uint256 stakedTotal) {
(stakedTotal, ) = masterchef.userInfo(_pid, address(this));
}
// Get price of token0 in token1
function getTokenPrice(address token0, address token1) public view returns (uint256 tokenPrice) {
address[] memory path = swapPath(address(token0), address(token1));
uint256[] memory amountsOut0 = swapRouterV2.getAmountsOut(1e18, path);
tokenPrice = amountsOut0[path.length - 1];
}
///////////////////// //////////////////////////
// WRITE FUNCTIONS // // RESTRICTED FUNCTIONS //
///////////////////// //////////////////////////
// Turn any token in this contract into WPLS, then add it to 'pendingForFarming'
function prepare(address _have) external nonReentrant() onlyRole(AUTHORIZED_ROLE) returns (bool success) {
IERC20(_have).approve(address(swapRouterV2), type(uint256).max);
uint256 bal = IERC20(_have).balanceOf(address(this));
swapRouterV2.swapExactTokensForTokensSupportingFeeOnTransferTokens(bal, 0, swapPath(_have, address(WPLS)), address(this), block.timestamp + 3 minutes);
return true;
}
// Deposit PLS, buy tokens for the Farmer
function deposit(uint256 _pid, uint256 _amount) external payable nonReentrant() onlyRole(AUTHORIZED_ROLE) returns (bool success) {
// Receive WPLS from caller
WPLS.transferFrom(msg.sender, address(this), _amount);
// Buy the 2nd token for this PID
_buyTokens(_pid);
// Make the LP required
_createLP(_pid);
// Stake the LP tokens
_stakeLP(_pid);
return true;
}
// Harvest Rewards to set destination
function harvest(uint256 _pid) external nonReentrant() onlyRole(AUTHORIZED_ROLE) returns (bool success) {
_harvest(_pid);
return true;
}
// Retrieve from this contract
function retrieve() external onlyRole(AUTHORIZED_ROLE) {
payable(msg.sender).transfer(address(this).balance);
}
// Retrieve tokens from this contract
function retrieveToken(address _token) external onlyRole(AUTHORIZED_ROLE) {
uint256 bal = IERC20(_token).balanceOf(address(this));
IERC20(_token).transfer(msg.sender, bal);
}
// Break LP into two tokens
function breakLP(uint256 _pid) external onlyRole(AUTHORIZED_ROLE) returns (bool) {
(IERC20 token0, IERC20 token1) = tokensFor(_pid);
(IERC20 lpToken, , ,) = masterchef.poolInfo(_pid);
uint256 liquidity = lpToken.balanceOf(address(this));
swapRouterV1.removeLiquidity(address(token0), address(token1), liquidity, 0, 0, address(this), block.timestamp + FST);
return true;
}
// Unstake LP from a farm
function unstakeLP(uint256 _pid) external onlyRole(AUTHORIZED_ROLE) returns (bool) {
(uint256 bal, ) = masterchef.userInfo(_pid, address(this));
masterchef.withdraw(_pid, bal);
return true;
}
// Set recipient of WPLS after INC is sold
function setRecipient(address _recipient) external onlyRole(AUTHORIZED_ROLE) returns (bool success) {
outputRecipient = _recipient;
return true;
}
// Set Claim Percentage (what to take on harvest)
function setClaimPerc(uint16 _claimPerc) external onlyRole(AUTHORIZED_ROLE) returns (bool success) {
claimPerc = _claimPerc;
return true;
}
////////////////////////
// INTERNAL FUNCTIONS //
////////////////////////
// Buy the 2nd token required to make LP for a PID
function _buyTokens(uint256 _pid) internal returns (bool success) {
// Get the tokens for a specific PID
(IERC20 token0, IERC20 token1) = tokensFor(_pid);
// Get available WPLS amount
uint256 wplsBal = WPLS.balanceOf(address(this));
// Calculate half that amount
uint256 half = wplsBal / 2;
// Find the other token we need to make LP
address want = (address(token0) != address(WPLS) ? address(token0) : address(token1));
// Swap half the available WPLS for the token we need
swapRouterV2.swapExactTokensForTokens(half, 0, swapPath(address(WPLS), address(want)), address(this), block.timestamp + FST);
return true;
}
// Approve Tokens, create LP
function _createLP(uint256 _pid) internal returns (bool success) {
// Get tokens for a specific PID
(IERC20 token0, IERC20 token1) = tokensFor(_pid);
// Approve both tokens to be used by the swap router
token0.approve(address(swapRouterV1), type(uint256).max);
token1.approve(address(swapRouterV1), type(uint256).max);
// Get the amount of both tokens available
uint256 amountADesired = token0.balanceOf(address(this));
uint256 amountBDesired = token1.balanceOf(address(this));
// Add Liquidity for token-WPLS LP on V1 Swap Router
swapRouterV1.addLiquidity(address(token0), address(token1), amountADesired, amountBDesired, 0, 0, address(this), block.timestamp + FST);
return true;
}
// Approve Farm to use LP, and stake LP
function _stakeLP(uint256 _pid) internal returns (bool success) {
// Get the LP Token address required for a PID
(IERC20 lpToken, , ,) = masterchef.poolInfo(_pid);
// Approve LP Token to be staked
lpToken.approve(address(masterchef), type(uint256).max);
// Get LP Token balance of the Farmer
uint256 amountIn = lpToken.balanceOf(address(this));
// Deposit those LP tokens to earn INC
masterchef.deposit(_pid, amountIn);
return true;
}
// Harvest Farm Rewards
function _harvest(uint256 _pid) internal returns (bool success) {
// Harvest INC
masterchef.deposit(_pid, 0);
// Approve INC to be spent by Swap Router
INC.approve(address(swapRouterV2), type(uint256).max);
// Get total INC Balance
uint256 incBal = INC.balanceOf(address(this));
// Swap INC for WPLS
swapRouterV2.swapExactTokensForTokens(
incBal,
0,
swapPath(address(INC),
address(WPLS)),
address(this),
block.timestamp + FST
);
// Get WPLS Balance
uint256 wplsBal = WPLS.balanceOf(address(this));
// Calculate auto-compound percentage
uint256 amountOut = (wplsBal * (10000 - claimPerc)) / 10000;
// Send everything else to rewards processor
WPLS.transfer(outputRecipient, amountOut);
return true;
}
}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bytes32","name":"neededRole","internalType":"bytes32"}]},{"type":"event","name":"RoleAdminChanged","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"previousAdminRole","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"newAdminRole","internalType":"bytes32","indexed":true}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"AUTHORIZED_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"DAI","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DEFAULT_ADMIN_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"FST","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"INC","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IWPLS"}],"name":"WPLS","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"breakLP","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"claimPerc","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"deposit","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"incEarnings","internalType":"uint256"}],"name":"earningsInPool","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"getRoleAdmin","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"tokenPrice","internalType":"uint256"}],"name":"getTokenPrice","inputs":[{"type":"address","name":"token0","internalType":"address"},{"type":"address","name":"token1","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"grantRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"harvest","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IMasterChef"}],"name":"masterchef","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"outputRecipient","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"prepare","inputs":[{"type":"address","name":"_have","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"callerConfirmation","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"retrieve","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"retrieveToken","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"setClaimPerc","inputs":[{"type":"uint16","name":"_claimPerc","internalType":"uint16"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"setRecipient","inputs":[{"type":"address","name":"_recipient","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"stakedTotal","internalType":"uint256"}],"name":"stakedLP","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"address[]","name":"path","internalType":"address[]"}],"name":"swapPath","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ISwapRouter"}],"name":"swapRouterV1","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ISwapRouter"}],"name":"swapRouterV2","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"token0","internalType":"contract IERC20"},{"type":"address","name":"token1","internalType":"contract IERC20"}],"name":"tokensFor","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"unstakeLP","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x608060405234801562000010575f80fd5b506001808190555073a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff1663095ea7b37398bf93ebf5c380c0e6ae8e192a7e2ae08edacc027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200009d92919062000596565b6020604051808303815f875af1158015620000ba573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620000e09190620005ff565b5073a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200016692919062000596565b6020604051808303815f875af115801562000183573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001a99190620005ff565b50732fa878ab3f87cc1c9737fc071108f904c0b0c95d73ffffffffffffffffffffffffffffffffffffffff1663095ea7b37398bf93ebf5c380c0e6ae8e192a7e2ae08edacc027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200022f92919062000596565b6020604051808303815f875af11580156200024c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002729190620005ff565b50732fa878ab3f87cc1c9737fc071108f904c0b0c95d73ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620002f892919062000596565b6020604051808303815f875af115801562000315573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200033b9190620005ff565b503360025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003ae7f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf733620003d460201b60201c565b50612580600260146101000a81548161ffff021916908361ffff1602179055506200062f565b5f620003e78383620004cf60201b60201c565b620004c55760015f808581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550620004616200053260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050620004c9565b5f90505b92915050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620005648262000539565b9050919050565b620005768162000558565b82525050565b5f819050919050565b62000590816200057c565b82525050565b5f604082019050620005ab5f8301856200056b565b620005ba602083018462000585565b9392505050565b5f80fd5b5f8115159050919050565b620005db81620005c5565b8114620005e6575f80fd5b50565b5f81519050620005f981620005d0565b92915050565b5f60208284031215620006175762000616620005c1565b5b5f6200062684828501620005e9565b91505092915050565b6137bb806200063d5f395ff3fe6080604052600436106101db575f3560e01c80638f9afcc211610101578063dacda1e911610094578063e4932abe11610063578063e4932abe146107a7578063ef8ef56f146107d1578063f6468251146107fb578063fb1db278146108255761024e565b8063dacda1e9146106d5578063ddc6326214610711578063e0bab4c41461074d578063e2bbb158146107775761024e565b8063babed18a116100d0578063babed18a1461060b578063c477899814610647578063d4b5492614610683578063d547741f146106ad5761024e565b80638f9afcc21461053f57806391d1485414610569578063a217fddf146105a5578063afa99860146105cf5761024e565b806336568abe116101795780636721eb97116101485780636721eb9714610472578063744fbc7a146104af5780637925c695146104d957806385ca2b0a146105155761024e565b806336568abe146103965780633bbed4a0146103be57806365ae77db146103fa57806365e38144146104365761024e565b8063202920ef116101b5578063202920ef146102f2578063248a9ca31461031c5780632e64cec1146103585780632f2ff15d1461036e5761024e565b806301ffc9a71461025257806303901fe71461028e57806314127a3b146102ca5761024e565b3661024e5773a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b15801561023a575f80fd5b505af115801561024c573d5f803e3d5ffd5b005b5f80fd5b34801561025d575f80fd5b5061027860048036038101906102739190612992565b61084f565b60405161028591906129d7565b60405180910390f35b348015610299575f80fd5b506102b460048036038101906102af9190612a23565b6108c8565b6040516102c19190612a5d565b60405180910390f35b3480156102d5575f80fd5b506102f060048036038101906102eb9190612ad0565b610960565b005b3480156102fd575f80fd5b50610306610a86565b6040516103139190612a5d565b60405180910390f35b348015610327575f80fd5b50610342600480360381019061033d9190612b2e565b610a8b565b60405161034f9190612b68565b60405180910390f35b348015610363575f80fd5b5061036c610aa7565b005b348015610379575f80fd5b50610394600480360381019061038f9190612b81565b610b18565b005b3480156103a1575f80fd5b506103bc60048036038101906103b79190612b81565b610b3a565b005b3480156103c9575f80fd5b506103e460048036038101906103df9190612ad0565b610bb5565b6040516103f191906129d7565b60405180910390f35b348015610405575f80fd5b50610420600480360381019061041b9190612a23565b610c2a565b60405161042d91906129d7565b60405180910390f35b348015610441575f80fd5b5061045c60048036038101906104579190612bf6565b610e25565b60405161046991906129d7565b60405180910390f35b34801561047d575f80fd5b5061049860048036038101906104939190612a23565b610e77565b6040516104a6929190612c7c565b60405180910390f35b3480156104ba575f80fd5b506104c3610ff4565b6040516104d09190612cc3565b60405180910390f35b3480156104e4575f80fd5b506104ff60048036038101906104fa9190612cdc565b61100c565b60405161050c9190612dd1565b60405180910390f35b348015610520575f80fd5b506105296112e1565b6040516105369190612e00565b60405180910390f35b34801561054a575f80fd5b506105536112f5565b6040516105609190612e28565b60405180910390f35b348015610574575f80fd5b5061058f600480360381019061058a9190612b81565b61131a565b60405161059c91906129d7565b60405180910390f35b3480156105b0575f80fd5b506105b961137d565b6040516105c69190612b68565b60405180910390f35b3480156105da575f80fd5b506105f560048036038101906105f09190612cdc565b611383565b6040516106029190612a5d565b60405180910390f35b348015610616575f80fd5b50610631600480360381019061062c9190612ad0565b61145f565b60405161063e91906129d7565b60405180910390f35b348015610652575f80fd5b5061066d60048036038101906106689190612a23565b6116bf565b60405161067a91906129d7565b60405180910390f35b34801561068e575f80fd5b50610697611802565b6040516106a49190612cc3565b60405180910390f35b3480156106b8575f80fd5b506106d360048036038101906106ce9190612b81565b61181a565b005b3480156106e0575f80fd5b506106fb60048036038101906106f69190612a23565b61183c565b6040516107089190612a5d565b60405180910390f35b34801561071c575f80fd5b5061073760048036038101906107329190612a23565b6118d2565b60405161074491906129d7565b60405180910390f35b348015610758575f80fd5b50610761611965565b60405161076e9190612e41565b60405180910390f35b610791600480360381019061078c9190612e5a565b61197d565b60405161079e91906129d7565b60405180910390f35b3480156107b2575f80fd5b506107bb611ab7565b6040516107c89190612e41565b60405180910390f35b3480156107dc575f80fd5b506107e5611acf565b6040516107f29190612eb8565b60405180910390f35b348015610806575f80fd5b5061080f611ae7565b60405161081c9190612b68565b60405180910390f35b348015610830575f80fd5b50610839611b0b565b6040516108469190612ef1565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108c157506108c082611b23565b5b9050919050565b5f73b2ca4a66d3e57a5a9a12043b6bad28249fe302d473ffffffffffffffffffffffffffffffffffffffff166393f1a40b83306040518363ffffffff1660e01b8152600401610918929190612f0a565b6040805180830381865afa158015610932573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109569190612f45565b5080915050919050565b7f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf761098a81611b8c565b5f8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109c49190612e28565b602060405180830381865afa1580156109df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a039190612f83565b90508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610a40929190612fae565b6020604051808303815f875af1158015610a5c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a809190612fff565b50505050565b60b481565b5f805f8381526020019081526020015f20600101549050919050565b7f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf7610ad181611b8c565b3373ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015610b14573d5f803e3d5ffd5b5050565b610b2182610a8b565b610b2a81611b8c565b610b348383611ba0565b50505050565b610b42611c89565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ba6576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bb08282611c90565b505050565b5f7f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf7610be081611b8c565b8260025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001915050919050565b5f7f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf7610c5581611b8c565b5f80610c6085610e77565b915091505f73b2ca4a66d3e57a5a9a12043b6bad28249fe302d473ffffffffffffffffffffffffffffffffffffffff16631526fe27876040518263ffffffff1660e01b8152600401610cb29190612a5d565b608060405180830381865afa158015610ccd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf19190613065565b50505090505f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d309190612e28565b602060405180830381865afa158015610d4b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d6f9190612f83565b90507398bf93ebf5c380c0e6ae8e192a7e2ae08edacc0273ffffffffffffffffffffffffffffffffffffffff1663baa2abde8585845f803060b442610db491906130f6565b6040518863ffffffff1660e01b8152600401610dd69796959493929190613162565b60408051808303815f875af1158015610df1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e159190612f45565b5050600195505050505050919050565b5f7f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf7610e5081611b8c565b82600260146101000a81548161ffff021916908361ffff1602179055506001915050919050565b5f805f73b2ca4a66d3e57a5a9a12043b6bad28249fe302d473ffffffffffffffffffffffffffffffffffffffff16631526fe27856040518263ffffffff1660e01b8152600401610ec79190612a5d565b608060405180830381865afa158015610ee2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f069190613065565b50505090505f8190508073ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f7c91906131e3565b93508073ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fc7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610feb91906131e3565b92505050915091565b73165c3410fc91ef562c50559f7d2289febed552d981565b606073a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061109b575073a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1561118e57600267ffffffffffffffff8111156110bb576110ba61320e565b5b6040519080825280602002602001820160405280156110e95781602001602082028036833780820191505090505b50905082815f81518110611100576110ff61323b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050818160018151811061114f5761114e61323b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506112db565b600367ffffffffffffffff8111156111a9576111a861320e565b5b6040519080825280602002602001820160405280156111d75781602001602082028036833780820191505090505b50905082815f815181106111ee576111ed61323b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073a1077a294dde1b09bb078844df40758a5d0f9a27816001815181106112515761125061323b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081816002815181106112a05761129f61323b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b92915050565b600260149054906101000a900461ffff1681565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f801b81565b5f8061138f848461100c565b90505f73165c3410fc91ef562c50559f7d2289febed552d973ffffffffffffffffffffffffffffffffffffffff1663d06ca61f670de0b6b3a7640000846040518363ffffffff1660e01b81526004016113e99291906132a1565b5f60405180830381865afa158015611403573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061142b91906133f2565b9050806001835161143c9190613439565b8151811061144d5761144c61323b565b5b60200260200101519250505092915050565b5f6002600154036114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c906134c6565b60405180910390fd5b60026001819055507f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf76114d781611b8c565b8273ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611546929190612fae565b6020604051808303815f875af1158015611562573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115869190612fff565b505f8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115c19190612e28565b602060405180830381865afa1580156115dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116009190612f83565b905073165c3410fc91ef562c50559f7d2289febed552d973ffffffffffffffffffffffffffffffffffffffff16635c11d795825f6116528873a1077a294dde1b09bb078844df40758a5d0f9a2761100c565b3060b44261166091906130f6565b6040518663ffffffff1660e01b81526004016116809594939291906134e4565b5f604051808303815f87803b158015611697575f80fd5b505af11580156116a9573d5f803e3d5ffd5b5050505060019250505060018081905550919050565b5f7f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf76116ea81611b8c565b5f73b2ca4a66d3e57a5a9a12043b6bad28249fe302d473ffffffffffffffffffffffffffffffffffffffff166393f1a40b85306040518363ffffffff1660e01b815260040161173a929190612f0a565b6040805180830381865afa158015611754573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117789190612f45565b50905073b2ca4a66d3e57a5a9a12043b6bad28249fe302d473ffffffffffffffffffffffffffffffffffffffff1663441a3e7085836040518363ffffffff1660e01b81526004016117ca92919061353c565b5f604051808303815f87803b1580156117e1575f80fd5b505af11580156117f3573d5f803e3d5ffd5b50505050600192505050919050565b7398bf93ebf5c380c0e6ae8e192a7e2ae08edacc0281565b61182382610a8b565b61182c81611b8c565b6118368383611c90565b50505050565b5f73b2ca4a66d3e57a5a9a12043b6bad28249fe302d473ffffffffffffffffffffffffffffffffffffffff1663149da26f83306040518363ffffffff1660e01b815260040161188c929190612f0a565b602060405180830381865afa1580156118a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118cb9190612f83565b9050919050565b5f600260015403611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f906134c6565b60405180910390fd5b60026001819055507f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf761194a81611b8c565b61195383611d79565b50600191505060018081905550919050565b73efd766ccb38eaf1dfd701853bfce31359239f30581565b5f6002600154036119c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ba906134c6565b60405180910390fd5b60026001819055507f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf76119f581611b8c565b73a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401611a4693929190613563565b6020604051808303815f875af1158015611a62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a869190612fff565b50611a90846121a8565b50611a9a84612379565b50611aa484612696565b5060019150506001808190555092915050565b732fa878ab3f87cc1c9737fc071108f904c0b0c95d81565b73a1077a294dde1b09bb078844df40758a5d0f9a2781565b7f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf781565b73b2ca4a66d3e57a5a9a12043b6bad28249fe302d481565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611b9d81611b98611c89565b6128db565b50565b5f611bab838361131a565b611c7f5760015f808581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611c1c611c89565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050611c83565b5f90505b92915050565b5f33905090565b5f611c9b838361131a565b15611d6f575f805f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611d0c611c89565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019050611d73565b5f90505b92915050565b5f73b2ca4a66d3e57a5a9a12043b6bad28249fe302d473ffffffffffffffffffffffffffffffffffffffff1663e2bbb158835f6040518363ffffffff1660e01b8152600401611dc9929190613598565b5f604051808303815f87803b158015611de0575f80fd5b505af1158015611df2573d5f803e3d5ffd5b50505050732fa878ab3f87cc1c9737fc071108f904c0b0c95d73ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611e79929190612fae565b6020604051808303815f875af1158015611e95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eb99190612fff565b505f732fa878ab3f87cc1c9737fc071108f904c0b0c95d73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f089190612e28565b602060405180830381865afa158015611f23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f479190612f83565b905073165c3410fc91ef562c50559f7d2289febed552d973ffffffffffffffffffffffffffffffffffffffff166338ed1739825f611fad732fa878ab3f87cc1c9737fc071108f904c0b0c95d73a1077a294dde1b09bb078844df40758a5d0f9a2761100c565b3060b442611fbb91906130f6565b6040518663ffffffff1660e01b8152600401611fdb9594939291906134e4565b5f604051808303815f875af1158015611ff6573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061201e91906133f2565b505f73a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161206d9190612e28565b602060405180830381865afa158015612088573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120ac9190612f83565b90505f612710600260149054906101000a900461ffff166127106120d091906135bf565b61ffff16836120df91906135f4565b6120e99190613662565b905073a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b815260040161215b929190612fae565b6020604051808303815f875af1158015612177573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061219b9190612fff565b5060019350505050919050565b5f805f6121b484610e77565b915091505f73a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016122069190612e28565b602060405180830381865afa158015612221573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122459190612f83565b90505f6002826122559190613662565b90505f73a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036122a557836122a7565b845b905073165c3410fc91ef562c50559f7d2289febed552d973ffffffffffffffffffffffffffffffffffffffff166338ed1739835f6122f973a1077a294dde1b09bb078844df40758a5d0f9a278661100c565b3060b44261230791906130f6565b6040518663ffffffff1660e01b81526004016123279594939291906134e4565b5f604051808303815f875af1158015612342573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061236a91906133f2565b50600195505050505050919050565b5f805f61238584610e77565b915091508173ffffffffffffffffffffffffffffffffffffffff1663095ea7b37398bf93ebf5c380c0e6ae8e192a7e2ae08edacc027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016123f8929190612fae565b6020604051808303815f875af1158015612414573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124389190612fff565b508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37398bf93ebf5c380c0e6ae8e192a7e2ae08edacc027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016124a8929190612fae565b6020604051808303815f875af11580156124c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124e89190612fff565b505f8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125239190612e28565b602060405180830381865afa15801561253e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125629190612f83565b90505f8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161259e9190612e28565b602060405180830381865afa1580156125b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125dd9190612f83565b90507398bf93ebf5c380c0e6ae8e192a7e2ae08edacc0273ffffffffffffffffffffffffffffffffffffffff1663e8e33700858585855f803060b44261262391906130f6565b6040518963ffffffff1660e01b8152600401612646989796959493929190613692565b6060604051808303815f875af1158015612662573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612686919061370e565b5050506001945050505050919050565b5f8073b2ca4a66d3e57a5a9a12043b6bad28249fe302d473ffffffffffffffffffffffffffffffffffffffff16631526fe27846040518263ffffffff1660e01b81526004016126e59190612a5d565b608060405180830381865afa158015612700573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127249190613065565b50505090508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373b2ca4a66d3e57a5a9a12043b6bad28249fe302d47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401612798929190612fae565b6020604051808303815f875af11580156127b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127d89190612fff565b505f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016128139190612e28565b602060405180830381865afa15801561282e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128529190612f83565b905073b2ca4a66d3e57a5a9a12043b6bad28249fe302d473ffffffffffffffffffffffffffffffffffffffff1663e2bbb15885836040518363ffffffff1660e01b81526004016128a392919061353c565b5f604051808303815f87803b1580156128ba575f80fd5b505af11580156128cc573d5f803e3d5ffd5b50505050600192505050919050565b6128e5828261131a565b6129285780826040517fe2517d3f00000000000000000000000000000000000000000000000000000000815260040161291f92919061375e565b60405180910390fd5b5050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129718161293d565b811461297b575f80fd5b50565b5f8135905061298c81612968565b92915050565b5f602082840312156129a7576129a6612935565b5b5f6129b48482850161297e565b91505092915050565b5f8115159050919050565b6129d1816129bd565b82525050565b5f6020820190506129ea5f8301846129c8565b92915050565b5f819050919050565b612a02816129f0565b8114612a0c575f80fd5b50565b5f81359050612a1d816129f9565b92915050565b5f60208284031215612a3857612a37612935565b5b5f612a4584828501612a0f565b91505092915050565b612a57816129f0565b82525050565b5f602082019050612a705f830184612a4e565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612a9f82612a76565b9050919050565b612aaf81612a95565b8114612ab9575f80fd5b50565b5f81359050612aca81612aa6565b92915050565b5f60208284031215612ae557612ae4612935565b5b5f612af284828501612abc565b91505092915050565b5f819050919050565b612b0d81612afb565b8114612b17575f80fd5b50565b5f81359050612b2881612b04565b92915050565b5f60208284031215612b4357612b42612935565b5b5f612b5084828501612b1a565b91505092915050565b612b6281612afb565b82525050565b5f602082019050612b7b5f830184612b59565b92915050565b5f8060408385031215612b9757612b96612935565b5b5f612ba485828601612b1a565b9250506020612bb585828601612abc565b9150509250929050565b5f61ffff82169050919050565b612bd581612bbf565b8114612bdf575f80fd5b50565b5f81359050612bf081612bcc565b92915050565b5f60208284031215612c0b57612c0a612935565b5b5f612c1884828501612be2565b91505092915050565b5f819050919050565b5f612c44612c3f612c3a84612a76565b612c21565b612a76565b9050919050565b5f612c5582612c2a565b9050919050565b5f612c6682612c4b565b9050919050565b612c7681612c5c565b82525050565b5f604082019050612c8f5f830185612c6d565b612c9c6020830184612c6d565b9392505050565b5f612cad82612c4b565b9050919050565b612cbd81612ca3565b82525050565b5f602082019050612cd65f830184612cb4565b92915050565b5f8060408385031215612cf257612cf1612935565b5b5f612cff85828601612abc565b9250506020612d1085828601612abc565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612d4c81612a95565b82525050565b5f612d5d8383612d43565b60208301905092915050565b5f602082019050919050565b5f612d7f82612d1a565b612d898185612d24565b9350612d9483612d34565b805f5b83811015612dc4578151612dab8882612d52565b9750612db683612d69565b925050600181019050612d97565b5085935050505092915050565b5f6020820190508181035f830152612de98184612d75565b905092915050565b612dfa81612bbf565b82525050565b5f602082019050612e135f830184612df1565b92915050565b612e2281612a95565b82525050565b5f602082019050612e3b5f830184612e19565b92915050565b5f602082019050612e545f830184612c6d565b92915050565b5f8060408385031215612e7057612e6f612935565b5b5f612e7d85828601612a0f565b9250506020612e8e85828601612a0f565b9150509250929050565b5f612ea282612c4b565b9050919050565b612eb281612e98565b82525050565b5f602082019050612ecb5f830184612ea9565b92915050565b5f612edb82612c4b565b9050919050565b612eeb81612ed1565b82525050565b5f602082019050612f045f830184612ee2565b92915050565b5f604082019050612f1d5f830185612a4e565b612f2a6020830184612e19565b9392505050565b5f81519050612f3f816129f9565b92915050565b5f8060408385031215612f5b57612f5a612935565b5b5f612f6885828601612f31565b9250506020612f7985828601612f31565b9150509250929050565b5f60208284031215612f9857612f97612935565b5b5f612fa584828501612f31565b91505092915050565b5f604082019050612fc15f830185612e19565b612fce6020830184612a4e565b9392505050565b612fde816129bd565b8114612fe8575f80fd5b50565b5f81519050612ff981612fd5565b92915050565b5f6020828403121561301457613013612935565b5b5f61302184828501612feb565b91505092915050565b5f61303482612a95565b9050919050565b6130448161302a565b811461304e575f80fd5b50565b5f8151905061305f8161303b565b92915050565b5f805f806080858703121561307d5761307c612935565b5b5f61308a87828801613051565b945050602061309b87828801612f31565b93505060406130ac87828801612f31565b92505060606130bd87828801612f31565b91505092959194509250565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613100826129f0565b915061310b836129f0565b9250828201905080821115613123576131226130c9565b5b92915050565b5f819050919050565b5f61314c61314761314284613129565b612c21565b6129f0565b9050919050565b61315c81613132565b82525050565b5f60e0820190506131755f83018a612e19565b6131826020830189612e19565b61318f6040830188612a4e565b61319c6060830187613153565b6131a96080830186613153565b6131b660a0830185612e19565b6131c360c0830184612a4e565b98975050505050505050565b5f815190506131dd81612aa6565b92915050565b5f602082840312156131f8576131f7612935565b5b5f613205848285016131cf565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f61328b61328661328184613268565b612c21565b6129f0565b9050919050565b61329b81613271565b82525050565b5f6040820190506132b45f830185613292565b81810360208301526132c68184612d75565b90509392505050565b5f80fd5b5f601f19601f8301169050919050565b6132ec826132d3565b810181811067ffffffffffffffff8211171561330b5761330a61320e565b5b80604052505050565b5f61331d61292c565b905061332982826132e3565b919050565b5f67ffffffffffffffff8211156133485761334761320e565b5b602082029050602081019050919050565b5f80fd5b5f61336f61336a8461332e565b613314565b9050808382526020820190506020840283018581111561339257613391613359565b5b835b818110156133bb57806133a78882612f31565b845260208401935050602081019050613394565b5050509392505050565b5f82601f8301126133d9576133d86132cf565b5b81516133e984826020860161335d565b91505092915050565b5f6020828403121561340757613406612935565b5b5f82015167ffffffffffffffff81111561342457613423612939565b5b613430848285016133c5565b91505092915050565b5f613443826129f0565b915061344e836129f0565b9250828203905081811115613466576134656130c9565b5b92915050565b5f82825260208201905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6134b0601f8361346c565b91506134bb8261347c565b602082019050919050565b5f6020820190508181035f8301526134dd816134a4565b9050919050565b5f60a0820190506134f75f830188612a4e565b6135046020830187613153565b81810360408301526135168186612d75565b90506135256060830185612e19565b6135326080830184612a4e565b9695505050505050565b5f60408201905061354f5f830185612a4e565b61355c6020830184612a4e565b9392505050565b5f6060820190506135765f830186612e19565b6135836020830185612e19565b6135906040830184612a4e565b949350505050565b5f6040820190506135ab5f830185612a4e565b6135b86020830184613153565b9392505050565b5f6135c982612bbf565b91506135d483612bbf565b9250828203905061ffff8111156135ee576135ed6130c9565b5b92915050565b5f6135fe826129f0565b9150613609836129f0565b9250828202613617816129f0565b9150828204841483151761362e5761362d6130c9565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61366c826129f0565b9150613677836129f0565b92508261368757613686613635565b5b828204905092915050565b5f610100820190506136a65f83018b612e19565b6136b3602083018a612e19565b6136c06040830189612a4e565b6136cd6060830188612a4e565b6136da6080830187613153565b6136e760a0830186613153565b6136f460c0830185612e19565b61370160e0830184612a4e565b9998505050505050505050565b5f805f6060848603121561372557613724612935565b5b5f61373286828701612f31565b935050602061374386828701612f31565b925050604061375486828701612f31565b9150509250925092565b5f6040820190506137715f830185612e19565b61377e6020830184612b59565b939250505056fea264697066735822122043af4a7a14afdf32d3b7e2ec0e759f1a8bfb03d0f9f19b937466ba87cec566a664736f6c63430008140033
Deployed ByteCode
0x6080604052600436106101db575f3560e01c80638f9afcc211610101578063dacda1e911610094578063e4932abe11610063578063e4932abe146107a7578063ef8ef56f146107d1578063f6468251146107fb578063fb1db278146108255761024e565b8063dacda1e9146106d5578063ddc6326214610711578063e0bab4c41461074d578063e2bbb158146107775761024e565b8063babed18a116100d0578063babed18a1461060b578063c477899814610647578063d4b5492614610683578063d547741f146106ad5761024e565b80638f9afcc21461053f57806391d1485414610569578063a217fddf146105a5578063afa99860146105cf5761024e565b806336568abe116101795780636721eb97116101485780636721eb9714610472578063744fbc7a146104af5780637925c695146104d957806385ca2b0a146105155761024e565b806336568abe146103965780633bbed4a0146103be57806365ae77db146103fa57806365e38144146104365761024e565b8063202920ef116101b5578063202920ef146102f2578063248a9ca31461031c5780632e64cec1146103585780632f2ff15d1461036e5761024e565b806301ffc9a71461025257806303901fe71461028e57806314127a3b146102ca5761024e565b3661024e5773a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b15801561023a575f80fd5b505af115801561024c573d5f803e3d5ffd5b005b5f80fd5b34801561025d575f80fd5b5061027860048036038101906102739190612992565b61084f565b60405161028591906129d7565b60405180910390f35b348015610299575f80fd5b506102b460048036038101906102af9190612a23565b6108c8565b6040516102c19190612a5d565b60405180910390f35b3480156102d5575f80fd5b506102f060048036038101906102eb9190612ad0565b610960565b005b3480156102fd575f80fd5b50610306610a86565b6040516103139190612a5d565b60405180910390f35b348015610327575f80fd5b50610342600480360381019061033d9190612b2e565b610a8b565b60405161034f9190612b68565b60405180910390f35b348015610363575f80fd5b5061036c610aa7565b005b348015610379575f80fd5b50610394600480360381019061038f9190612b81565b610b18565b005b3480156103a1575f80fd5b506103bc60048036038101906103b79190612b81565b610b3a565b005b3480156103c9575f80fd5b506103e460048036038101906103df9190612ad0565b610bb5565b6040516103f191906129d7565b60405180910390f35b348015610405575f80fd5b50610420600480360381019061041b9190612a23565b610c2a565b60405161042d91906129d7565b60405180910390f35b348015610441575f80fd5b5061045c60048036038101906104579190612bf6565b610e25565b60405161046991906129d7565b60405180910390f35b34801561047d575f80fd5b5061049860048036038101906104939190612a23565b610e77565b6040516104a6929190612c7c565b60405180910390f35b3480156104ba575f80fd5b506104c3610ff4565b6040516104d09190612cc3565b60405180910390f35b3480156104e4575f80fd5b506104ff60048036038101906104fa9190612cdc565b61100c565b60405161050c9190612dd1565b60405180910390f35b348015610520575f80fd5b506105296112e1565b6040516105369190612e00565b60405180910390f35b34801561054a575f80fd5b506105536112f5565b6040516105609190612e28565b60405180910390f35b348015610574575f80fd5b5061058f600480360381019061058a9190612b81565b61131a565b60405161059c91906129d7565b60405180910390f35b3480156105b0575f80fd5b506105b961137d565b6040516105c69190612b68565b60405180910390f35b3480156105da575f80fd5b506105f560048036038101906105f09190612cdc565b611383565b6040516106029190612a5d565b60405180910390f35b348015610616575f80fd5b50610631600480360381019061062c9190612ad0565b61145f565b60405161063e91906129d7565b60405180910390f35b348015610652575f80fd5b5061066d60048036038101906106689190612a23565b6116bf565b60405161067a91906129d7565b60405180910390f35b34801561068e575f80fd5b50610697611802565b6040516106a49190612cc3565b60405180910390f35b3480156106b8575f80fd5b506106d360048036038101906106ce9190612b81565b61181a565b005b3480156106e0575f80fd5b506106fb60048036038101906106f69190612a23565b61183c565b6040516107089190612a5d565b60405180910390f35b34801561071c575f80fd5b5061073760048036038101906107329190612a23565b6118d2565b60405161074491906129d7565b60405180910390f35b348015610758575f80fd5b50610761611965565b60405161076e9190612e41565b60405180910390f35b610791600480360381019061078c9190612e5a565b61197d565b60405161079e91906129d7565b60405180910390f35b3480156107b2575f80fd5b506107bb611ab7565b6040516107c89190612e41565b60405180910390f35b3480156107dc575f80fd5b506107e5611acf565b6040516107f29190612eb8565b60405180910390f35b348015610806575f80fd5b5061080f611ae7565b60405161081c9190612b68565b60405180910390f35b348015610830575f80fd5b50610839611b0b565b6040516108469190612ef1565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108c157506108c082611b23565b5b9050919050565b5f73b2ca4a66d3e57a5a9a12043b6bad28249fe302d473ffffffffffffffffffffffffffffffffffffffff166393f1a40b83306040518363ffffffff1660e01b8152600401610918929190612f0a565b6040805180830381865afa158015610932573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109569190612f45565b5080915050919050565b7f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf761098a81611b8c565b5f8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109c49190612e28565b602060405180830381865afa1580156109df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a039190612f83565b90508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610a40929190612fae565b6020604051808303815f875af1158015610a5c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a809190612fff565b50505050565b60b481565b5f805f8381526020019081526020015f20600101549050919050565b7f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf7610ad181611b8c565b3373ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015610b14573d5f803e3d5ffd5b5050565b610b2182610a8b565b610b2a81611b8c565b610b348383611ba0565b50505050565b610b42611c89565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ba6576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bb08282611c90565b505050565b5f7f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf7610be081611b8c565b8260025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001915050919050565b5f7f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf7610c5581611b8c565b5f80610c6085610e77565b915091505f73b2ca4a66d3e57a5a9a12043b6bad28249fe302d473ffffffffffffffffffffffffffffffffffffffff16631526fe27876040518263ffffffff1660e01b8152600401610cb29190612a5d565b608060405180830381865afa158015610ccd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf19190613065565b50505090505f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d309190612e28565b602060405180830381865afa158015610d4b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d6f9190612f83565b90507398bf93ebf5c380c0e6ae8e192a7e2ae08edacc0273ffffffffffffffffffffffffffffffffffffffff1663baa2abde8585845f803060b442610db491906130f6565b6040518863ffffffff1660e01b8152600401610dd69796959493929190613162565b60408051808303815f875af1158015610df1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e159190612f45565b5050600195505050505050919050565b5f7f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf7610e5081611b8c565b82600260146101000a81548161ffff021916908361ffff1602179055506001915050919050565b5f805f73b2ca4a66d3e57a5a9a12043b6bad28249fe302d473ffffffffffffffffffffffffffffffffffffffff16631526fe27856040518263ffffffff1660e01b8152600401610ec79190612a5d565b608060405180830381865afa158015610ee2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f069190613065565b50505090505f8190508073ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f7c91906131e3565b93508073ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fc7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610feb91906131e3565b92505050915091565b73165c3410fc91ef562c50559f7d2289febed552d981565b606073a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061109b575073a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1561118e57600267ffffffffffffffff8111156110bb576110ba61320e565b5b6040519080825280602002602001820160405280156110e95781602001602082028036833780820191505090505b50905082815f81518110611100576110ff61323b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050818160018151811061114f5761114e61323b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506112db565b600367ffffffffffffffff8111156111a9576111a861320e565b5b6040519080825280602002602001820160405280156111d75781602001602082028036833780820191505090505b50905082815f815181106111ee576111ed61323b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073a1077a294dde1b09bb078844df40758a5d0f9a27816001815181106112515761125061323b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081816002815181106112a05761129f61323b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b92915050565b600260149054906101000a900461ffff1681565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f801b81565b5f8061138f848461100c565b90505f73165c3410fc91ef562c50559f7d2289febed552d973ffffffffffffffffffffffffffffffffffffffff1663d06ca61f670de0b6b3a7640000846040518363ffffffff1660e01b81526004016113e99291906132a1565b5f60405180830381865afa158015611403573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061142b91906133f2565b9050806001835161143c9190613439565b8151811061144d5761144c61323b565b5b60200260200101519250505092915050565b5f6002600154036114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c906134c6565b60405180910390fd5b60026001819055507f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf76114d781611b8c565b8273ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611546929190612fae565b6020604051808303815f875af1158015611562573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115869190612fff565b505f8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115c19190612e28565b602060405180830381865afa1580156115dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116009190612f83565b905073165c3410fc91ef562c50559f7d2289febed552d973ffffffffffffffffffffffffffffffffffffffff16635c11d795825f6116528873a1077a294dde1b09bb078844df40758a5d0f9a2761100c565b3060b44261166091906130f6565b6040518663ffffffff1660e01b81526004016116809594939291906134e4565b5f604051808303815f87803b158015611697575f80fd5b505af11580156116a9573d5f803e3d5ffd5b5050505060019250505060018081905550919050565b5f7f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf76116ea81611b8c565b5f73b2ca4a66d3e57a5a9a12043b6bad28249fe302d473ffffffffffffffffffffffffffffffffffffffff166393f1a40b85306040518363ffffffff1660e01b815260040161173a929190612f0a565b6040805180830381865afa158015611754573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117789190612f45565b50905073b2ca4a66d3e57a5a9a12043b6bad28249fe302d473ffffffffffffffffffffffffffffffffffffffff1663441a3e7085836040518363ffffffff1660e01b81526004016117ca92919061353c565b5f604051808303815f87803b1580156117e1575f80fd5b505af11580156117f3573d5f803e3d5ffd5b50505050600192505050919050565b7398bf93ebf5c380c0e6ae8e192a7e2ae08edacc0281565b61182382610a8b565b61182c81611b8c565b6118368383611c90565b50505050565b5f73b2ca4a66d3e57a5a9a12043b6bad28249fe302d473ffffffffffffffffffffffffffffffffffffffff1663149da26f83306040518363ffffffff1660e01b815260040161188c929190612f0a565b602060405180830381865afa1580156118a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118cb9190612f83565b9050919050565b5f600260015403611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f906134c6565b60405180910390fd5b60026001819055507f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf761194a81611b8c565b61195383611d79565b50600191505060018081905550919050565b73efd766ccb38eaf1dfd701853bfce31359239f30581565b5f6002600154036119c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ba906134c6565b60405180910390fd5b60026001819055507f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf76119f581611b8c565b73a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401611a4693929190613563565b6020604051808303815f875af1158015611a62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a869190612fff565b50611a90846121a8565b50611a9a84612379565b50611aa484612696565b5060019150506001808190555092915050565b732fa878ab3f87cc1c9737fc071108f904c0b0c95d81565b73a1077a294dde1b09bb078844df40758a5d0f9a2781565b7f0393b4c1b6519e8b53ae0efa1ab522060a3b9f8d86d09c8a22ca6d6eea735cf781565b73b2ca4a66d3e57a5a9a12043b6bad28249fe302d481565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611b9d81611b98611c89565b6128db565b50565b5f611bab838361131a565b611c7f5760015f808581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611c1c611c89565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050611c83565b5f90505b92915050565b5f33905090565b5f611c9b838361131a565b15611d6f575f805f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611d0c611c89565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019050611d73565b5f90505b92915050565b5f73b2ca4a66d3e57a5a9a12043b6bad28249fe302d473ffffffffffffffffffffffffffffffffffffffff1663e2bbb158835f6040518363ffffffff1660e01b8152600401611dc9929190613598565b5f604051808303815f87803b158015611de0575f80fd5b505af1158015611df2573d5f803e3d5ffd5b50505050732fa878ab3f87cc1c9737fc071108f904c0b0c95d73ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611e79929190612fae565b6020604051808303815f875af1158015611e95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eb99190612fff565b505f732fa878ab3f87cc1c9737fc071108f904c0b0c95d73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f089190612e28565b602060405180830381865afa158015611f23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f479190612f83565b905073165c3410fc91ef562c50559f7d2289febed552d973ffffffffffffffffffffffffffffffffffffffff166338ed1739825f611fad732fa878ab3f87cc1c9737fc071108f904c0b0c95d73a1077a294dde1b09bb078844df40758a5d0f9a2761100c565b3060b442611fbb91906130f6565b6040518663ffffffff1660e01b8152600401611fdb9594939291906134e4565b5f604051808303815f875af1158015611ff6573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061201e91906133f2565b505f73a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161206d9190612e28565b602060405180830381865afa158015612088573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120ac9190612f83565b90505f612710600260149054906101000a900461ffff166127106120d091906135bf565b61ffff16836120df91906135f4565b6120e99190613662565b905073a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b815260040161215b929190612fae565b6020604051808303815f875af1158015612177573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061219b9190612fff565b5060019350505050919050565b5f805f6121b484610e77565b915091505f73a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016122069190612e28565b602060405180830381865afa158015612221573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122459190612f83565b90505f6002826122559190613662565b90505f73a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036122a557836122a7565b845b905073165c3410fc91ef562c50559f7d2289febed552d973ffffffffffffffffffffffffffffffffffffffff166338ed1739835f6122f973a1077a294dde1b09bb078844df40758a5d0f9a278661100c565b3060b44261230791906130f6565b6040518663ffffffff1660e01b81526004016123279594939291906134e4565b5f604051808303815f875af1158015612342573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061236a91906133f2565b50600195505050505050919050565b5f805f61238584610e77565b915091508173ffffffffffffffffffffffffffffffffffffffff1663095ea7b37398bf93ebf5c380c0e6ae8e192a7e2ae08edacc027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016123f8929190612fae565b6020604051808303815f875af1158015612414573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124389190612fff565b508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37398bf93ebf5c380c0e6ae8e192a7e2ae08edacc027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016124a8929190612fae565b6020604051808303815f875af11580156124c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124e89190612fff565b505f8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125239190612e28565b602060405180830381865afa15801561253e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125629190612f83565b90505f8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161259e9190612e28565b602060405180830381865afa1580156125b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125dd9190612f83565b90507398bf93ebf5c380c0e6ae8e192a7e2ae08edacc0273ffffffffffffffffffffffffffffffffffffffff1663e8e33700858585855f803060b44261262391906130f6565b6040518963ffffffff1660e01b8152600401612646989796959493929190613692565b6060604051808303815f875af1158015612662573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612686919061370e565b5050506001945050505050919050565b5f8073b2ca4a66d3e57a5a9a12043b6bad28249fe302d473ffffffffffffffffffffffffffffffffffffffff16631526fe27846040518263ffffffff1660e01b81526004016126e59190612a5d565b608060405180830381865afa158015612700573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127249190613065565b50505090508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373b2ca4a66d3e57a5a9a12043b6bad28249fe302d47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401612798929190612fae565b6020604051808303815f875af11580156127b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127d89190612fff565b505f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016128139190612e28565b602060405180830381865afa15801561282e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128529190612f83565b905073b2ca4a66d3e57a5a9a12043b6bad28249fe302d473ffffffffffffffffffffffffffffffffffffffff1663e2bbb15885836040518363ffffffff1660e01b81526004016128a392919061353c565b5f604051808303815f87803b1580156128ba575f80fd5b505af11580156128cc573d5f803e3d5ffd5b50505050600192505050919050565b6128e5828261131a565b6129285780826040517fe2517d3f00000000000000000000000000000000000000000000000000000000815260040161291f92919061375e565b60405180910390fd5b5050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129718161293d565b811461297b575f80fd5b50565b5f8135905061298c81612968565b92915050565b5f602082840312156129a7576129a6612935565b5b5f6129b48482850161297e565b91505092915050565b5f8115159050919050565b6129d1816129bd565b82525050565b5f6020820190506129ea5f8301846129c8565b92915050565b5f819050919050565b612a02816129f0565b8114612a0c575f80fd5b50565b5f81359050612a1d816129f9565b92915050565b5f60208284031215612a3857612a37612935565b5b5f612a4584828501612a0f565b91505092915050565b612a57816129f0565b82525050565b5f602082019050612a705f830184612a4e565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612a9f82612a76565b9050919050565b612aaf81612a95565b8114612ab9575f80fd5b50565b5f81359050612aca81612aa6565b92915050565b5f60208284031215612ae557612ae4612935565b5b5f612af284828501612abc565b91505092915050565b5f819050919050565b612b0d81612afb565b8114612b17575f80fd5b50565b5f81359050612b2881612b04565b92915050565b5f60208284031215612b4357612b42612935565b5b5f612b5084828501612b1a565b91505092915050565b612b6281612afb565b82525050565b5f602082019050612b7b5f830184612b59565b92915050565b5f8060408385031215612b9757612b96612935565b5b5f612ba485828601612b1a565b9250506020612bb585828601612abc565b9150509250929050565b5f61ffff82169050919050565b612bd581612bbf565b8114612bdf575f80fd5b50565b5f81359050612bf081612bcc565b92915050565b5f60208284031215612c0b57612c0a612935565b5b5f612c1884828501612be2565b91505092915050565b5f819050919050565b5f612c44612c3f612c3a84612a76565b612c21565b612a76565b9050919050565b5f612c5582612c2a565b9050919050565b5f612c6682612c4b565b9050919050565b612c7681612c5c565b82525050565b5f604082019050612c8f5f830185612c6d565b612c9c6020830184612c6d565b9392505050565b5f612cad82612c4b565b9050919050565b612cbd81612ca3565b82525050565b5f602082019050612cd65f830184612cb4565b92915050565b5f8060408385031215612cf257612cf1612935565b5b5f612cff85828601612abc565b9250506020612d1085828601612abc565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612d4c81612a95565b82525050565b5f612d5d8383612d43565b60208301905092915050565b5f602082019050919050565b5f612d7f82612d1a565b612d898185612d24565b9350612d9483612d34565b805f5b83811015612dc4578151612dab8882612d52565b9750612db683612d69565b925050600181019050612d97565b5085935050505092915050565b5f6020820190508181035f830152612de98184612d75565b905092915050565b612dfa81612bbf565b82525050565b5f602082019050612e135f830184612df1565b92915050565b612e2281612a95565b82525050565b5f602082019050612e3b5f830184612e19565b92915050565b5f602082019050612e545f830184612c6d565b92915050565b5f8060408385031215612e7057612e6f612935565b5b5f612e7d85828601612a0f565b9250506020612e8e85828601612a0f565b9150509250929050565b5f612ea282612c4b565b9050919050565b612eb281612e98565b82525050565b5f602082019050612ecb5f830184612ea9565b92915050565b5f612edb82612c4b565b9050919050565b612eeb81612ed1565b82525050565b5f602082019050612f045f830184612ee2565b92915050565b5f604082019050612f1d5f830185612a4e565b612f2a6020830184612e19565b9392505050565b5f81519050612f3f816129f9565b92915050565b5f8060408385031215612f5b57612f5a612935565b5b5f612f6885828601612f31565b9250506020612f7985828601612f31565b9150509250929050565b5f60208284031215612f9857612f97612935565b5b5f612fa584828501612f31565b91505092915050565b5f604082019050612fc15f830185612e19565b612fce6020830184612a4e565b9392505050565b612fde816129bd565b8114612fe8575f80fd5b50565b5f81519050612ff981612fd5565b92915050565b5f6020828403121561301457613013612935565b5b5f61302184828501612feb565b91505092915050565b5f61303482612a95565b9050919050565b6130448161302a565b811461304e575f80fd5b50565b5f8151905061305f8161303b565b92915050565b5f805f806080858703121561307d5761307c612935565b5b5f61308a87828801613051565b945050602061309b87828801612f31565b93505060406130ac87828801612f31565b92505060606130bd87828801612f31565b91505092959194509250565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613100826129f0565b915061310b836129f0565b9250828201905080821115613123576131226130c9565b5b92915050565b5f819050919050565b5f61314c61314761314284613129565b612c21565b6129f0565b9050919050565b61315c81613132565b82525050565b5f60e0820190506131755f83018a612e19565b6131826020830189612e19565b61318f6040830188612a4e565b61319c6060830187613153565b6131a96080830186613153565b6131b660a0830185612e19565b6131c360c0830184612a4e565b98975050505050505050565b5f815190506131dd81612aa6565b92915050565b5f602082840312156131f8576131f7612935565b5b5f613205848285016131cf565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f61328b61328661328184613268565b612c21565b6129f0565b9050919050565b61329b81613271565b82525050565b5f6040820190506132b45f830185613292565b81810360208301526132c68184612d75565b90509392505050565b5f80fd5b5f601f19601f8301169050919050565b6132ec826132d3565b810181811067ffffffffffffffff8211171561330b5761330a61320e565b5b80604052505050565b5f61331d61292c565b905061332982826132e3565b919050565b5f67ffffffffffffffff8211156133485761334761320e565b5b602082029050602081019050919050565b5f80fd5b5f61336f61336a8461332e565b613314565b9050808382526020820190506020840283018581111561339257613391613359565b5b835b818110156133bb57806133a78882612f31565b845260208401935050602081019050613394565b5050509392505050565b5f82601f8301126133d9576133d86132cf565b5b81516133e984826020860161335d565b91505092915050565b5f6020828403121561340757613406612935565b5b5f82015167ffffffffffffffff81111561342457613423612939565b5b613430848285016133c5565b91505092915050565b5f613443826129f0565b915061344e836129f0565b9250828203905081811115613466576134656130c9565b5b92915050565b5f82825260208201905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6134b0601f8361346c565b91506134bb8261347c565b602082019050919050565b5f6020820190508181035f8301526134dd816134a4565b9050919050565b5f60a0820190506134f75f830188612a4e565b6135046020830187613153565b81810360408301526135168186612d75565b90506135256060830185612e19565b6135326080830184612a4e565b9695505050505050565b5f60408201905061354f5f830185612a4e565b61355c6020830184612a4e565b9392505050565b5f6060820190506135765f830186612e19565b6135836020830185612e19565b6135906040830184612a4e565b949350505050565b5f6040820190506135ab5f830185612a4e565b6135b86020830184613153565b9392505050565b5f6135c982612bbf565b91506135d483612bbf565b9250828203905061ffff8111156135ee576135ed6130c9565b5b92915050565b5f6135fe826129f0565b9150613609836129f0565b9250828202613617816129f0565b9150828204841483151761362e5761362d6130c9565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61366c826129f0565b9150613677836129f0565b92508261368757613686613635565b5b828204905092915050565b5f610100820190506136a65f83018b612e19565b6136b3602083018a612e19565b6136c06040830189612a4e565b6136cd6060830188612a4e565b6136da6080830187613153565b6136e760a0830186613153565b6136f460c0830185612e19565b61370160e0830184612a4e565b9998505050505050505050565b5f805f6060848603121561372557613724612935565b5b5f61373286828701612f31565b935050602061374386828701612f31565b925050604061375486828701612f31565b9150509250925092565b5f6040820190506137715f830185612e19565b61377e6020830184612b59565b939250505056fea264697066735822122043af4a7a14afdf32d3b7e2ec0e759f1a8bfb03d0f9f19b937466ba87cec566a664736f6c63430008140033