More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 58 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Eth | 15878725 | 759 days ago | IN | 0 ETH | 0.00039531 | ||||
Swap Assets | 15878545 | 759 days ago | IN | 0 ETH | 0.00677149 | ||||
Swap Assets | 15878543 | 759 days ago | IN | 0 ETH | 0.00891039 | ||||
Withdraw Eth | 15878529 | 759 days ago | IN | 0 ETH | 0.00038775 | ||||
Swap Assets | 15878464 | 759 days ago | IN | 0 ETH | 0.00976739 | ||||
Transfer Operato... | 15878442 | 759 days ago | IN | 0 ETH | 0.00038791 | ||||
Payback | 15875458 | 760 days ago | IN | 0.00004229 ETH | 0.00102645 | ||||
Loan Ether | 15875417 | 760 days ago | IN | 0 ETH | 0.00415198 | ||||
Loan Ether | 15875100 | 760 days ago | IN | 0 ETH | 0.00392195 | ||||
Payback | 15846610 | 764 days ago | IN | 0.07047153 ETH | 0.00201976 | ||||
Loan Ether | 15846604 | 764 days ago | IN | 0 ETH | 0.00610608 | ||||
Transfer | 15845290 | 764 days ago | IN | 1 ETH | 0.00021289 | ||||
Payback | 15813030 | 768 days ago | IN | 0.01710115 ETH | 0.00271614 | ||||
Loan Ether | 15813024 | 768 days ago | IN | 0 ETH | 0.00617785 | ||||
Transfer | 15812753 | 768 days ago | IN | 0.4 ETH | 0.00037743 | ||||
Loan Ether | 15812360 | 768 days ago | IN | 0 ETH | 0.00855351 | ||||
Transfer | 15811757 | 769 days ago | IN | 0.15 ETH | 0.00027066 | ||||
Add Loan Pool | 15805335 | 769 days ago | IN | 0 ETH | 0.00379538 | ||||
Add Loan Pool | 15805331 | 769 days ago | IN | 0 ETH | 0.00338997 | ||||
Add Loan Pool | 15805328 | 769 days ago | IN | 0 ETH | 0.00354014 | ||||
Add Loan Pool | 15805324 | 769 days ago | IN | 0 ETH | 0.00396787 | ||||
Add Loan Pool | 15805322 | 769 days ago | IN | 0 ETH | 0.0037641 | ||||
Add Loan Pool | 15805319 | 769 days ago | IN | 0 ETH | 0.00343232 | ||||
Add Loan Pool | 15805312 | 769 days ago | IN | 0 ETH | 0.00342568 | ||||
Add Loan Pool | 15805312 | 769 days ago | IN | 0 ETH | 0.0032785 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
15878725 | 759 days ago | 1.42862346 ETH | ||||
15878543 | 759 days ago | 0 ETH | ||||
15878529 | 759 days ago | 0.05 ETH | ||||
15878464 | 759 days ago | 0 ETH | ||||
15875417 | 760 days ago | 0.00004067 ETH | ||||
15875100 | 760 days ago | 0.10522124 ETH | ||||
15846604 | 764 days ago | 0.06776109 ETH | ||||
15813024 | 768 days ago | 0.01644341 ETH | ||||
15812360 | 768 days ago | 0 ETH | ||||
15805008 | 769 days ago | 0.00017839 ETH | ||||
15805008 | 769 days ago | 0.00006816 ETH | ||||
15805008 | 769 days ago | 0.00000777 ETH | ||||
15805008 | 769 days ago | 0.00050754 ETH | ||||
15804934 | 769 days ago | 0.00018151 ETH | ||||
15804934 | 769 days ago | 0.00006642 ETH | ||||
15804934 | 769 days ago | 0.00000782 ETH | ||||
15804934 | 769 days ago | 0.00050856 ETH | ||||
15804902 | 769 days ago | 0.00018191 ETH | ||||
15804871 | 770 days ago | 0.00014706 ETH | ||||
15804835 | 770 days ago | 0.00007407 ETH | ||||
15804804 | 770 days ago | 0.00002542 ETH | ||||
15804784 | 770 days ago | 0.0000127 ETH | ||||
15804758 | 770 days ago | 0.00000315 ETH | ||||
15804729 | 770 days ago | 0.00001579 ETH | ||||
15804688 | 770 days ago | 0.00020267 ETH |
Loading...
Loading
Contract Name:
Loan
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-22 */ // SPDX-License-Identifier: UNLICENSED pragma solidity >=0.7.0 <0.9.0; // TODO(zx): Replace all instances of SafeMath with OZ implementation library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; assert(a == b * c + (a % b)); // There is no case in which this doesn't hold return c; } // Only used in the BondingCalculator.sol function sqrrt(uint256 a) internal pure returns (uint256 c) { if (a > 3) { c = a; uint256 b = add(div(a, 2), 1); while (b < c) { c = b; b = div(add(div(a, b), b), 2); } } else if (a != 0) { c = 1; } } } interface IERC20 { function increaseAllowance(address spender, uint256 addedValue) external returns (bool); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); } interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Pair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 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 (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 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 (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); 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 (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } 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() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @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]. */ 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 make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } contract Loan is Ownable, ReentrancyGuard { using SafeMath for uint256; uint256 public ethLimit; // percentage: user can borrow eth limit uint256 public nativeTokenMin; address public nativeTokenAddress; address public operator; struct LoanPool { uint256 loanDuration; uint256 loanLimit; uint256 loanLimitNative; uint256 repayRate; bool closed; } struct LoanRequest { address borrower; address token; uint256 loanAmount; uint256 collateralAmount; uint256 paybackAmount; uint256 loanDueDate; uint256 duration; uint256 loanId; bool isPayback; } uint256 public lastSwapTs; mapping(address => address[]) public swapPaths; mapping(address => uint256) public userLoansCount; mapping(address => mapping(uint256 => LoanRequest)) public loans; address[] public collateralTokens; address[] public loanUsers; mapping(address => uint256) public loanPoolLength; mapping(address => mapping(uint256 => LoanPool)) public loanPools; IUniswapV2Router02 public immutable uniswapV2Router; event NewAddLoanPool( address collateralToken, uint256 loanDuration, uint256 loanLimit, uint256 loanLimitNative, uint256 repayRate ); event NewLoanEther( address indexed borrower, uint256 loanAmount, uint256 collateralAmount, uint256 paybackAmount, uint256 loanDueDate, uint256 duration ); event PayBack( address borrower, bool paybackSuccess, uint256 paybackTime, uint256 paybackAmount, uint256 returnCollateralAmount ); event Received(address, uint256); event UpdatePairToken(address collateralToken, address[] swapPath); constructor( address _nativeTokenAddress, address _routerAddress, uint256 _nativeMin, uint256 _ethLimit ) { ethLimit = _ethLimit; nativeTokenMin = _nativeMin; nativeTokenAddress = _nativeTokenAddress; operator = msg.sender; IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02( _routerAddress ); uniswapV2Router = _uniswapV2Router; } // Operator CAN do modifier modifier onlyOperator() { require(operator == msg.sender, "operator: caller is not the operator"); _; } modifier onlyOwnerOrOperator() { require( (msg.sender == owner()) || (msg.sender == operator), "Not owner or operator" ); _; } receive() external payable { emit Received(msg.sender, msg.value); } function addLoanPool( address _collateralToken, uint256 _loanDuration, uint256 _loanLimit, uint256 _loanLimitNative, uint256 _repayRate, address[] memory _path ) public onlyOwner { require( _collateralToken != address(0), "update: Zero collateral address" ); require(_loanLimit < 100, "add: Can't over 100% limit"); require(_loanLimitNative < 100, "add: Can't over 100% limit"); require(_repayRate >= 100, "add: shold be over 100%"); bool isColToken = isCollateralToken(_collateralToken); if (!isColToken) { collateralTokens.push(_collateralToken); swapPaths[_collateralToken] = _path; } LoanPool memory newLoanPool; newLoanPool.loanDuration = _loanDuration; newLoanPool.loanLimit = _loanLimit; newLoanPool.loanLimitNative = _loanLimitNative; newLoanPool.repayRate = _repayRate; newLoanPool.closed = false; uint256 loanPoolLen = loanPoolLength[_collateralToken]; loanPools[_collateralToken][loanPoolLen] = newLoanPool; loanPoolLength[_collateralToken]++; emit NewAddLoanPool( _collateralToken, _loanDuration, _loanLimit, _loanLimitNative, _repayRate ); } function updateLoanPool( address _collateralToken, uint256 _index, uint256 _loanDuration, uint256 _loanLimit, uint256 _loanLimitNative, uint256 _repayRate ) public onlyOwner { require( _collateralToken != address(0), "update: Zero collateral address" ); bool isColToken = isCollateralToken(_collateralToken); require(isColToken, "update: No collateral token"); uint256 loanIdLen = loanPoolLength[_collateralToken]; require(_index < loanIdLen, "update: No valid index"); require(_loanLimit < 100, "add: Can't over 100% limit"); require(_loanLimitNative < 100, "add: Can't over 100% limit"); require(_repayRate >= 100, "add: shold be over 100%"); loanPools[_collateralToken][_index].loanDuration = _loanDuration; loanPools[_collateralToken][_index].loanLimit = _loanLimit; loanPools[_collateralToken][_index].loanLimitNative = _loanLimitNative; loanPools[_collateralToken][_index].repayRate = _repayRate; } function updateSwapPath(address _collateralToken, address[] memory _path) public onlyOwner { require( _collateralToken != address(0), "update: Zero collateral address" ); bool isColToken = isCollateralToken(_collateralToken); require(isColToken, "update: No collateral token"); swapPaths[_collateralToken] = _path; emit UpdatePairToken(_collateralToken, _path); } function setLoanPoolClose( address _collateralToken, uint256 _loanPoolId, bool _closed ) public onlyOwner { require( _collateralToken != address(0), "update: Zero collateral address" ); bool isColToken = isCollateralToken(_collateralToken); require(isColToken, "update: No collateral token"); uint256 loanIdLen = loanPoolLength[_collateralToken]; require(_loanPoolId < loanIdLen, "set: No valid loan pool id"); loanPools[_collateralToken][_loanPoolId].closed = _closed; } function isCollateralToken(address _addr) public view returns (bool) { uint256 len = collateralTokens.length; bool isToken = false; for (uint256 i = 0; i < len; i++) { if (_addr == collateralTokens[i]) { isToken = true; break; } } return isToken; } function isNativeTokenHolder(address _user) public view returns (bool) { uint256 balance = IERC20(nativeTokenAddress).balanceOf(_user); if (balance > nativeTokenMin) { return true; } return false; } function updateNativeToken(address _tokenAddress, uint256 _min) public onlyOwner { require(_tokenAddress != address(0), "native: zero token address"); nativeTokenAddress = _tokenAddress; nativeTokenMin = _min; } function updateEthLimit(uint256 _ethLimit) public onlyOwner { require(ethLimit < 100, "update: Eth limit should be less than 100%"); ethLimit = _ethLimit; } // calculate require colleteral token amount by passing ether amount function countCollateralFromEther( address _collateralToken, uint256 _limit, uint256 _amount ) public view returns (uint256) { address[] memory path = swapPaths[_collateralToken]; uint256[] memory amounts = new uint256[](path.length); amounts = uniswapV2Router.getAmountsIn(_amount, path); uint256 result = amounts[0].div(_limit).mul(100); return result; } // calculate require ether amount by passing collateral amount function countEtherFromCollateral( address _collateralToken, uint256 _limit, uint256 _tokenAmount ) public view returns (uint256) { address[] memory path = swapPaths[_collateralToken]; uint256[] memory amounts = new uint256[](path.length); amounts = uniswapV2Router.getAmountsOut(_tokenAmount, path); uint256 result = amounts[path.length - 1].mul(_limit).div(100); return result; } function checkMax(uint256 _amount) public view returns (bool) { uint256 totalEth = address(this).balance; uint256 loanMax = totalEth.mul(ethLimit).div(100); if (_amount > loanMax) { return false; } else { return true; } } function TokenTransfer( address _user, address _collateralToken, uint256 _tokenAmount ) private returns (bool) { bool transferred = IERC20(_collateralToken).transferFrom( _user, address(this), _tokenAmount ); return transferred; } function loanEther( address _collateralToken, uint256 _loanPoolId, uint256 _tokenAmount ) public nonReentrant { require( !loanPools[_collateralToken][_loanPoolId].closed, "loanEther: Loan Pool is closed" ); uint256 tokenAmount = _tokenAmount; address collateralToken = _collateralToken; uint256 loanPoolId = _loanPoolId; uint256 loanPoolLen = loanPoolLength[collateralToken]; require(loanPoolLen > loanPoolId, "loanEther: no valid loan Id"); uint256 balance = IERC20(collateralToken).balanceOf(msg.sender); require(balance > tokenAmount, "loanEther: not enough token balance"); bool isHolder = isNativeTokenHolder(msg.sender); uint256 limit = !isHolder ? loanPools[collateralToken][loanPoolId].loanLimit : loanPools[collateralToken][loanPoolId].loanLimitNative; uint256 beforeBalance = IERC20(collateralToken).balanceOf( address(this) ); require( TokenTransfer(msg.sender, collateralToken, tokenAmount), "loanEther: Transfer token from user to contract failed" ); uint256 afterBalance = IERC20(collateralToken).balanceOf(address(this)); uint256 tokenAmountReal = afterBalance - beforeBalance; uint256 ethAmountReal = countEtherFromCollateral( collateralToken, limit, tokenAmountReal ); bool isOldUser = false; for (uint256 i = 0; i < loanUsers.length; i++) { if (loanUsers[i] == msg.sender) { isOldUser = true; break; } } if (isOldUser == false) { loanUsers.push(msg.sender); } require( checkMax(ethAmountReal), "loanEther: not enough liquidity or over max ETH amount" ); LoanRequest memory newLoan; newLoan.borrower = msg.sender; newLoan.loanAmount = ethAmountReal; newLoan.collateralAmount = tokenAmountReal; newLoan.loanId = userLoansCount[msg.sender]; newLoan.isPayback = false; newLoan.token = collateralToken; uint256 repayRate = loanPools[collateralToken][loanPoolId].repayRate; uint256 loanDuration = loanPools[collateralToken][loanPoolId] .loanDuration; newLoan.paybackAmount = ethAmountReal.mul(repayRate).div(100); newLoan.loanDueDate = block.timestamp + loanDuration; newLoan.duration = loanDuration; loans[msg.sender][userLoansCount[msg.sender]] = newLoan; userLoansCount[msg.sender]++; payable(msg.sender).transfer(ethAmountReal); emit NewLoanEther( msg.sender, newLoan.loanAmount, newLoan.collateralAmount, newLoan.paybackAmount, newLoan.loanDueDate, newLoan.duration ); } function payback(address _collateralToken, uint256 _id) public payable nonReentrant { LoanRequest storage loanReq = loans[msg.sender][_id]; require( loanReq.borrower == msg.sender, "payback: Only borrower can payback" ); require(!loanReq.isPayback, "payback: payback already"); require( block.timestamp <= loanReq.loanDueDate, "payback: exceed due date" ); require( msg.value >= loanReq.paybackAmount, "payback: Not enough ether" ); loanReq.isPayback = true; require( IERC20(_collateralToken).transfer( msg.sender, loanReq.collateralAmount ), "payback: Transfer collateral from contract to user failed" ); emit PayBack( msg.sender, loanReq.isPayback, block.timestamp, loanReq.paybackAmount, loanReq.collateralAmount ); } function getAllUserLoans(address _user) public view returns (LoanRequest[] memory) { LoanRequest[] memory requests = new LoanRequest[]( userLoansCount[_user] ); for (uint256 i = 0; i < userLoansCount[_user]; i++) { requests[i] = loans[_user][i]; } return requests; } function getUserOngoingLoans(address _user) public view returns (LoanRequest[] memory) { LoanRequest[] memory ongoing = new LoanRequest[](userLoansCount[_user]); for (uint256 i = 0; i < userLoansCount[_user]; i++) { LoanRequest memory req = loans[_user][i]; if (!req.isPayback && req.loanDueDate > block.timestamp) { ongoing[i] = req; } } return ongoing; } function getUserOverdueLoans(address _user) public view returns (LoanRequest[] memory) { LoanRequest[] memory overdue = new LoanRequest[](userLoansCount[_user]); for (uint256 i = 0; i < userLoansCount[_user]; i++) { LoanRequest memory req = loans[_user][i]; if (!req.isPayback && req.loanDueDate < block.timestamp) { overdue[i] = req; } } return overdue; } function getUserOverdueLoansFrom(address _user, uint256 _from) public view returns (LoanRequest[] memory) { LoanRequest[] memory overdue = new LoanRequest[](userLoansCount[_user]); for (uint256 i = 0; i < userLoansCount[_user]; i++) { LoanRequest memory req = loans[_user][i]; if ( !req.isPayback && req.loanDueDate < block.timestamp && _from < req.loanDueDate ) { overdue[i] = req; } } return overdue; } function countSwapAmount(address _token) public view returns (uint256) { uint256 tokenSwapAmount; for (uint256 k = 0; k < loanUsers.length; k++) { address user = loanUsers[k]; LoanRequest[] memory loanUser = getUserOverdueLoansFrom( user, lastSwapTs ); for (uint256 i = 0; i < loanUser.length; i++) { if (_token == loanUser[i].token) { tokenSwapAmount = tokenSwapAmount.add( loanUser[i].collateralAmount ); } } } return tokenSwapAmount; } function isSwappable() public view returns (bool) { uint256 totalSwapAmount = 0; bool isEnable; for (uint256 i = 0; i < collateralTokens.length; i++) { uint256 tokenAmount = countSwapAmount(collateralTokens[i]); totalSwapAmount = totalSwapAmount.add(tokenAmount); } if (totalSwapAmount > 0) { isEnable = true; } return isEnable; } function swapAssets() public onlyOperator { for (uint256 i = 0; i < collateralTokens.length; i++) { uint256 tokenAmount = countSwapAmount(collateralTokens[i]); if (tokenAmount > 0) { IERC20(collateralTokens[i]).approve( address(uniswapV2Router), tokenAmount ); address[] memory path = swapPaths[collateralTokens[i]]; uniswapV2Router .swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } } lastSwapTs = block.timestamp; } function transferOperator(address _opeator) public onlyOwner { require(_opeator != address(0), "operator: Zero Address"); operator = _opeator; } function withdrawEth(uint256 _amount) external onlyOwnerOrOperator { uint256 totalEth = address(this).balance; require( _amount < totalEth, "withdraw: Can't exceed more than totalLiquidity" ); address payable _owner = payable(owner()); _owner.transfer(_amount); } function recoverERC20(address _token) public onlyOperator { bool isColToken = isCollateralToken(_token); if (!isColToken) { uint256 balance = IERC20(_token).balanceOf(address(this)); IERC20(_token).transfer(msg.sender, balance); } } function getCollateralLen() public view returns (uint256) { return collateralTokens.length; } function getTotalLiquidity() public view returns (uint256) { return address(this).balance; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_nativeTokenAddress","type":"address"},{"internalType":"address","name":"_routerAddress","type":"address"},{"internalType":"uint256","name":"_nativeMin","type":"uint256"},{"internalType":"uint256","name":"_ethLimit","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"loanDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loanLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loanLimitNative","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"repayRate","type":"uint256"}],"name":"NewAddLoanPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"loanAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"NewLoanEther","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"bool","name":"paybackSuccess","type":"bool"},{"indexed":false,"internalType":"uint256","name":"paybackTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"returnCollateralAmount","type":"uint256"}],"name":"PayBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"address[]","name":"swapPath","type":"address[]"}],"name":"UpdatePairToken","type":"event"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_loanDuration","type":"uint256"},{"internalType":"uint256","name":"_loanLimit","type":"uint256"},{"internalType":"uint256","name":"_loanLimitNative","type":"uint256"},{"internalType":"uint256","name":"_repayRate","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"addLoanPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"checkMax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collateralTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_limit","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"countCollateralFromEther","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_limit","type":"uint256"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"countEtherFromCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"countSwapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getAllUserLoans","outputs":[{"components":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"}],"internalType":"struct Loan.LoanRequest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollateralLen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserOngoingLoans","outputs":[{"components":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"}],"internalType":"struct Loan.LoanRequest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserOverdueLoans","outputs":[{"components":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"}],"internalType":"struct Loan.LoanRequest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_from","type":"uint256"}],"name":"getUserOverdueLoansFrom","outputs":[{"components":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"}],"internalType":"struct Loan.LoanRequest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isCollateralToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isNativeTokenHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSwappable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSwapTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_loanPoolId","type":"uint256"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"loanEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"loanPoolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"loanPools","outputs":[{"internalType":"uint256","name":"loanDuration","type":"uint256"},{"internalType":"uint256","name":"loanLimit","type":"uint256"},{"internalType":"uint256","name":"loanLimitNative","type":"uint256"},{"internalType":"uint256","name":"repayRate","type":"uint256"},{"internalType":"bool","name":"closed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"loanUsers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"loans","outputs":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeTokenMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"payback","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_loanPoolId","type":"uint256"},{"internalType":"bool","name":"_closed","type":"bool"}],"name":"setLoanPoolClose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAssets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"swapPaths","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_opeator","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethLimit","type":"uint256"}],"name":"updateEthLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_loanDuration","type":"uint256"},{"internalType":"uint256","name":"_loanLimit","type":"uint256"},{"internalType":"uint256","name":"_loanLimitNative","type":"uint256"},{"internalType":"uint256","name":"_repayRate","type":"uint256"}],"name":"updateLoanPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"updateNativeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"updateSwapPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userLoansCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040523480156200001157600080fd5b5060405162003875380380620038758339810160408190526200003491620000d0565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060018055600255600355600480546001600160a01b039384166001600160a01b03199182161790915560058054909116331790551660805262000118565b80516001600160a01b0381168114620000cb57600080fd5b919050565b60008060008060808587031215620000e757600080fd5b620000f285620000b3565b93506200010260208601620000b3565b6040860151606090960151949790965092505050565b60805161372562000150600039600081816102a00152818161165801528181611782015281816128ec0152612bfb01526137256000f3fe60806040526004361061024a5760003560e01c8063769db61511610139578063acc45659116100b6578063e39f9f2a1161007a578063e39f9f2a146107b1578063e7177ece14610833578063ed921a1414610853578063f2fde38b14610873578063f7cf2bf114610893578063f8915391146108b357600080fd5b8063acc4565914610726578063b8118bbe1461073b578063c311d0491461075b578063db8bb3a11461077b578063e31323ac1461079b57600080fd5b806398c61c37116100fd57806398c61c37146105e05780639e8c708e146106b1578063a007945e146106d1578063a12af896146106e6578063a803180d1461070657600080fd5b8063769db615146105355780637eff539414610555578063888eb1ee146105755780638a918694146105955780638da5cb5b146105c257600080fd5b80633c884dff116101c7578063570ca7351161018b578063570ca735146104ab57806360ab8988146104cb57806367f7b06f146104eb5780636df9d3791461050b578063715018a61461052057600080fd5b80633c884dff146103f85780634766162c146104285780634c0a79fb146104485780634d0047ee1461047557806351e8b5c61461049557600080fd5b806329605e771161020e57806329605e771461036f5780632cd1d2501461038f5780632f759d91146103a557806335c7e925146103d257806335ed8ab8146103e557600080fd5b80631694505e1461028e578063172c48c7146102df5780631fffb698146102ff57806324350de314610321578063293308f11461034157600080fd5b3661028957604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b34801561029a57600080fd5b506102c27f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102eb57600080fd5b506102c26102fa366004612fa8565b6108d3565b34801561030b57600080fd5b5061031f61031a3660046130ba565b6108fd565b005b34801561032d57600080fd5b5061031f61033c36600461312d565b610b87565b34801561034d57600080fd5b5061036161035c366004613177565b610d2c565b6040519081526020016102d6565b34801561037b57600080fd5b5061031f61038a366004613177565b610e1d565b34801561039b57600080fd5b5061036160035481565b3480156103b157600080fd5b506103c56103c0366004613177565b610eb8565b6040516102d69190613192565b3480156103de57600080fd5b5047610361565b61031f6103f3366004613238565b61100e565b34801561040457600080fd5b50610418610413366004612fa8565b611343565b60405190151581526020016102d6565b34801561043457600080fd5b50610418610443366004613177565b611389565b34801561045457600080fd5b50610361610463366004613177565b60086020526000908152604090205481565b34801561048157600080fd5b506004546102c2906001600160a01b031681565b3480156104a157600080fd5b5061036160025481565b3480156104b757600080fd5b506005546102c2906001600160a01b031681565b3480156104d757600080fd5b5061031f6104e6366004613273565b6113ef565b3480156104f757600080fd5b5061031f610506366004613238565b61150b565b34801561051757600080fd5b5061031f6115b1565b34801561052c57600080fd5b5061031f611810565b34801561054157600080fd5b506103c5610550366004613177565b611884565b34801561056157600080fd5b5061031f6105703660046132b3565b6119ef565b34801561058157600080fd5b5061031f6105903660046132e6565b6120f5565b3480156105a157600080fd5b506103616105b0366004613177565b600c6020526000908152604090205481565b3480156105ce57600080fd5b506000546001600160a01b03166102c2565b3480156105ec57600080fd5b506106606105fb366004613238565b60096020908152600092835260408084209091529082529020805460018201546002830154600384015460048501546005860154600687015460078801546008909801546001600160a01b039788169897909616969495939492939192909160ff1689565b604080516001600160a01b039a8b1681529990981660208a0152968801959095526060870193909352608086019190915260a085015260c084015260e08301521515610100820152610120016102d6565b3480156106bd57600080fd5b5061031f6106cc366004613177565b6121d7565b3480156106dd57600080fd5b50600a54610361565b3480156106f257600080fd5b506103c5610701366004613177565b6122f9565b34801561071257600080fd5b506102c2610721366004612fa8565b612464565b34801561073257600080fd5b50610418612474565b34801561074757600080fd5b50610418610756366004613177565b6124cf565b34801561076757600080fd5b5061031f610776366004612fa8565b612561565b34801561078757600080fd5b506102c2610796366004613238565b61266c565b3480156107a757600080fd5b5061036160065481565b3480156107bd57600080fd5b506108096107cc366004613238565b600d602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919060ff1685565b6040805195865260208601949094529284019190915260608301521515608082015260a0016102d6565b34801561083f57600080fd5b506103c561084e366004613238565b6126a4565b34801561085f57600080fd5b5061036161086e3660046132b3565b61281e565b34801561087f57600080fd5b5061031f61088e366004613177565b6129af565b34801561089f57600080fd5b5061031f6108ae366004612fa8565b612a99565b3480156108bf57600080fd5b506103616108ce3660046132b3565b612b2d565b600a81815481106108e357600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146109305760405162461bcd60e51b815260040161092790613334565b60405180910390fd5b6001600160a01b0386166109565760405162461bcd60e51b815260040161092790613369565b606484106109765760405162461bcd60e51b8152600401610927906133a0565b606483106109965760405162461bcd60e51b8152600401610927906133a0565b60648210156109e15760405162461bcd60e51b81526020600482015260176024820152766164643a2073686f6c64206265206f766572203130302560481b6044820152606401610927565b60006109ec87611389565b905080610a5d57600a8054600181019091557fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b03891690811790915560009081526007602090815260409091208351610a5b92850190612ece565b505b610a916040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b86815260208082018781526040808401888152606085018881526000608087018181526001600160a01b038f16808352600c8089528684208054600d8b528886208187528b529785208b518155985160018a0155955160028901559351600388015590516004909601805460ff191696151596909617909555938452909352825490929091610b1f836133ed565b9091555050604080516001600160a01b038b168152602081018a905290810188905260608101879052608081018690527f4cb98f3b8ae6aaa3e3a10d19c96b00eac0ed7b5b7415a40edf7583c26c24914b9060a00160405180910390a1505050505050505050565b6000546001600160a01b03163314610bb15760405162461bcd60e51b815260040161092790613334565b6001600160a01b038616610bd75760405162461bcd60e51b815260040161092790613369565b6000610be287611389565b905080610c015760405162461bcd60e51b815260040161092790613406565b6001600160a01b0387166000908152600c6020526040902054808710610c625760405162461bcd60e51b81526020600482015260166024820152750eae0c8c2e8ca74409cde40ecc2d8d2c840d2dcc8caf60531b6044820152606401610927565b60648510610c825760405162461bcd60e51b8152600401610927906133a0565b60648410610ca25760405162461bcd60e51b8152600401610927906133a0565b6064831015610ced5760405162461bcd60e51b81526020600482015260176024820152766164643a2073686f6c64206265206f766572203130302560481b6044820152606401610927565b50506001600160a01b03959095166000908152600d60209081526040808320968352959052939093209182556001820155600281019190915560030155565b60008060005b600b54811015610e16576000600b8281548110610d5157610d5161343d565b60009182526020822001546006546001600160a01b039091169250610d779083906126a4565b905060005b8151811015610e0057818181518110610d9757610d9761343d565b6020026020010151602001516001600160a01b0316876001600160a01b031603610dee57610deb828281518110610dd057610dd061343d565b60200260200101516060015186612cb990919063ffffffff16565b94505b80610df8816133ed565b915050610d7c565b5050508080610e0e906133ed565b915050610d32565b5092915050565b6000546001600160a01b03163314610e475760405162461bcd60e51b815260040161092790613334565b6001600160a01b038116610e965760405162461bcd60e51b81526020600482015260166024820152756f70657261746f723a205a65726f204164647265737360501b6044820152606401610927565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600860205260408120546060919067ffffffffffffffff811115610eed57610eed612fdd565b604051908082528060200260200182016040528015610f2657816020015b610f13612f33565b815260200190600190039081610f0b5790505b50905060005b6001600160a01b038416600090815260086020526040902054811015610e16576001600160a01b0380851660009081526009602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615156101008201528251839083908110610ff057610ff061343d565b60200260200101819052508080611006906133ed565b915050610f2c565b6002600154036110605760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610927565b60026001553360008181526009602090815260408083208584529091529020805490916001600160a01b03909116146110e65760405162461bcd60e51b815260206004820152602260248201527f7061796261636b3a204f6e6c7920626f72726f7765722063616e207061796261604482015261636b60f01b6064820152608401610927565b600881015460ff161561113b5760405162461bcd60e51b815260206004820152601860248201527f7061796261636b3a207061796261636b20616c726561647900000000000000006044820152606401610927565b806005015442111561118f5760405162461bcd60e51b815260206004820152601860248201527f7061796261636b3a2065786365656420647565206461746500000000000000006044820152606401610927565b80600401543410156111e35760405162461bcd60e51b815260206004820152601960248201527f7061796261636b3a204e6f7420656e6f756768206574686572000000000000006044820152606401610927565b60088101805460ff19166001179055600381015460405163a9059cbb60e01b815233600482015260248101919091526001600160a01b0384169063a9059cbb906044016020604051808303816000875af1158015611245573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112699190613453565b6112db5760405162461bcd60e51b815260206004820152603960248201527f7061796261636b3a205472616e7366657220636f6c6c61746572616c2066726f60448201527f6d20636f6e747261637420746f2075736572206661696c6564000000000000006064820152608401610927565b6008810154600482015460038301546040805133815260ff90941615156020850152428482015260608401929092526080830152517ff022a4d91d174959862c530aa30a63411b4f0e37186283bd5fc0000acc217a859181900360a00190a150506001805550565b600080479050600061136b606461136560025485612d1f90919063ffffffff16565b90612da1565b90508084111561137f575060009392505050565b5060019392505050565b600a5460009081805b828110156113e757600a81815481106113ad576113ad61343d565b6000918252602090912001546001600160a01b03908116908616036113d557600191506113e7565b806113df816133ed565b915050611392565b509392505050565b6000546001600160a01b031633146114195760405162461bcd60e51b815260040161092790613334565b6001600160a01b03831661143f5760405162461bcd60e51b815260040161092790613369565b600061144a84611389565b9050806114695760405162461bcd60e51b815260040161092790613406565b6001600160a01b0384166000908152600c60205260409020548084106114d15760405162461bcd60e51b815260206004820152601a60248201527f7365743a204e6f2076616c6964206c6f616e20706f6f6c2069640000000000006044820152606401610927565b50506001600160a01b03929092166000908152600d6020908152604080832093835292905220600401805460ff1916911515919091179055565b6000546001600160a01b031633146115355760405162461bcd60e51b815260040161092790613334565b6001600160a01b03821661158b5760405162461bcd60e51b815260206004820152601a60248201527f6e61746976653a207a65726f20746f6b656e20616464726573730000000000006044820152606401610927565b600480546001600160a01b0319166001600160a01b039390931692909217909155600355565b6005546001600160a01b031633146115db5760405162461bcd60e51b815260040161092790613470565b60005b600a5481101561180957600061161a600a83815481106116005761160061343d565b6000918252602090912001546001600160a01b0316610d2c565b905080156117f657600a82815481106116355761163561343d565b60009182526020909120015460405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af11580156116b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d59190613453565b50600060076000600a85815481106116ef576116ef61343d565b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208054825181850281018501909352808352919290919083018282801561176557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611747575b505060405163791ac94760e01b8152939450506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263791ac94792506117c2915085906000908690309042906004016134f8565b600060405180830381600087803b1580156117dc57600080fd5b505af11580156117f0573d6000803e3d6000fd5b50505050505b5080611801816133ed565b9150506115de565b5042600655565b6000546001600160a01b0316331461183a5760405162461bcd60e51b815260040161092790613334565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6001600160a01b0381166000908152600860205260408120546060919067ffffffffffffffff8111156118b9576118b9612fdd565b6040519080825280602002602001820160405280156118f257816020015b6118df612f33565b8152602001906001900390816118d75790505b50905060005b6001600160a01b038416600090815260086020526040902054811015610e16576001600160a01b0380851660009081526009602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615801561010083018190526119b85750428160a00151115b156119dc57808383815181106119d0576119d061343d565b60200260200101819052505b50806119e7816133ed565b9150506118f8565b600260015403611a415760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610927565b60026001556001600160a01b0383166000908152600d6020908152604080832085845290915290206004015460ff1615611abd5760405162461bcd60e51b815260206004820152601e60248201527f6c6f616e45746865723a204c6f616e20506f6f6c20697320636c6f73656400006044820152606401610927565b6001600160a01b0383166000908152600c6020526040902054819084908490818111611b2b5760405162461bcd60e51b815260206004820152601b60248201527f6c6f616e45746865723a206e6f2076616c6964206c6f616e20496400000000006044820152606401610927565b6040516370a0823160e01b81523360048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611b72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b969190613534565b9050848111611bf35760405162461bcd60e51b815260206004820152602360248201527f6c6f616e45746865723a206e6f7420656e6f75676820746f6b656e2062616c616044820152626e636560e81b6064820152608401610927565b6000611bfe336124cf565b905060008115611c34576001600160a01b0386166000908152600d60209081526040808320888452909152902060020154611c5c565b6001600160a01b0386166000908152600d602090815260408083208884529091529020600101545b6040516370a0823160e01b81523060048201529091506000906001600160a01b038816906370a0823190602401602060405180830381865afa158015611ca6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cca9190613534565b9050611cd733888a612de3565b611d425760405162461bcd60e51b815260206004820152603660248201527f6c6f616e45746865723a205472616e7366657220746f6b656e2066726f6d20756044820152751cd95c881d1bc818dbdb9d1c9858dd0819985a5b195960521b6064820152608401610927565b6040516370a0823160e01b81523060048201526000906001600160a01b038916906370a0823190602401602060405180830381865afa158015611d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dad9190613534565b90506000611dbb838361354d565b90506000611dca8a8684612b2d565b90506000805b600b54811015611e2c57336001600160a01b0316600b8281548110611df757611df761343d565b6000918252602090912001546001600160a01b031603611e1a5760019150611e2c565b80611e24816133ed565b915050611dd0565b50801515600003611e7a57600b80546001810182556000919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916331790555b611e8382611343565b611eee5760405162461bcd60e51b815260206004820152603660248201527f6c6f616e45746865723a206e6f7420656e6f756768206c6971756964697479206044820152751bdc881bdd995c881b585e0811551208185b5bdd5b9d60521b6064820152608401610927565b611ef6612f33565b338082526040808301859052606083018690526000918252600860209081528183205460e085015261010084018390526001600160a01b038f168185018190528352600d81528183208e84529052902060038101549054611f5c60646113658785612d1f565b6080840152611f6b8142613560565b60a0840190815260c084018281523360008181526009602090815260408083206008808452828520805486529184528285208b5181546001600160a01b039182166001600160a01b0319918216178355868e0151600184018054919093169116179055928b0151600284015560608b0151600384015560808b01516004840155965160058301559451600682015560e08901516007820155610100890151908601805491151560ff1990921691909117905591815292905280549161202f836133ed565b9091555050604051339086156108fc029087906000818181858888f19350505050158015612061573d6000803e3d6000fd5b50336001600160a01b03167f6ec47479b666ea2a5d4da977be8256c787c5724698308bd3c981e7dcd2285fa48460400151856060015186608001518760a001518860c001516040516120d5959493929190948552602085019390935260408401919091526060830152608082015260a00190565b60405180910390a250506001805550505050505050505050505050505050565b6000546001600160a01b0316331461211f5760405162461bcd60e51b815260040161092790613334565b6001600160a01b0382166121455760405162461bcd60e51b815260040161092790613369565b600061215083611389565b90508061216f5760405162461bcd60e51b815260040161092790613406565b6001600160a01b0383166000908152600760209081526040909120835161219892850190612ece565b507f078e8a4737553c8d944056c4087a42039847a7c1ed868d8c0e5d82a224f94f5883836040516121ca929190613573565b60405180910390a1505050565b6005546001600160a01b031633146122015760405162461bcd60e51b815260040161092790613470565b600061220c82611389565b9050806122f5576040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561225a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227e9190613534565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0384169063a9059cbb906044016020604051808303816000875af11580156122ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f29190613453565b50505b5050565b6001600160a01b0381166000908152600860205260408120546060919067ffffffffffffffff81111561232e5761232e612fdd565b60405190808252806020026020018201604052801561236757816020015b612354612f33565b81526020019060019003908161234c5790505b50905060005b6001600160a01b038416600090815260086020526040902054811015610e16576001600160a01b0380851660009081526009602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff16158015610100830181905261242d5750428160a00151105b1561245157808383815181106124455761244561343d565b60200260200101819052505b508061245c816133ed565b91505061236d565b600b81815481106108e357600080fd5b60008080805b600a548110156124be57600061249c600a83815481106116005761160061343d565b90506124a88482612cb9565b93505080806124b6906133ed565b91505061247a565b5081156124c9575060015b92915050565b600480546040516370a0823160e01b81526001600160a01b0384811693820193909352600092839216906370a0823190602401602060405180830381865afa15801561251f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125439190613534565b90506003548111156125585750600192915050565b50600092915050565b6000546001600160a01b031633148061258457506005546001600160a01b031633145b6125c85760405162461bcd60e51b81526020600482015260156024820152742737ba1037bbb732b91037b91037b832b930ba37b960591b6044820152606401610927565b478082106126305760405162461bcd60e51b815260206004820152602f60248201527f77697468647261773a2043616e277420657863656564206d6f7265207468616e60448201526e20746f74616c4c697175696469747960881b6064820152608401610927565b600080546040516001600160a01b039091169182916108fc86150291869190818181858888f193505050501580156122f2573d6000803e3d6000fd5b6007602052816000526040600020818154811061268857600080fd5b6000918252602090912001546001600160a01b03169150829050565b6001600160a01b0382166000908152600860205260408120546060919067ffffffffffffffff8111156126d9576126d9612fdd565b60405190808252806020026020018201604052801561271257816020015b6126ff612f33565b8152602001906001900390816126f75790505b50905060005b6001600160a01b0385166000908152600860205260409020548110156113e7576001600160a01b0380861660009081526009602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615801561010083018190526127d85750428160a00151105b80156127e757508060a0015185105b1561280b57808383815181106127ff576127ff61343d565b60200260200101819052505b5080612816816133ed565b915050612718565b6001600160a01b03831660009081526007602090815260408083208054825181850281018501909352808352849383018282801561288557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612867575b505050505090506000815167ffffffffffffffff8111156128a8576128a8612fdd565b6040519080825280602002602001820160405280156128d1578160200160208202803683370190505b506040516307c0329d60e21b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631f00ca74906129239087908690600401613597565b600060405180830381865afa158015612940573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261296891908101906135b0565b905060006129a4606461299e88856000815181106129885761298861343d565b6020026020010151612da190919063ffffffff16565b90612d1f565b979650505050505050565b6000546001600160a01b031633146129d95760405162461bcd60e51b815260040161092790613334565b6001600160a01b038116612a3e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610927565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314612ac35760405162461bcd60e51b815260040161092790613334565b606460025410612b285760405162461bcd60e51b815260206004820152602a60248201527f7570646174653a20457468206c696d69742073686f756c64206265206c657373604482015269207468616e203130302560b01b6064820152608401610927565b600255565b6001600160a01b038316600090815260076020908152604080832080548251818502810185019093528083528493830182828015612b9457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612b76575b505050505090506000815167ffffffffffffffff811115612bb757612bb7612fdd565b604051908082528060200260200182016040528015612be0578160200160208202803683370190505b5060405163d06ca61f60e01b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d06ca61f90612c329087908690600401613597565b600060405180830381865afa158015612c4f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c7791908101906135b0565b905060006129a46064611365888560018851612c93919061354d565b81518110612ca357612ca361343d565b6020026020010151612d1f90919063ffffffff16565b600080612cc68385613560565b905083811015612d185760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610927565b9392505050565b600082600003612d31575060006124c9565b6000612d3d8385613636565b905082612d4a8583613663565b14612d185760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610927565b6000612d1883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e6a565b6040516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820183905260009182918516906323b872dd906064016020604051808303816000875af1158015612e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e619190613453565b95945050505050565b60008183612e8b5760405162461bcd60e51b81526004016109279190613677565b506000612e988486613663565b9050612ea484866136c5565b612eae8286613636565b612eb89190613560565b8514612ec657612ec66136d9565b949350505050565b828054828255906000526020600020908101928215612f23579160200282015b82811115612f2357825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612eee565b50612f2f929150612f93565b5090565b60405180610120016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b5b80821115612f2f5760008155600101612f94565b600060208284031215612fba57600080fd5b5035919050565b80356001600160a01b0381168114612fd857600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561301c5761301c612fdd565b604052919050565b600067ffffffffffffffff82111561303e5761303e612fdd565b5060051b60200190565b600082601f83011261305957600080fd5b8135602061306e61306983613024565b612ff3565b82815260059290921b8401810191818101908684111561308d57600080fd5b8286015b848110156130af576130a281612fc1565b8352918301918301613091565b509695505050505050565b60008060008060008060c087890312156130d357600080fd5b6130dc87612fc1565b95506020870135945060408701359350606087013592506080870135915060a087013567ffffffffffffffff81111561311457600080fd5b61312089828a01613048565b9150509295509295509295565b60008060008060008060c0878903121561314657600080fd5b61314f87612fc1565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b60006020828403121561318957600080fd5b612d1882612fc1565b602080825282518282018190526000919060409081850190868401855b8281101561322b57815180516001600160a01b0390811686528782015116878601528581015186860152606080820151908601526080808201519086015260a0808201519086015260c0808201519086015260e080820151908601526101009081015115159085015261012090930192908501906001016131af565b5091979650505050505050565b6000806040838503121561324b57600080fd5b61325483612fc1565b946020939093013593505050565b801515811461327057600080fd5b50565b60008060006060848603121561328857600080fd5b61329184612fc1565b92506020840135915060408401356132a881613262565b809150509250925092565b6000806000606084860312156132c857600080fd5b6132d184612fc1565b95602085013595506040909401359392505050565b600080604083850312156132f957600080fd5b61330283612fc1565b9150602083013567ffffffffffffffff81111561331e57600080fd5b61332a85828601613048565b9150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f7570646174653a205a65726f20636f6c6c61746572616c206164647265737300604082015260600190565b6020808252601a908201527f6164643a2043616e2774206f7665722031303025206c696d6974000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600182016133ff576133ff6133d7565b5060010190565b6020808252601b908201527f7570646174653a204e6f20636f6c6c61746572616c20746f6b656e0000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561346557600080fd5b8151612d1881613262565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b600081518084526020808501945080840160005b838110156134ed5781516001600160a01b0316875295820195908201906001016134c8565b509495945050505050565b85815284602082015260a06040820152600061351760a08301866134b4565b6001600160a01b0394909416606083015250608001529392505050565b60006020828403121561354657600080fd5b5051919050565b818103818111156124c9576124c96133d7565b808201808211156124c9576124c96133d7565b6001600160a01b0383168152604060208201819052600090612ec6908301846134b4565b828152604060208201526000612ec660408301846134b4565b600060208083850312156135c357600080fd5b825167ffffffffffffffff8111156135da57600080fd5b8301601f810185136135eb57600080fd5b80516135f961306982613024565b81815260059190911b8201830190838101908783111561361857600080fd5b928401925b828410156129a45783518252928401929084019061361d565b80820281158282048414176124c9576124c96133d7565b634e487b7160e01b600052601260045260246000fd5b6000826136725761367261364d565b500490565b600060208083528351808285015260005b818110156136a457858101830151858201604001528201613688565b506000604082860101526040601f19601f8301168501019250505092915050565b6000826136d4576136d461364d565b500690565b634e487b7160e01b600052600160045260246000fdfea2646970667358221220554cf459aee1228d6887377c3e44bc317114aaec6e8f569b75a0dea4e712ea6f64736f6c634300081100330000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000000000000000000000000000000024f2beb1aa000000000000000000000000000000000000000000000000000000000000000000a
Deployed Bytecode
0x60806040526004361061024a5760003560e01c8063769db61511610139578063acc45659116100b6578063e39f9f2a1161007a578063e39f9f2a146107b1578063e7177ece14610833578063ed921a1414610853578063f2fde38b14610873578063f7cf2bf114610893578063f8915391146108b357600080fd5b8063acc4565914610726578063b8118bbe1461073b578063c311d0491461075b578063db8bb3a11461077b578063e31323ac1461079b57600080fd5b806398c61c37116100fd57806398c61c37146105e05780639e8c708e146106b1578063a007945e146106d1578063a12af896146106e6578063a803180d1461070657600080fd5b8063769db615146105355780637eff539414610555578063888eb1ee146105755780638a918694146105955780638da5cb5b146105c257600080fd5b80633c884dff116101c7578063570ca7351161018b578063570ca735146104ab57806360ab8988146104cb57806367f7b06f146104eb5780636df9d3791461050b578063715018a61461052057600080fd5b80633c884dff146103f85780634766162c146104285780634c0a79fb146104485780634d0047ee1461047557806351e8b5c61461049557600080fd5b806329605e771161020e57806329605e771461036f5780632cd1d2501461038f5780632f759d91146103a557806335c7e925146103d257806335ed8ab8146103e557600080fd5b80631694505e1461028e578063172c48c7146102df5780631fffb698146102ff57806324350de314610321578063293308f11461034157600080fd5b3661028957604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b34801561029a57600080fd5b506102c27f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102eb57600080fd5b506102c26102fa366004612fa8565b6108d3565b34801561030b57600080fd5b5061031f61031a3660046130ba565b6108fd565b005b34801561032d57600080fd5b5061031f61033c36600461312d565b610b87565b34801561034d57600080fd5b5061036161035c366004613177565b610d2c565b6040519081526020016102d6565b34801561037b57600080fd5b5061031f61038a366004613177565b610e1d565b34801561039b57600080fd5b5061036160035481565b3480156103b157600080fd5b506103c56103c0366004613177565b610eb8565b6040516102d69190613192565b3480156103de57600080fd5b5047610361565b61031f6103f3366004613238565b61100e565b34801561040457600080fd5b50610418610413366004612fa8565b611343565b60405190151581526020016102d6565b34801561043457600080fd5b50610418610443366004613177565b611389565b34801561045457600080fd5b50610361610463366004613177565b60086020526000908152604090205481565b34801561048157600080fd5b506004546102c2906001600160a01b031681565b3480156104a157600080fd5b5061036160025481565b3480156104b757600080fd5b506005546102c2906001600160a01b031681565b3480156104d757600080fd5b5061031f6104e6366004613273565b6113ef565b3480156104f757600080fd5b5061031f610506366004613238565b61150b565b34801561051757600080fd5b5061031f6115b1565b34801561052c57600080fd5b5061031f611810565b34801561054157600080fd5b506103c5610550366004613177565b611884565b34801561056157600080fd5b5061031f6105703660046132b3565b6119ef565b34801561058157600080fd5b5061031f6105903660046132e6565b6120f5565b3480156105a157600080fd5b506103616105b0366004613177565b600c6020526000908152604090205481565b3480156105ce57600080fd5b506000546001600160a01b03166102c2565b3480156105ec57600080fd5b506106606105fb366004613238565b60096020908152600092835260408084209091529082529020805460018201546002830154600384015460048501546005860154600687015460078801546008909801546001600160a01b039788169897909616969495939492939192909160ff1689565b604080516001600160a01b039a8b1681529990981660208a0152968801959095526060870193909352608086019190915260a085015260c084015260e08301521515610100820152610120016102d6565b3480156106bd57600080fd5b5061031f6106cc366004613177565b6121d7565b3480156106dd57600080fd5b50600a54610361565b3480156106f257600080fd5b506103c5610701366004613177565b6122f9565b34801561071257600080fd5b506102c2610721366004612fa8565b612464565b34801561073257600080fd5b50610418612474565b34801561074757600080fd5b50610418610756366004613177565b6124cf565b34801561076757600080fd5b5061031f610776366004612fa8565b612561565b34801561078757600080fd5b506102c2610796366004613238565b61266c565b3480156107a757600080fd5b5061036160065481565b3480156107bd57600080fd5b506108096107cc366004613238565b600d602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919060ff1685565b6040805195865260208601949094529284019190915260608301521515608082015260a0016102d6565b34801561083f57600080fd5b506103c561084e366004613238565b6126a4565b34801561085f57600080fd5b5061036161086e3660046132b3565b61281e565b34801561087f57600080fd5b5061031f61088e366004613177565b6129af565b34801561089f57600080fd5b5061031f6108ae366004612fa8565b612a99565b3480156108bf57600080fd5b506103616108ce3660046132b3565b612b2d565b600a81815481106108e357600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146109305760405162461bcd60e51b815260040161092790613334565b60405180910390fd5b6001600160a01b0386166109565760405162461bcd60e51b815260040161092790613369565b606484106109765760405162461bcd60e51b8152600401610927906133a0565b606483106109965760405162461bcd60e51b8152600401610927906133a0565b60648210156109e15760405162461bcd60e51b81526020600482015260176024820152766164643a2073686f6c64206265206f766572203130302560481b6044820152606401610927565b60006109ec87611389565b905080610a5d57600a8054600181019091557fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b03891690811790915560009081526007602090815260409091208351610a5b92850190612ece565b505b610a916040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b86815260208082018781526040808401888152606085018881526000608087018181526001600160a01b038f16808352600c8089528684208054600d8b528886208187528b529785208b518155985160018a0155955160028901559351600388015590516004909601805460ff191696151596909617909555938452909352825490929091610b1f836133ed565b9091555050604080516001600160a01b038b168152602081018a905290810188905260608101879052608081018690527f4cb98f3b8ae6aaa3e3a10d19c96b00eac0ed7b5b7415a40edf7583c26c24914b9060a00160405180910390a1505050505050505050565b6000546001600160a01b03163314610bb15760405162461bcd60e51b815260040161092790613334565b6001600160a01b038616610bd75760405162461bcd60e51b815260040161092790613369565b6000610be287611389565b905080610c015760405162461bcd60e51b815260040161092790613406565b6001600160a01b0387166000908152600c6020526040902054808710610c625760405162461bcd60e51b81526020600482015260166024820152750eae0c8c2e8ca74409cde40ecc2d8d2c840d2dcc8caf60531b6044820152606401610927565b60648510610c825760405162461bcd60e51b8152600401610927906133a0565b60648410610ca25760405162461bcd60e51b8152600401610927906133a0565b6064831015610ced5760405162461bcd60e51b81526020600482015260176024820152766164643a2073686f6c64206265206f766572203130302560481b6044820152606401610927565b50506001600160a01b03959095166000908152600d60209081526040808320968352959052939093209182556001820155600281019190915560030155565b60008060005b600b54811015610e16576000600b8281548110610d5157610d5161343d565b60009182526020822001546006546001600160a01b039091169250610d779083906126a4565b905060005b8151811015610e0057818181518110610d9757610d9761343d565b6020026020010151602001516001600160a01b0316876001600160a01b031603610dee57610deb828281518110610dd057610dd061343d565b60200260200101516060015186612cb990919063ffffffff16565b94505b80610df8816133ed565b915050610d7c565b5050508080610e0e906133ed565b915050610d32565b5092915050565b6000546001600160a01b03163314610e475760405162461bcd60e51b815260040161092790613334565b6001600160a01b038116610e965760405162461bcd60e51b81526020600482015260166024820152756f70657261746f723a205a65726f204164647265737360501b6044820152606401610927565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600860205260408120546060919067ffffffffffffffff811115610eed57610eed612fdd565b604051908082528060200260200182016040528015610f2657816020015b610f13612f33565b815260200190600190039081610f0b5790505b50905060005b6001600160a01b038416600090815260086020526040902054811015610e16576001600160a01b0380851660009081526009602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615156101008201528251839083908110610ff057610ff061343d565b60200260200101819052508080611006906133ed565b915050610f2c565b6002600154036110605760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610927565b60026001553360008181526009602090815260408083208584529091529020805490916001600160a01b03909116146110e65760405162461bcd60e51b815260206004820152602260248201527f7061796261636b3a204f6e6c7920626f72726f7765722063616e207061796261604482015261636b60f01b6064820152608401610927565b600881015460ff161561113b5760405162461bcd60e51b815260206004820152601860248201527f7061796261636b3a207061796261636b20616c726561647900000000000000006044820152606401610927565b806005015442111561118f5760405162461bcd60e51b815260206004820152601860248201527f7061796261636b3a2065786365656420647565206461746500000000000000006044820152606401610927565b80600401543410156111e35760405162461bcd60e51b815260206004820152601960248201527f7061796261636b3a204e6f7420656e6f756768206574686572000000000000006044820152606401610927565b60088101805460ff19166001179055600381015460405163a9059cbb60e01b815233600482015260248101919091526001600160a01b0384169063a9059cbb906044016020604051808303816000875af1158015611245573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112699190613453565b6112db5760405162461bcd60e51b815260206004820152603960248201527f7061796261636b3a205472616e7366657220636f6c6c61746572616c2066726f60448201527f6d20636f6e747261637420746f2075736572206661696c6564000000000000006064820152608401610927565b6008810154600482015460038301546040805133815260ff90941615156020850152428482015260608401929092526080830152517ff022a4d91d174959862c530aa30a63411b4f0e37186283bd5fc0000acc217a859181900360a00190a150506001805550565b600080479050600061136b606461136560025485612d1f90919063ffffffff16565b90612da1565b90508084111561137f575060009392505050565b5060019392505050565b600a5460009081805b828110156113e757600a81815481106113ad576113ad61343d565b6000918252602090912001546001600160a01b03908116908616036113d557600191506113e7565b806113df816133ed565b915050611392565b509392505050565b6000546001600160a01b031633146114195760405162461bcd60e51b815260040161092790613334565b6001600160a01b03831661143f5760405162461bcd60e51b815260040161092790613369565b600061144a84611389565b9050806114695760405162461bcd60e51b815260040161092790613406565b6001600160a01b0384166000908152600c60205260409020548084106114d15760405162461bcd60e51b815260206004820152601a60248201527f7365743a204e6f2076616c6964206c6f616e20706f6f6c2069640000000000006044820152606401610927565b50506001600160a01b03929092166000908152600d6020908152604080832093835292905220600401805460ff1916911515919091179055565b6000546001600160a01b031633146115355760405162461bcd60e51b815260040161092790613334565b6001600160a01b03821661158b5760405162461bcd60e51b815260206004820152601a60248201527f6e61746976653a207a65726f20746f6b656e20616464726573730000000000006044820152606401610927565b600480546001600160a01b0319166001600160a01b039390931692909217909155600355565b6005546001600160a01b031633146115db5760405162461bcd60e51b815260040161092790613470565b60005b600a5481101561180957600061161a600a83815481106116005761160061343d565b6000918252602090912001546001600160a01b0316610d2c565b905080156117f657600a82815481106116355761163561343d565b60009182526020909120015460405163095ea7b360e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af11580156116b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d59190613453565b50600060076000600a85815481106116ef576116ef61343d565b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208054825181850281018501909352808352919290919083018282801561176557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611747575b505060405163791ac94760e01b8152939450506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169263791ac94792506117c2915085906000908690309042906004016134f8565b600060405180830381600087803b1580156117dc57600080fd5b505af11580156117f0573d6000803e3d6000fd5b50505050505b5080611801816133ed565b9150506115de565b5042600655565b6000546001600160a01b0316331461183a5760405162461bcd60e51b815260040161092790613334565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6001600160a01b0381166000908152600860205260408120546060919067ffffffffffffffff8111156118b9576118b9612fdd565b6040519080825280602002602001820160405280156118f257816020015b6118df612f33565b8152602001906001900390816118d75790505b50905060005b6001600160a01b038416600090815260086020526040902054811015610e16576001600160a01b0380851660009081526009602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615801561010083018190526119b85750428160a00151115b156119dc57808383815181106119d0576119d061343d565b60200260200101819052505b50806119e7816133ed565b9150506118f8565b600260015403611a415760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610927565b60026001556001600160a01b0383166000908152600d6020908152604080832085845290915290206004015460ff1615611abd5760405162461bcd60e51b815260206004820152601e60248201527f6c6f616e45746865723a204c6f616e20506f6f6c20697320636c6f73656400006044820152606401610927565b6001600160a01b0383166000908152600c6020526040902054819084908490818111611b2b5760405162461bcd60e51b815260206004820152601b60248201527f6c6f616e45746865723a206e6f2076616c6964206c6f616e20496400000000006044820152606401610927565b6040516370a0823160e01b81523360048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611b72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b969190613534565b9050848111611bf35760405162461bcd60e51b815260206004820152602360248201527f6c6f616e45746865723a206e6f7420656e6f75676820746f6b656e2062616c616044820152626e636560e81b6064820152608401610927565b6000611bfe336124cf565b905060008115611c34576001600160a01b0386166000908152600d60209081526040808320888452909152902060020154611c5c565b6001600160a01b0386166000908152600d602090815260408083208884529091529020600101545b6040516370a0823160e01b81523060048201529091506000906001600160a01b038816906370a0823190602401602060405180830381865afa158015611ca6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cca9190613534565b9050611cd733888a612de3565b611d425760405162461bcd60e51b815260206004820152603660248201527f6c6f616e45746865723a205472616e7366657220746f6b656e2066726f6d20756044820152751cd95c881d1bc818dbdb9d1c9858dd0819985a5b195960521b6064820152608401610927565b6040516370a0823160e01b81523060048201526000906001600160a01b038916906370a0823190602401602060405180830381865afa158015611d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dad9190613534565b90506000611dbb838361354d565b90506000611dca8a8684612b2d565b90506000805b600b54811015611e2c57336001600160a01b0316600b8281548110611df757611df761343d565b6000918252602090912001546001600160a01b031603611e1a5760019150611e2c565b80611e24816133ed565b915050611dd0565b50801515600003611e7a57600b80546001810182556000919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916331790555b611e8382611343565b611eee5760405162461bcd60e51b815260206004820152603660248201527f6c6f616e45746865723a206e6f7420656e6f756768206c6971756964697479206044820152751bdc881bdd995c881b585e0811551208185b5bdd5b9d60521b6064820152608401610927565b611ef6612f33565b338082526040808301859052606083018690526000918252600860209081528183205460e085015261010084018390526001600160a01b038f168185018190528352600d81528183208e84529052902060038101549054611f5c60646113658785612d1f565b6080840152611f6b8142613560565b60a0840190815260c084018281523360008181526009602090815260408083206008808452828520805486529184528285208b5181546001600160a01b039182166001600160a01b0319918216178355868e0151600184018054919093169116179055928b0151600284015560608b0151600384015560808b01516004840155965160058301559451600682015560e08901516007820155610100890151908601805491151560ff1990921691909117905591815292905280549161202f836133ed565b9091555050604051339086156108fc029087906000818181858888f19350505050158015612061573d6000803e3d6000fd5b50336001600160a01b03167f6ec47479b666ea2a5d4da977be8256c787c5724698308bd3c981e7dcd2285fa48460400151856060015186608001518760a001518860c001516040516120d5959493929190948552602085019390935260408401919091526060830152608082015260a00190565b60405180910390a250506001805550505050505050505050505050505050565b6000546001600160a01b0316331461211f5760405162461bcd60e51b815260040161092790613334565b6001600160a01b0382166121455760405162461bcd60e51b815260040161092790613369565b600061215083611389565b90508061216f5760405162461bcd60e51b815260040161092790613406565b6001600160a01b0383166000908152600760209081526040909120835161219892850190612ece565b507f078e8a4737553c8d944056c4087a42039847a7c1ed868d8c0e5d82a224f94f5883836040516121ca929190613573565b60405180910390a1505050565b6005546001600160a01b031633146122015760405162461bcd60e51b815260040161092790613470565b600061220c82611389565b9050806122f5576040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561225a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227e9190613534565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0384169063a9059cbb906044016020604051808303816000875af11580156122ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f29190613453565b50505b5050565b6001600160a01b0381166000908152600860205260408120546060919067ffffffffffffffff81111561232e5761232e612fdd565b60405190808252806020026020018201604052801561236757816020015b612354612f33565b81526020019060019003908161234c5790505b50905060005b6001600160a01b038416600090815260086020526040902054811015610e16576001600160a01b0380851660009081526009602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff16158015610100830181905261242d5750428160a00151105b1561245157808383815181106124455761244561343d565b60200260200101819052505b508061245c816133ed565b91505061236d565b600b81815481106108e357600080fd5b60008080805b600a548110156124be57600061249c600a83815481106116005761160061343d565b90506124a88482612cb9565b93505080806124b6906133ed565b91505061247a565b5081156124c9575060015b92915050565b600480546040516370a0823160e01b81526001600160a01b0384811693820193909352600092839216906370a0823190602401602060405180830381865afa15801561251f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125439190613534565b90506003548111156125585750600192915050565b50600092915050565b6000546001600160a01b031633148061258457506005546001600160a01b031633145b6125c85760405162461bcd60e51b81526020600482015260156024820152742737ba1037bbb732b91037b91037b832b930ba37b960591b6044820152606401610927565b478082106126305760405162461bcd60e51b815260206004820152602f60248201527f77697468647261773a2043616e277420657863656564206d6f7265207468616e60448201526e20746f74616c4c697175696469747960881b6064820152608401610927565b600080546040516001600160a01b039091169182916108fc86150291869190818181858888f193505050501580156122f2573d6000803e3d6000fd5b6007602052816000526040600020818154811061268857600080fd5b6000918252602090912001546001600160a01b03169150829050565b6001600160a01b0382166000908152600860205260408120546060919067ffffffffffffffff8111156126d9576126d9612fdd565b60405190808252806020026020018201604052801561271257816020015b6126ff612f33565b8152602001906001900390816126f75790505b50905060005b6001600160a01b0385166000908152600860205260409020548110156113e7576001600160a01b0380861660009081526009602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615801561010083018190526127d85750428160a00151105b80156127e757508060a0015185105b1561280b57808383815181106127ff576127ff61343d565b60200260200101819052505b5080612816816133ed565b915050612718565b6001600160a01b03831660009081526007602090815260408083208054825181850281018501909352808352849383018282801561288557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612867575b505050505090506000815167ffffffffffffffff8111156128a8576128a8612fdd565b6040519080825280602002602001820160405280156128d1578160200160208202803683370190505b506040516307c0329d60e21b81529091506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1690631f00ca74906129239087908690600401613597565b600060405180830381865afa158015612940573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261296891908101906135b0565b905060006129a4606461299e88856000815181106129885761298861343d565b6020026020010151612da190919063ffffffff16565b90612d1f565b979650505050505050565b6000546001600160a01b031633146129d95760405162461bcd60e51b815260040161092790613334565b6001600160a01b038116612a3e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610927565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314612ac35760405162461bcd60e51b815260040161092790613334565b606460025410612b285760405162461bcd60e51b815260206004820152602a60248201527f7570646174653a20457468206c696d69742073686f756c64206265206c657373604482015269207468616e203130302560b01b6064820152608401610927565b600255565b6001600160a01b038316600090815260076020908152604080832080548251818502810185019093528083528493830182828015612b9457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612b76575b505050505090506000815167ffffffffffffffff811115612bb757612bb7612fdd565b604051908082528060200260200182016040528015612be0578160200160208202803683370190505b5060405163d06ca61f60e01b81529091506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063d06ca61f90612c329087908690600401613597565b600060405180830381865afa158015612c4f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c7791908101906135b0565b905060006129a46064611365888560018851612c93919061354d565b81518110612ca357612ca361343d565b6020026020010151612d1f90919063ffffffff16565b600080612cc68385613560565b905083811015612d185760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610927565b9392505050565b600082600003612d31575060006124c9565b6000612d3d8385613636565b905082612d4a8583613663565b14612d185760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610927565b6000612d1883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e6a565b6040516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820183905260009182918516906323b872dd906064016020604051808303816000875af1158015612e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e619190613453565b95945050505050565b60008183612e8b5760405162461bcd60e51b81526004016109279190613677565b506000612e988486613663565b9050612ea484866136c5565b612eae8286613636565b612eb89190613560565b8514612ec657612ec66136d9565b949350505050565b828054828255906000526020600020908101928215612f23579160200282015b82811115612f2357825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612eee565b50612f2f929150612f93565b5090565b60405180610120016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b5b80821115612f2f5760008155600101612f94565b600060208284031215612fba57600080fd5b5035919050565b80356001600160a01b0381168114612fd857600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561301c5761301c612fdd565b604052919050565b600067ffffffffffffffff82111561303e5761303e612fdd565b5060051b60200190565b600082601f83011261305957600080fd5b8135602061306e61306983613024565b612ff3565b82815260059290921b8401810191818101908684111561308d57600080fd5b8286015b848110156130af576130a281612fc1565b8352918301918301613091565b509695505050505050565b60008060008060008060c087890312156130d357600080fd5b6130dc87612fc1565b95506020870135945060408701359350606087013592506080870135915060a087013567ffffffffffffffff81111561311457600080fd5b61312089828a01613048565b9150509295509295509295565b60008060008060008060c0878903121561314657600080fd5b61314f87612fc1565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b60006020828403121561318957600080fd5b612d1882612fc1565b602080825282518282018190526000919060409081850190868401855b8281101561322b57815180516001600160a01b0390811686528782015116878601528581015186860152606080820151908601526080808201519086015260a0808201519086015260c0808201519086015260e080820151908601526101009081015115159085015261012090930192908501906001016131af565b5091979650505050505050565b6000806040838503121561324b57600080fd5b61325483612fc1565b946020939093013593505050565b801515811461327057600080fd5b50565b60008060006060848603121561328857600080fd5b61329184612fc1565b92506020840135915060408401356132a881613262565b809150509250925092565b6000806000606084860312156132c857600080fd5b6132d184612fc1565b95602085013595506040909401359392505050565b600080604083850312156132f957600080fd5b61330283612fc1565b9150602083013567ffffffffffffffff81111561331e57600080fd5b61332a85828601613048565b9150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f7570646174653a205a65726f20636f6c6c61746572616c206164647265737300604082015260600190565b6020808252601a908201527f6164643a2043616e2774206f7665722031303025206c696d6974000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600182016133ff576133ff6133d7565b5060010190565b6020808252601b908201527f7570646174653a204e6f20636f6c6c61746572616c20746f6b656e0000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561346557600080fd5b8151612d1881613262565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b600081518084526020808501945080840160005b838110156134ed5781516001600160a01b0316875295820195908201906001016134c8565b509495945050505050565b85815284602082015260a06040820152600061351760a08301866134b4565b6001600160a01b0394909416606083015250608001529392505050565b60006020828403121561354657600080fd5b5051919050565b818103818111156124c9576124c96133d7565b808201808211156124c9576124c96133d7565b6001600160a01b0383168152604060208201819052600090612ec6908301846134b4565b828152604060208201526000612ec660408301846134b4565b600060208083850312156135c357600080fd5b825167ffffffffffffffff8111156135da57600080fd5b8301601f810185136135eb57600080fd5b80516135f961306982613024565b81815260059190911b8201830190838101908783111561361857600080fd5b928401925b828410156129a45783518252928401929084019061361d565b80820281158282048414176124c9576124c96133d7565b634e487b7160e01b600052601260045260246000fd5b6000826136725761367261364d565b500490565b600060208083528351808285015260005b818110156136a457858101830151858201604001528201613688565b506000604082860101526040601f19601f8301168501019250505092915050565b6000826136d4576136d461364d565b500690565b634e487b7160e01b600052600160045260246000fdfea2646970667358221220554cf459aee1228d6887377c3e44bc317114aaec6e8f569b75a0dea4e712ea6f64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000000000000000000000000000000024f2beb1aa000000000000000000000000000000000000000000000000000000000000000000a
-----Decoded View---------------
Arg [0] : _nativeTokenAddress (address): 0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984
Arg [1] : _routerAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [2] : _nativeMin (uint256): 650000000000000
Arg [3] : _ethLimit (uint256): 10
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 00000000000000000000000000000000000000000000000000024f2beb1aa000
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000a
Deployed Bytecode Sourcemap
16876:18450:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19665:31;;;19674:10;188:51:1;;19686:9:0;270:2:1;255:18;;248:34;19665:31:0;;161:18:1;19665:31:0;;;;;;;16876:18450;;;;;18018:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;483:32:1;;;465:51;;453:2;438:18;18018:51:0;;;;;;;;17815:33;;;;;;;;;;-1:-1:-1;17815:33:0;;;;;:::i;:::-;;:::i;19712:1414::-;;;;;;;;;;-1:-1:-1;19712:1414:0;;;;;:::i;:::-;;:::i;:::-;;21134:1113;;;;;;;;;;-1:-1:-1;21134:1113:0;;;;;:::i;:::-;;:::i;32289:679::-;;;;;;;;;;-1:-1:-1;32289:679:0;;;;;:::i;:::-;;:::i;:::-;;;3944:25:1;;;3932:2;3917:18;32289:679:0;3798:177:1;34282:167:0;;;;;;;;;;-1:-1:-1;34282:167:0;;;;;:::i;:::-;;:::i;17029:29::-;;;;;;;;;;;;;;;;30316:374;;;;;;;;;;-1:-1:-1;30316:374:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35217:106::-;;;;;;;;;;-1:-1:-1;35294:21:0;35217:106;;29218:1090;;;;;;:::i;:::-;;:::i;25487:297::-;;;;;;;;;;-1:-1:-1;25487:297:0;;;;;:::i;:::-;;:::i;:::-;;;5957:14:1;;5950:22;5932:41;;5920:2;5905:18;25487:297:0;5792:187:1;23341:358:0;;;;;;;;;;-1:-1:-1;23341:358:0;;;;;:::i;:::-;;:::i;17686:49::-;;;;;;;;;;-1:-1:-1;17686:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;17065:33;;;;;;;;;;-1:-1:-1;17065:33:0;;;;-1:-1:-1;;;;;17065:33:0;;;16958:23;;;;;;;;;;;;;;;;17105;;;;;;;;;;-1:-1:-1;17105:23:0;;;;-1:-1:-1;;;;;17105:23:0;;;22736:597;;;;;;;;;;-1:-1:-1;22736:597:0;;;;;:::i;:::-;;:::i;23967:266::-;;;;;;;;;;-1:-1:-1;23967:266:0;;;;;:::i;:::-;;:::i;33421:853::-;;;;;;;;;;;;;:::i;13698:148::-;;;;;;;;;;;;;:::i;30698:485::-;;;;;;;;;;-1:-1:-1;30698:485:0;;;;;:::i;:::-;;:::i;26133:3077::-;;;;;;;;;;-1:-1:-1;26133:3077:0;;;;;:::i;:::-;;:::i;22255:473::-;;;;;;;;;;-1:-1:-1;22255:473:0;;;;;:::i;:::-;;:::i;17888:49::-;;;;;;;;;;-1:-1:-1;17888:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;13056:79;;;;;;;;;;-1:-1:-1;13094:7:0;13121:6;-1:-1:-1;;;;;13121:6:0;13056:79;;17742:64;;;;;;;;;;-1:-1:-1;17742:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17742:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7670:15:1;;;7652:34;;7722:15;;;;7717:2;7702:18;;7695:43;7754:18;;;7747:34;;;;7812:2;7797:18;;7790:34;;;;7855:3;7840:19;;7833:35;;;;7632:3;7884:19;;7877:35;7943:3;7928:19;;7921:35;7987:3;7972:19;;7965:35;8044:14;8037:22;8031:3;8016:19;;8009:51;7601:3;7586:19;17742:64:0;7249:817:1;34804:290:0;;;;;;;;;;-1:-1:-1;34804:290:0;;;;;:::i;:::-;;:::i;35102:107::-;;;;;;;;;;-1:-1:-1;35178:16:0;:23;35102:107;;31191:485;;;;;;;;;;-1:-1:-1;31191:485:0;;;;;:::i;:::-;;:::i;17855:26::-;;;;;;;;;;-1:-1:-1;17855:26:0;;;;;:::i;:::-;;:::i;32976:437::-;;;;;;;;;;;;;:::i;23707:252::-;;;;;;;;;;-1:-1:-1;23707:252:0;;;;;:::i;:::-;;:::i;34457:339::-;;;;;;;;;;-1:-1:-1;34457:339:0;;;;;:::i;:::-;;:::i;17633:46::-;;;;;;;;;;-1:-1:-1;17633:46:0;;;;;:::i;:::-;;:::i;17601:25::-;;;;;;;;;;;;;;;;17944:65;;;;;;;;;;-1:-1:-1;17944:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8324:25:1;;;8380:2;8365:18;;8358:34;;;;8408:18;;;8401:34;;;;8466:2;8451:18;;8444:34;8522:14;8515:22;8509:3;8494:19;;8487:51;8311:3;8296:19;17944:65:0;8071:473:1;31684:597:0;;;;;;;;;;-1:-1:-1;31684:597:0;;;;;:::i;:::-;;:::i;24502:438::-;;;;;;;;;;-1:-1:-1;24502:438:0;;;;;:::i;:::-;;:::i;14001:281::-;;;;;;;;;;-1:-1:-1;14001:281:0;;;;;:::i;:::-;;:::i;24241:179::-;;;;;;;;;;-1:-1:-1;24241:179:0;;;;;:::i;:::-;;:::i;25016:463::-;;;;;;;;;;-1:-1:-1;25016:463:0;;;;;:::i;:::-;;:::i;17815:33::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17815:33:0;;-1:-1:-1;17815:33:0;:::o;19712:1414::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;19983:30:0;::::1;19961:111;;;;-1:-1:-1::0;;;19961:111:0::1;;;;;;;:::i;:::-;20104:3;20091:10;:16;20083:55;;;;-1:-1:-1::0;;;20083:55:0::1;;;;;;;:::i;:::-;20176:3;20157:16;:22;20149:61;;;;-1:-1:-1::0;;;20149:61:0::1;;;;;;;:::i;:::-;20243:3;20229:10;:17;;20221:53;;;::::0;-1:-1:-1;;;20221:53:0;;9827:2:1;20221:53:0::1;::::0;::::1;9809:21:1::0;9866:2;9846:18;;;9839:30;-1:-1:-1;;;9885:18:1;;;9878:53;9948:18;;20221:53:0::1;9625:347:1::0;20221:53:0::1;20287:15;20305:35;20323:16;20305:17;:35::i;:::-;20287:53;;20356:10;20351:133;;20383:16;:39:::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;;20383:39:0::1;-1:-1:-1::0;;;;;20383:39:0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20437:27:0;;;:9:::1;20383:39;20437:27:::0;;;;;;;:35;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;20351:133;20494:27;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20494:27:0::1;20532:40:::0;;;20583:21:::1;::::0;;::::1;:34:::0;;;20630:27:::1;::::0;;::::1;:46:::0;;;20687:21:::1;::::0;::::1;:34:::0;;;-1:-1:-1;20732:18:0::1;::::0;::::1;:26:::0;;;-1:-1:-1;;;;;20791:32:0;::::1;::::0;;;:14:::1;:32:::0;;;;;;;;20836:9:::1;:27:::0;;;;;:40;;;;;;;;:54;;;;;;20732:26;20836:54;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;20836:54:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;20901:32;;;;;;:34;;20791:32;;20901:34;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;20953:165:0::1;::::0;;-1:-1:-1;;;;;10526:32:1;;10508:51;;10590:2;10575:18;;10568:34;;;10618:18;;;10611:34;;;10676:2;10661:18;;10654:34;;;10719:3;10704:19;;10697:35;;;20953:165:0::1;::::0;10495:3:1;10480:19;20953:165:0::1;;;;;;;19950:1176;;;19712:1414:::0;;;;;;:::o;21134:1113::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21400:30:0;::::1;21378:111;;;;-1:-1:-1::0;;;21378:111:0::1;;;;;;;:::i;:::-;21500:15;21518:35;21536:16;21518:17;:35::i;:::-;21500:53;;21572:10;21564:50;;;;-1:-1:-1::0;;;21564:50:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21645:32:0;::::1;21625:17;21645:32:::0;;;:14:::1;:32;::::0;;;;;21696:18;;::::1;21688:53;;;::::0;-1:-1:-1;;;21688:53:0;;11301:2:1;21688:53:0::1;::::0;::::1;11283:21:1::0;11340:2;11320:18;;;11313:30;-1:-1:-1;;;11359:18:1;;;11352:52;11421:18;;21688:53:0::1;11099:346:1::0;21688:53:0::1;21773:3;21760:10;:16;21752:55;;;;-1:-1:-1::0;;;21752:55:0::1;;;;;;;:::i;:::-;21845:3;21826:16;:22;21818:61;;;;-1:-1:-1::0;;;21818:61:0::1;;;;;;;:::i;:::-;21912:3;21898:10;:17;;21890:53;;;::::0;-1:-1:-1;;;21890:53:0;;9827:2:1;21890:53:0::1;::::0;::::1;9809:21:1::0;9866:2;9846:18;;;9839:30;-1:-1:-1;;;9885:18:1;;;9878:53;9948:18;;21890:53:0::1;9625:347:1::0;21890:53:0::1;-1:-1:-1::0;;;;;;;21956:27:0;;;::::1;;::::0;;;:9:::1;:27;::::0;;;;;;;:35;;;;;;;;;;:64;;;22031:45:::1;::::0;::::1;:58:::0;22100:51:::1;::::0;::::1;:70:::0;;;;22181:45:::1;;:58:::0;21134:1113::o;32289:679::-;32351:7;32371:23;32410:9;32405:523;32429:9;:16;32425:20;;32405:523;;;32467:12;32482:9;32492:1;32482:12;;;;;;;;:::i;:::-;;;;;;;;;;32606:10;;-1:-1:-1;;;;;32482:12:0;;;;-1:-1:-1;32541:90:0;;32482:12;;32541:23;:90::i;:::-;32509:122;;32651:9;32646:271;32670:8;:15;32666:1;:19;32646:271;;;32725:8;32734:1;32725:11;;;;;;;;:::i;:::-;;;;;;;:17;;;-1:-1:-1;;;;;32715:27:0;:6;-1:-1:-1;;;;;32715:27:0;;32711:191;;32785:97;32831:8;32840:1;32831:11;;;;;;;;:::i;:::-;;;;;;;:28;;;32785:15;:19;;:97;;;;:::i;:::-;32767:115;;32711:191;32687:3;;;;:::i;:::-;;;;32646:271;;;;32452:476;;32447:3;;;;;:::i;:::-;;;;32405:523;;;-1:-1:-1;32945:15:0;32289:679;-1:-1:-1;;32289:679:0:o;34282:167::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34362:22:0;::::1;34354:57;;;::::0;-1:-1:-1;;;34354:57:0;;11784:2:1;34354:57:0::1;::::0;::::1;11766:21:1::0;11823:2;11803:18;;;11796:30;-1:-1:-1;;;11842:18:1;;;11835:52;11904:18;;34354:57:0::1;11582:346:1::0;34354:57:0::1;34422:8;:19:::0;;-1:-1:-1;;;;;;34422:19:0::1;-1:-1:-1::0;;;;;34422:19:0;;;::::1;::::0;;;::::1;::::0;;34282:167::o;30316:374::-;-1:-1:-1;;;;;30506:21:0;;30442:29;30506:21;;;:14;:21;;;;;;30404:20;;30442:29;30474:64;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;30442:96;;30554:9;30549:108;-1:-1:-1;;;;;30573:21:0;;;;;;:14;:21;;;;;;30569:25;;30549:108;;;-1:-1:-1;;;;;30630:12:0;;;;;;;:5;:12;;;;;;;;:15;;;;;;;;;30616:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;;:8;;30643:1;;30616:11;;;;;;:::i;:::-;;;;;;:29;;;;30596:3;;;;;:::i;:::-;;;;30549:108;;29218:1090;15931:1;16527:7;;:19;16519:63;;;;-1:-1:-1;;;16519:63:0;;12135:2:1;16519:63:0;;;12117:21:1;12174:2;12154:18;;;12147:30;12213:33;12193:18;;;12186:61;12264:18;;16519:63:0;11933:355:1;16519:63:0;15931:1;16660:7;:18;29381:10:::1;29345:27;29375:17:::0;;;:5:::1;:17;::::0;;;;;;;:22;;;;;;;;29430:16;;29375:22;;-1:-1:-1;;;;;29430:16:0;;::::1;:30;29408:114;;;::::0;-1:-1:-1;;;29408:114:0;;12495:2:1;29408:114:0::1;::::0;::::1;12477:21:1::0;12534:2;12514:18;;;12507:30;12573:34;12553:18;;;12546:62;-1:-1:-1;;;12624:18:1;;;12617:32;12666:19;;29408:114:0::1;12293:398:1::0;29408:114:0::1;29542:17;::::0;::::1;::::0;::::1;;29541:18;29533:55;;;::::0;-1:-1:-1;;;29533:55:0;;12898:2:1;29533:55:0::1;::::0;::::1;12880:21:1::0;12937:2;12917:18;;;12910:30;12976:26;12956:18;;;12949:54;13020:18;;29533:55:0::1;12696:348:1::0;29533:55:0::1;29640:7;:19;;;29621:15;:38;;29599:112;;;::::0;-1:-1:-1;;;29599:112:0;;13251:2:1;29599:112:0::1;::::0;::::1;13233:21:1::0;13290:2;13270:18;;;13263:30;13329:26;13309:18;;;13302:54;13373:18;;29599:112:0::1;13049:348:1::0;29599:112:0::1;29757:7;:21;;;29744:9;:34;;29722:109;;;::::0;-1:-1:-1;;;29722:109:0;;13604:2:1;29722:109:0::1;::::0;::::1;13586:21:1::0;13643:2;13623:18;;;13616:30;13682:27;13662:18;;;13655:55;13727:18;;29722:109:0::1;13402:349:1::0;29722:109:0::1;29842:17;::::0;::::1;:24:::0;;-1:-1:-1;;29842:24:0::1;29862:4;29842:24;::::0;;29980::::1;::::0;::::1;::::0;29899:120:::1;::::0;-1:-1:-1;;;29899:120:0;;29951:10:::1;29899:120;::::0;::::1;188:51:1::0;255:18;;;248:34;;;;-1:-1:-1;;;;;29899:33:0;::::1;::::0;::::1;::::0;161:18:1;;29899:120:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29877:227;;;::::0;-1:-1:-1;;;29877:227:0;;14208:2:1;29877:227:0::1;::::0;::::1;14190:21:1::0;14247:2;14227:18;;;14220:30;14286:34;14266:18;;;14259:62;14357:27;14337:18;;;14330:55;14402:19;;29877:227:0::1;14006:421:1::0;29877:227:0::1;30167:17;::::0;::::1;::::0;30229:21:::1;::::0;::::1;::::0;30265:24:::1;::::0;::::1;::::0;30120:180:::1;::::0;;30142:10:::1;14685:51:1::0;;30167:17:0::1;::::0;;::::1;14779:14:1::0;14772:22;14767:2;14752:18;;14745:50;30199:15:0::1;14811:18:1::0;;;14804:34;14869:2;14854:18;;14847:34;;;;14912:3;14897:19;;14890:35;30120:180:0;::::1;::::0;;;;14672:3:1;30120:180:0;;::::1;-1:-1:-1::0;;15887:1:0;16839:22;;-1:-1:-1;29218:1090:0:o;25487:297::-;25543:4;25560:16;25579:21;25560:40;;25611:15;25629:31;25656:3;25629:22;25642:8;;25629;:12;;:22;;;;:::i;:::-;:26;;:31::i;:::-;25611:49;;25685:7;25675;:17;25671:106;;;-1:-1:-1;25716:5:0;;25487:297;-1:-1:-1;;;25487:297:0:o;25671:106::-;-1:-1:-1;25761:4:0;;25487:297;-1:-1:-1;;;25487:297:0:o;23341:358::-;23435:16;:23;23404:4;;;;23500:167;23524:3;23520:1;:7;23500:167;;;23562:16;23579:1;23562:19;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;23562:19:0;;;23553:28;;;;23549:107;;23612:4;23602:14;;23635:5;;23549:107;23529:3;;;;:::i;:::-;;;;23500:167;;;-1:-1:-1;23684:7:0;23341:358;-1:-1:-1;;;23341:358:0:o;22736:597::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22907:30:0;::::1;22885:111;;;;-1:-1:-1::0;;;22885:111:0::1;;;;;;;:::i;:::-;23007:15;23025:35;23043:16;23025:17;:35::i;:::-;23007:53;;23079:10;23071:50;;;;-1:-1:-1::0;;;23071:50:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;23152:32:0;::::1;23132:17;23152:32:::0;;;:14:::1;:32;::::0;;;;;23203:23;;::::1;23195:62;;;::::0;-1:-1:-1;;;23195:62:0;;15138:2:1;23195:62:0::1;::::0;::::1;15120:21:1::0;15177:2;15157:18;;;15150:30;15216:28;15196:18;;;15189:56;15262:18;;23195:62:0::1;14936:350:1::0;23195:62:0::1;-1:-1:-1::0;;;;;;;23268:27:0;;;::::1;;::::0;;;:9:::1;:27;::::0;;;;;;;:40;;;;;;;:47:::1;;:57:::0;;-1:-1:-1;;23268:57:0::1;::::0;::::1;;::::0;;;::::1;::::0;;22736:597::o;23967:266::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24090:27:0;::::1;24082:66;;;::::0;-1:-1:-1;;;24082:66:0;;15493:2:1;24082:66:0::1;::::0;::::1;15475:21:1::0;15532:2;15512:18;;;15505:30;15571:28;15551:18;;;15544:56;15617:18;;24082:66:0::1;15291:350:1::0;24082:66:0::1;24159:18;:34:::0;;-1:-1:-1;;;;;;24159:34:0::1;-1:-1:-1::0;;;;;24159:34:0;;;::::1;::::0;;;::::1;::::0;;;24204:14:::1;:21:::0;23967:266::o;33421:853::-;19339:8;;-1:-1:-1;;;;;19339:8:0;19351:10;19339:22;19331:71;;;;-1:-1:-1;;;19331:71:0;;;;;;;:::i;:::-;33479:9:::1;33474:754;33498:16;:23:::0;33494:27;::::1;33474:754;;;33543:19;33565:36;33581:16;33598:1;33581:19;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;33581:19:0::1;33565:15;:36::i;:::-;33543:58:::0;-1:-1:-1;33620:15:0;;33616:601:::1;;33663:16;33680:1;33663:19;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;33656:135:::1;::::0;-1:-1:-1;;;33656:135:0;;-1:-1:-1;;;;;33722:15:0::1;206:32:1::0;;33656:135:0::1;::::0;::::1;188:51:1::0;255:18;;;248:34;;;33663:19:0;;::::1;::::0;33656:35:::1;::::0;161:18:1;;33656:135:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33810:21;33834:9;:30;33844:16;33861:1;33844:19;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;33844:19:0::1;33834:30:::0;;;;::::1;::::0;;;;;;;;;;33810:54;;;;;;::::1;::::0;;;;;;;;;;;;33834:30;;33810:54;;::::1;33834:30:::0;33810:54;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;33810:54:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;-1:-1:-1::0;;33883:318:0::1;::::0;-1:-1:-1;;;33883:318:0;;33810:54;;-1:-1:-1;;;;;;;33883:15:0::1;:88;::::0;::::1;::::0;-1:-1:-1;33883:318:0::1;::::0;-1:-1:-1;33998:11:0;;34036:1:::1;::::0;33810:54;;34131:4:::1;::::0;34163:15:::1;::::0;33883:318:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33637:580;33616:601;-1:-1:-1::0;33523:3:0;::::1;::::0;::::1;:::i;:::-;;;;33474:754;;;-1:-1:-1::0;34251:15:0::1;34238:10;:28:::0;33421:853::o;13698:148::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;13805:1:::1;13789:6:::0;;13768:40:::1;::::0;-1:-1:-1;;;;;13789:6:0;;::::1;::::0;13768:40:::1;::::0;13805:1;;13768:40:::1;13836:1;13819:19:::0;;-1:-1:-1;;;;;;13819:19:0::1;::::0;;13698:148::o;30698:485::-;-1:-1:-1;;;;;30877:21:0;;30828:28;30877:21;;;:14;:21;;;;;;30790:20;;30828:28;30859:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;30828:71;;30915:9;30910:241;-1:-1:-1;;;;;30934:21:0;;;;;;:14;:21;;;;;;30930:25;;30910:241;;;-1:-1:-1;;;;;31002:12:0;;;30977:22;31002:12;;;:5;:12;;;;;;;;:15;;;;;;;;;30977:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31036:51;;;31072:15;31054:3;:15;;;:33;31036:51;31032:108;;;31121:3;31108:7;31116:1;31108:10;;;;;;;;:::i;:::-;;;;;;:16;;;;31032:108;-1:-1:-1;30957:3:0;;;;:::i;:::-;;;;30910:241;;26133:3077;15931:1;16527:7;;:19;16519:63;;;;-1:-1:-1;;;16519:63:0;;12135:2:1;16519:63:0;;;12117:21:1;12174:2;12154:18;;;12147:30;12213:33;12193:18;;;12186:61;12264:18;;16519:63:0;11933:355:1;16519:63:0;15931:1;16660:7;:18;-1:-1:-1;;;;;26309:27:0;::::1;;::::0;;;:9:::1;:27;::::0;;;;;;;:40;;;;;;;;:47:::1;;::::0;::::1;;26308:48;26286:128;;;::::0;-1:-1:-1;;;26286:128:0;;17306:2:1;26286:128:0::1;::::0;::::1;17288:21:1::0;17345:2;17325:18;;;17318:30;17384:32;17364:18;;;17357:60;17434:18;;26286:128:0::1;17104:354:1::0;26286:128:0::1;-1:-1:-1::0;;;;;26588:31:0;::::1;26425:19;26588:31:::0;;;:14:::1;:31;::::0;;;;;26447:12;;26496:16;;26544:11;;26648:24;;::::1;26640:64;;;::::0;-1:-1:-1;;;26640:64:0;;17665:2:1;26640:64:0::1;::::0;::::1;17647:21:1::0;17704:2;17684:18;;;17677:30;17743:29;17723:18;;;17716:57;17790:18;;26640:64:0::1;17463:351:1::0;26640:64:0::1;26743:45;::::0;-1:-1:-1;;;26743:45:0;;26777:10:::1;26743:45;::::0;::::1;465:51:1::0;26725:15:0::1;::::0;-1:-1:-1;;;;;26743:33:0;::::1;::::0;::::1;::::0;438:18:1;;26743:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26725:63;;26827:11;26817:7;:21;26809:69;;;::::0;-1:-1:-1;;;26809:69:0;;18210:2:1;26809:69:0::1;::::0;::::1;18192:21:1::0;18249:2;18229:18;;;18222:30;18288:34;18268:18;;;18261:62;-1:-1:-1;;;18339:18:1;;;18332:33;18382:19;;26809:69:0::1;18008:399:1::0;26809:69:0::1;26891:13;26907:31;26927:10;26907:19;:31::i;:::-;26891:47;;26949:13;26966:8;26965:9;:143;;-1:-1:-1::0;;;;;27054:26:0;::::1;;::::0;;;:9:::1;:26;::::0;;;;;;;:38;;;;;;;;:54:::1;;::::0;26965:143:::1;;;-1:-1:-1::0;;;;;26990:26:0;::::1;;::::0;;;:9:::1;:26;::::0;;;;;;;:38;;;;;;;;:48:::1;;::::0;26965:143:::1;27143:72;::::0;-1:-1:-1;;;27143:72:0;;27199:4:::1;27143:72;::::0;::::1;465:51:1::0;26949:159:0;;-1:-1:-1;27119:21:0::1;::::0;-1:-1:-1;;;;;27143:33:0;::::1;::::0;::::1;::::0;438:18:1;;27143:72:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27119:96;;27250:55;27264:10;27276:15;27293:11;27250:13;:55::i;:::-;27228:159;;;::::0;-1:-1:-1;;;27228:159:0;;18614:2:1;27228:159:0::1;::::0;::::1;18596:21:1::0;18653:2;18633:18;;;18626:30;18692:34;18672:18;;;18665:62;-1:-1:-1;;;18743:18:1;;;18736:52;18805:19;;27228:159:0::1;18412:418:1::0;27228:159:0::1;27431:48;::::0;-1:-1:-1;;;27431:48:0;;27473:4:::1;27431:48;::::0;::::1;465:51:1::0;27408:20:0::1;::::0;-1:-1:-1;;;;;27431:33:0;::::1;::::0;::::1;::::0;438:18:1;;27431:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27408:71:::0;-1:-1:-1;27490:23:0::1;27516:28;27531:13:::0;27408:71;27516:28:::1;:::i;:::-;27490:54;;27555:21;27579:115;27618:15;27648:5;27668:15;27579:24;:115::i;:::-;27555:139;;27705:14;27743:9:::0;27738:180:::1;27762:9;:16:::0;27758:20;::::1;27738:180;;;27820:10;-1:-1:-1::0;;;;;27804:26:0::1;:9;27814:1;27804:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;27804:12:0::1;:26:::0;27800:107:::1;;27863:4;27851:16;;27886:5;;27800:107;27780:3:::0;::::1;::::0;::::1;:::i;:::-;;;;27738:180;;;-1:-1:-1::0;27932:18:0;::::1;;27945:5;27932:18:::0;27928:77:::1;;27967:9;:26:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;27967:26:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;27967:26:0::1;27982:10;27967:26;::::0;;27928:77:::1;28037:23;28046:13;28037:8;:23::i;:::-;28015:127;;;::::0;-1:-1:-1;;;28015:127:0;;19170:2:1;28015:127:0::1;::::0;::::1;19152:21:1::0;19209:2;19189:18;;;19182:30;19248:34;19228:18;;;19221:62;-1:-1:-1;;;19299:18:1;;;19292:52;19361:19;;28015:127:0::1;18968:418:1::0;28015:127:0::1;28153:26;;:::i;:::-;28209:10;28190:29:::0;;;28230:18:::1;::::0;;::::1;:34:::0;;;28275:24:::1;::::0;::::1;:42:::0;;;-1:-1:-1;28345:26:0;;;:14:::1;:26;::::0;;;;;;;28328:14:::1;::::0;::::1;:43:::0;28382:17:::1;::::0;::::1;:25:::0;;;-1:-1:-1;;;;;28418:31:0;::::1;:13:::0;;::::1;:31:::0;;;28480:26;;:9:::1;:26:::0;;;;;:38;;;;;;;:48:::1;::::0;::::1;::::0;28562:65;;28662:37:::1;28695:3;28662:28;28230:34:::0;28480:48;28662:17:::1;:28::i;:37::-;28638:21;::::0;::::1;:61:::0;28732:30:::1;28750:12:::0;28732:15:::1;:30;:::i;:::-;28710:19;::::0;::::1;:52:::0;;;28773:16:::1;::::0;::::1;:31:::0;;;28823:10:::1;-1:-1:-1::0;28817:17:0;;;:5:::1;:17;::::0;;;;;;;28835:14:::1;:26:::0;;;;;;;;28817:45;;;;;;;;:55;;;;-1:-1:-1;;;;;28817:55:0;;::::1;-1:-1:-1::0;;;;;;28817:55:0;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;;;;;::::1;::::0;::::1;;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;;-1:-1:-1::0;;28817:55:0;;::::1;::::0;;;::::1;::::0;;28883:26;;;;;;:28;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;28922:43:0::1;::::0;28930:10:::1;::::0;28922:43;::::1;;;::::0;28951:13;;28922:43:::1;::::0;;;28951:13;28930:10;28922:43;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;29008:10;-1:-1:-1::0;;;;;28981:221:0::1;;29033:7;:18;;;29066:7;:24;;;29105:7;:21;;;29141:7;:19;;;29175:7;:16;;;28981:221;;;;;;;;;19780:25:1::0;;;19836:2;19821:18;;19814:34;;;;19879:2;19864:18;;19857:34;;;;19922:2;19907:18;;19900:34;19965:3;19950:19;;19943:35;19767:3;19752:19;;19521:463;28981:221:0::1;;;;;;;;-1:-1:-1::0;;15887:1:0;16839:22;;-1:-1:-1;;;;;;;;;;;;;;;;26133:3077:0:o;22255:473::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22402:30:0;::::1;22380:111;;;;-1:-1:-1::0;;;22380:111:0::1;;;;;;;:::i;:::-;22502:15;22520:35;22538:16;22520:17;:35::i;:::-;22502:53;;22574:10;22566:50;;;;-1:-1:-1::0;;;22566:50:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22627:27:0;::::1;;::::0;;;:9:::1;:27;::::0;;;;;;;:35;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;22680:40;22696:16;22714:5;22680:40;;;;;;;:::i;:::-;;;;;;;;22369:359;22255:473:::0;;:::o;34804:290::-;19339:8;;-1:-1:-1;;;;;19339:8:0;19351:10;19339:22;19331:71;;;;-1:-1:-1;;;19331:71:0;;;;;;;:::i;:::-;34873:15:::1;34891:25;34909:6;34891:17;:25::i;:::-;34873:43;;34932:10;34927:160;;34977:39;::::0;-1:-1:-1;;;34977:39:0;;35010:4:::1;34977:39;::::0;::::1;465:51:1::0;34959:15:0::1;::::0;-1:-1:-1;;;;;34977:24:0;::::1;::::0;::::1;::::0;438:18:1;;34977:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35031:44;::::0;-1:-1:-1;;;35031:44:0;;35055:10:::1;35031:44;::::0;::::1;188:51:1::0;255:18;;;248:34;;;34959:57:0;;-1:-1:-1;;;;;;35031:23:0;::::1;::::0;::::1;::::0;161:18:1;;35031:44:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34944:143;34927:160;34862:232;34804:290:::0;:::o;31191:485::-;-1:-1:-1;;;;;31370:21:0;;31321:28;31370:21;;;:14;:21;;;;;;31283:20;;31321:28;31352:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;31321:71;;31408:9;31403:241;-1:-1:-1;;;;;31427:21:0;;;;;;:14;:21;;;;;;31423:25;;31403:241;;;-1:-1:-1;;;;;31495:12:0;;;31470:22;31495:12;;;:5;:12;;;;;;;;:15;;;;;;;;;31470:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31529:51;;;31565:15;31547:3;:15;;;:33;31529:51;31525:108;;;31614:3;31601:7;31609:1;31601:10;;;;;;;;:::i;:::-;;;;;;:16;;;;31525:108;-1:-1:-1;31450:3:0;;;;:::i;:::-;;;;31403:241;;17855:26;;;;;;;;;;;;32976:437;33020:4;;;;33099:204;33123:16;:23;33119:27;;33099:204;;;33168:19;33190:36;33206:16;33223:1;33206:19;;;;;;;;:::i;33190:36::-;33168:58;-1:-1:-1;33259:32:0;:15;33168:58;33259:19;:32::i;:::-;33241:50;;33153:150;33148:3;;;;;:::i;:::-;;;;33099:204;;;-1:-1:-1;33317:19:0;;33313:67;;-1:-1:-1;33364:4:0;33313:67;33397:8;32976:437;-1:-1:-1;;32976:437:0:o;23707:252::-;23814:18;;;23807:43;;-1:-1:-1;;;23807:43:0;;-1:-1:-1;;;;;483:32:1;;;23807:43:0;;;465:51:1;;;;23772:4:0;;;;23814:18;;23807:36;;438:18:1;;23807:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23789:61;;23875:14;;23865:7;:24;23861:68;;;-1:-1:-1;23913:4:0;;23707:252;-1:-1:-1;;23707:252:0:o;23861:68::-;-1:-1:-1;23946:5:0;;23707:252;-1:-1:-1;;23707:252:0:o;34457:339::-;13094:7;13121:6;-1:-1:-1;;;;;13121:6:0;19495:10;:21;;19494:51;;-1:-1:-1;19536:8:0;;-1:-1:-1;;;;;19536:8:0;19522:10;:22;19494:51;19472:122;;;;-1:-1:-1;;;19472:122:0;;20554:2:1;19472:122:0;;;20536:21:1;20593:2;20573:18;;;20566:30;-1:-1:-1;;;20612:18:1;;;20605:51;20673:18;;19472:122:0;20352:345:1;19472:122:0;34554:21:::1;34608:18:::0;;::::1;34586:115;;;::::0;-1:-1:-1;;;34586:115:0;;20904:2:1;34586:115:0::1;::::0;::::1;20886:21:1::0;20943:2;20923:18;;;20916:30;20982:34;20962:18;;;20955:62;-1:-1:-1;;;21033:18:1;;;21026:45;21088:19;;34586:115:0::1;20702:411:1::0;34586:115:0::1;34712:22;13121:6:::0;;34764:24:::1;::::0;-1:-1:-1;;;;;13121:6:0;;;;;;34764:24:::1;::::0;::::1;;::::0;;;;;34712:22;34764:24;;13121:6;34764:24;::::1;;;;;;;;;;;;;::::0;::::1;;;;17633:46:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17633:46:0;;-1:-1:-1;17633:46:0;;-1:-1:-1;17633:46:0:o;31684:597::-;-1:-1:-1;;;;;31882:21:0;;31833:28;31882:21;;;:14;:21;;;;;;31795:20;;31833:28;31864:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;31833:71;;31920:9;31915:334;-1:-1:-1;;;;;31939:21:0;;;;;;:14;:21;;;;;;31935:25;;31915:334;;;-1:-1:-1;;;;;32007:12:0;;;31982:22;32007:12;;;:5;:12;;;;;;;;:15;;;;;;;;;31982:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32059:68;;;32112:15;32094:3;:15;;;:33;32059:68;:112;;;;;32156:3;:15;;;32148:5;:23;32059:112;32037:201;;;32219:3;32206:7;32214:1;32206:10;;;;;;;;:::i;:::-;;;;;;:16;;;;32037:201;-1:-1:-1;31962:3:0;;;;:::i;:::-;;;;31915:334;;24502:438;-1:-1:-1;;;;;24694:27:0;;24650:7;24694:27;;;:9;:27;;;;;;;;24670:51;;;;;;;;;;;;;;;;;24650:7;;24670:51;;24694:27;24670:51;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24670:51:0;;;;;;;;;;;;;;;;;;;;;;;24732:24;24773:4;:11;24759:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24759:26:0;-1:-1:-1;24806:43:0;;-1:-1:-1;;;24806:43:0;;24732:53;;-1:-1:-1;;;;;;24806:15:0;:28;;;;:43;;24835:7;;24844:4;;24806:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24806:43:0;;;;;;;;;;;;:::i;:::-;24796:53;;24860:14;24877:31;24904:3;24877:22;24892:6;24877:7;24885:1;24877:10;;;;;;;;:::i;:::-;;;;;;;:14;;:22;;;;:::i;:::-;:26;;:31::i;:::-;24860:48;24502:438;-1:-1:-1;;;;;;;24502:438:0:o;14001:281::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14104:22:0;::::1;14082:110;;;::::0;-1:-1:-1;;;14082:110:0;;22543:2:1;14082:110:0::1;::::0;::::1;22525:21:1::0;22582:2;22562:18;;;22555:30;22621:34;22601:18;;;22594:62;-1:-1:-1;;;22672:18:1;;;22665:36;22718:19;;14082:110:0::1;22341:402:1::0;14082:110:0::1;14229:6;::::0;;14208:38:::1;::::0;-1:-1:-1;;;;;14208:38:0;;::::1;::::0;14229:6;::::1;::::0;14208:38:::1;::::0;::::1;14257:6;:17:::0;;-1:-1:-1;;;;;;14257:17:0::1;-1:-1:-1::0;;;;;14257:17:0;;;::::1;::::0;;;::::1;::::0;;14001:281::o;24241:179::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;24331:3:::1;24320:8;;:14;24312:69;;;::::0;-1:-1:-1;;;24312:69:0;;22950:2:1;24312:69:0::1;::::0;::::1;22932:21:1::0;22989:2;22969:18;;;22962:30;23028:34;23008:18;;;23001:62;-1:-1:-1;;;23079:18:1;;;23072:40;23129:19;;24312:69:0::1;22748:406:1::0;24312:69:0::1;24392:8;:20:::0;24241:179::o;25016:463::-;-1:-1:-1;;;;;25213:27:0;;25169:7;25213:27;;;:9;:27;;;;;;;;25189:51;;;;;;;;;;;;;;;;;25169:7;;25189:51;;25213:27;25189:51;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25189:51:0;;;;;;;;;;;;;;;;;;;;;;;25251:24;25292:4;:11;25278:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25278:26:0;-1:-1:-1;25325:49:0;;-1:-1:-1;;;25325:49:0;;25251:53;;-1:-1:-1;;;;;;25325:15:0;:29;;;;:49;;25355:12;;25369:4;;25325:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25325:49:0;;;;;;;;;;;;:::i;:::-;25315:59;;25385:14;25402:45;25443:3;25402:36;25431:6;25402:7;25424:1;25410:4;:11;:15;;;;:::i;:::-;25402:24;;;;;;;;:::i;:::-;;;;;;;:28;;:36;;;;:::i;170:181::-;228:7;;260:5;264:1;260;:5;:::i;:::-;248:17;;289:1;284;:6;;276:46;;;;-1:-1:-1;;;276:46:0;;23361:2:1;276:46:0;;;23343:21:1;23400:2;23380:18;;;23373:30;23439:29;23419:18;;;23412:57;23486:18;;276:46:0;23159:351:1;276:46:0;342:1;170:181;-1:-1:-1;;;170:181:0:o;737:250::-;795:7;819:1;824;819:6;815:47;;-1:-1:-1;849:1:0;842:8;;815:47;874:9;886:5;890:1;886;:5;:::i;:::-;874:17;-1:-1:-1;919:1:0;910:5;914:1;874:17;910:5;:::i;:::-;:10;902:56;;;;-1:-1:-1;;;902:56:0;;24147:2:1;902:56:0;;;24129:21:1;24186:2;24166:18;;;24159:30;24225:34;24205:18;;;24198:62;-1:-1:-1;;;24276:18:1;;;24269:31;24317:19;;902:56:0;23945:397:1;995:132:0;1053:7;1080:39;1084:1;1087;1080:39;;;;;;;;;;;;;;;;;:3;:39::i;25792:333::-;25965:123;;-1:-1:-1;;;25965:123:0;;-1:-1:-1;;;;;24605:15:1;;;25965:123:0;;;24587:34:1;26045:4:0;24637:18:1;;;24630:43;24689:18;;;24682:34;;;25929:4:0;;;;25965:37;;;;;24522:18:1;;25965:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25946:142;25792:333;-1:-1:-1;;;;;25792:333:0:o;1135:311::-;1255:7;1290:12;1283:5;1275:28;;;;-1:-1:-1;;;1275:28:0;;;;;;;;:::i;:::-;-1:-1:-1;1314:9:0;1326:5;1330:1;1326;:5;:::i;:::-;1314:17;-1:-1:-1;1363:5:0;1367:1;1363;:5;:::i;:::-;1354;1358:1;1354;:5;:::i;:::-;:15;;;;:::i;:::-;1349:1;:20;1342:28;;;;:::i;:::-;1437:1;1135:311;-1:-1:-1;;;;1135:311:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;527:180:1;586:6;639:2;627:9;618:7;614:23;610:32;607:52;;;655:1;652;645:12;607:52;-1:-1:-1;678:23:1;;527:180;-1:-1:-1;527:180:1:o;920:173::-;988:20;;-1:-1:-1;;;;;1037:31:1;;1027:42;;1017:70;;1083:1;1080;1073:12;1017:70;920:173;;;:::o;1098:127::-;1159:10;1154:3;1150:20;1147:1;1140:31;1190:4;1187:1;1180:15;1214:4;1211:1;1204:15;1230:275;1301:2;1295:9;1366:2;1347:13;;-1:-1:-1;;1343:27:1;1331:40;;1401:18;1386:34;;1422:22;;;1383:62;1380:88;;;1448:18;;:::i;:::-;1484:2;1477:22;1230:275;;-1:-1:-1;1230:275:1:o;1510:183::-;1570:4;1603:18;1595:6;1592:30;1589:56;;;1625:18;;:::i;:::-;-1:-1:-1;1670:1:1;1666:14;1682:4;1662:25;;1510:183::o;1698:668::-;1752:5;1805:3;1798:4;1790:6;1786:17;1782:27;1772:55;;1823:1;1820;1813:12;1772:55;1859:6;1846:20;1885:4;1909:60;1925:43;1965:2;1925:43;:::i;:::-;1909:60;:::i;:::-;2003:15;;;2089:1;2085:10;;;;2073:23;;2069:32;;;2034:12;;;;2113:15;;;2110:35;;;2141:1;2138;2131:12;2110:35;2177:2;2169:6;2165:15;2189:148;2205:6;2200:3;2197:15;2189:148;;;2271:23;2290:3;2271:23;:::i;:::-;2259:36;;2315:12;;;;2222;;2189:148;;;-1:-1:-1;2355:5:1;1698:668;-1:-1:-1;;;;;;1698:668:1:o;2371:697::-;2500:6;2508;2516;2524;2532;2540;2593:3;2581:9;2572:7;2568:23;2564:33;2561:53;;;2610:1;2607;2600:12;2561:53;2633:29;2652:9;2633:29;:::i;:::-;2623:39;;2709:2;2698:9;2694:18;2681:32;2671:42;;2760:2;2749:9;2745:18;2732:32;2722:42;;2811:2;2800:9;2796:18;2783:32;2773:42;;2862:3;2851:9;2847:19;2834:33;2824:43;;2918:3;2907:9;2903:19;2890:33;2946:18;2938:6;2935:30;2932:50;;;2978:1;2975;2968:12;2932:50;3001:61;3054:7;3045:6;3034:9;3030:22;3001:61;:::i;:::-;2991:71;;;2371:697;;;;;;;;:::o;3073:529::-;3177:6;3185;3193;3201;3209;3217;3270:3;3258:9;3249:7;3245:23;3241:33;3238:53;;;3287:1;3284;3277:12;3238:53;3310:29;3329:9;3310:29;:::i;:::-;3300:39;3386:2;3371:18;;3358:32;;-1:-1:-1;3437:2:1;3422:18;;3409:32;;3488:2;3473:18;;3460:32;;-1:-1:-1;3539:3:1;3524:19;;3511:33;;-1:-1:-1;3591:3:1;3576:19;3563:33;;-1:-1:-1;3073:529:1;-1:-1:-1;;;3073:529:1:o;3607:186::-;3666:6;3719:2;3707:9;3698:7;3694:23;3690:32;3687:52;;;3735:1;3732;3725:12;3687:52;3758:29;3777:9;3758:29;:::i;4076:1452::-;4305:2;4357:21;;;4427:13;;4330:18;;;4449:22;;;4276:4;;4305:2;4490;;4508:18;;;;4549:15;;;4276:4;4592:910;4606:6;4603:1;4600:13;4592:910;;;4665:13;;4749:9;;-1:-1:-1;;;;;4745:18:1;;;4733:31;;4808:11;;;4802:18;4798:27;4784:12;;;4777:49;4866:11;;;4860:18;4846:12;;;4839:40;4902:4;4946:11;;;4940:18;4926:12;;;4919:40;4982:4;5026:11;;;5020:18;5006:12;;;4999:40;4709:3;5106:11;;;5100:18;5086:12;;;5079:40;5142:4;5186:11;;;5180:18;5166:12;;;5159:40;5222:4;5266:11;;;5260:18;5246:12;;;5239:40;5303:6;5348:12;;;5342:19;4050:13;4043:21;5404:13;;;4031:34;5447:6;5438:16;;;;5477:15;;;;4628:1;4621:9;4592:910;;;-1:-1:-1;5519:3:1;;4076:1452;-1:-1:-1;;;;;;;4076:1452:1:o;5533:254::-;5601:6;5609;5662:2;5650:9;5641:7;5637:23;5633:32;5630:52;;;5678:1;5675;5668:12;5630:52;5701:29;5720:9;5701:29;:::i;:::-;5691:39;5777:2;5762:18;;;;5749:32;;-1:-1:-1;;;5533:254:1:o;5984:118::-;6070:5;6063:13;6056:21;6049:5;6046:32;6036:60;;6092:1;6089;6082:12;6036:60;5984:118;:::o;6107:383::-;6181:6;6189;6197;6250:2;6238:9;6229:7;6225:23;6221:32;6218:52;;;6266:1;6263;6256:12;6218:52;6289:29;6308:9;6289:29;:::i;:::-;6279:39;;6365:2;6354:9;6350:18;6337:32;6327:42;;6419:2;6408:9;6404:18;6391:32;6432:28;6454:5;6432:28;:::i;:::-;6479:5;6469:15;;;6107:383;;;;;:::o;6495:322::-;6572:6;6580;6588;6641:2;6629:9;6620:7;6616:23;6612:32;6609:52;;;6657:1;6654;6647:12;6609:52;6680:29;6699:9;6680:29;:::i;:::-;6670:39;6756:2;6741:18;;6728:32;;-1:-1:-1;6807:2:1;6792:18;;;6779:32;;6495:322;-1:-1:-1;;;6495:322:1:o;6822:422::-;6915:6;6923;6976:2;6964:9;6955:7;6951:23;6947:32;6944:52;;;6992:1;6989;6982:12;6944:52;7015:29;7034:9;7015:29;:::i;:::-;7005:39;;7095:2;7084:9;7080:18;7067:32;7122:18;7114:6;7111:30;7108:50;;;7154:1;7151;7144:12;7108:50;7177:61;7230:7;7221:6;7210:9;7206:22;7177:61;:::i;:::-;7167:71;;;6822:422;;;;;:::o;8549:356::-;8751:2;8733:21;;;8770:18;;;8763:30;8829:34;8824:2;8809:18;;8802:62;8896:2;8881:18;;8549:356::o;8910:355::-;9112:2;9094:21;;;9151:2;9131:18;;;9124:30;9190:33;9185:2;9170:18;;9163:61;9256:2;9241:18;;8910:355::o;9270:350::-;9472:2;9454:21;;;9511:2;9491:18;;;9484:30;9550:28;9545:2;9530:18;;9523:56;9611:2;9596:18;;9270:350::o;9977:127::-;10038:10;10033:3;10029:20;10026:1;10019:31;10069:4;10066:1;10059:15;10093:4;10090:1;10083:15;10109:135;10148:3;10169:17;;;10166:43;;10189:18;;:::i;:::-;-1:-1:-1;10236:1:1;10225:13;;10109:135::o;10743:351::-;10945:2;10927:21;;;10984:2;10964:18;;;10957:30;11023:29;11018:2;11003:18;;10996:57;11085:2;11070:18;;10743:351::o;11450:127::-;11511:10;11506:3;11502:20;11499:1;11492:31;11542:4;11539:1;11532:15;11566:4;11563:1;11556:15;13756:245;13823:6;13876:2;13864:9;13855:7;13851:23;13847:32;13844:52;;;13892:1;13889;13882:12;13844:52;13924:9;13918:16;13943:28;13965:5;13943:28;:::i;15646:400::-;15848:2;15830:21;;;15887:2;15867:18;;;15860:30;15926:34;15921:2;15906:18;;15899:62;-1:-1:-1;;;15992:2:1;15977:18;;15970:34;16036:3;16021:19;;15646:400::o;16051:461::-;16104:3;16142:5;16136:12;16169:6;16164:3;16157:19;16195:4;16224:2;16219:3;16215:12;16208:19;;16261:2;16254:5;16250:14;16282:1;16292:195;16306:6;16303:1;16300:13;16292:195;;;16371:13;;-1:-1:-1;;;;;16367:39:1;16355:52;;16427:12;;;;16462:15;;;;16403:1;16321:9;16292:195;;;-1:-1:-1;16503:3:1;;16051:461;-1:-1:-1;;;;;16051:461:1:o;16517:582::-;16816:6;16805:9;16798:25;16859:6;16854:2;16843:9;16839:18;16832:34;16902:3;16897:2;16886:9;16882:18;16875:31;16779:4;16923:57;16975:3;16964:9;16960:19;16952:6;16923:57;:::i;:::-;-1:-1:-1;;;;;17016:32:1;;;;17011:2;16996:18;;16989:60;-1:-1:-1;17080:3:1;17065:19;17058:35;16915:65;16517:582;-1:-1:-1;;;16517:582:1:o;17819:184::-;17889:6;17942:2;17930:9;17921:7;17917:23;17913:32;17910:52;;;17958:1;17955;17948:12;17910:52;-1:-1:-1;17981:16:1;;17819:184;-1:-1:-1;17819:184:1:o;18835:128::-;18902:9;;;18923:11;;;18920:37;;;18937:18;;:::i;19391:125::-;19456:9;;;19477:10;;;19474:36;;;19490:18;;:::i;19989:358::-;-1:-1:-1;;;;;20196:32:1;;20178:51;;20265:2;20260;20245:18;;20238:30;;;-1:-1:-1;;20285:56:1;;20322:18;;20314:6;20285:56;:::i;21118:332::-;21325:6;21314:9;21307:25;21368:2;21363;21352:9;21348:18;21341:30;21288:4;21388:56;21440:2;21429:9;21425:18;21417:6;21388:56;:::i;21455:881::-;21550:6;21581:2;21624;21612:9;21603:7;21599:23;21595:32;21592:52;;;21640:1;21637;21630:12;21592:52;21673:9;21667:16;21706:18;21698:6;21695:30;21692:50;;;21738:1;21735;21728:12;21692:50;21761:22;;21814:4;21806:13;;21802:27;-1:-1:-1;21792:55:1;;21843:1;21840;21833:12;21792:55;21872:2;21866:9;21895:60;21911:43;21951:2;21911:43;:::i;21895:60::-;21989:15;;;22071:1;22067:10;;;;22059:19;;22055:28;;;22020:12;;;;22095:19;;;22092:39;;;22127:1;22124;22117:12;22092:39;22151:11;;;;22171:135;22187:6;22182:3;22179:15;22171:135;;;22253:10;;22241:23;;22204:12;;;;22284;;;;22171:135;;23515:168;23588:9;;;23619;;23636:15;;;23630:22;;23616:37;23606:71;;23657:18;;:::i;23688:127::-;23749:10;23744:3;23740:20;23737:1;23730:31;23780:4;23777:1;23770:15;23804:4;23801:1;23794:15;23820:120;23860:1;23886;23876:35;;23891:18;;:::i;:::-;-1:-1:-1;23925:9:1;;23820:120::o;24727:548::-;24839:4;24868:2;24897;24886:9;24879:21;24929:6;24923:13;24972:6;24967:2;24956:9;24952:18;24945:34;24997:1;25007:140;25021:6;25018:1;25015:13;25007:140;;;25116:14;;;25112:23;;25106:30;25082:17;;;25101:2;25078:26;25071:66;25036:10;;25007:140;;;25011:3;25196:1;25191:2;25182:6;25171:9;25167:22;25163:31;25156:42;25266:2;25259;25255:7;25250:2;25242:6;25238:15;25234:29;25223:9;25219:45;25215:54;25207:62;;;;24727:548;;;;:::o;25280:112::-;25312:1;25338;25328:35;;25343:18;;:::i;:::-;-1:-1:-1;25377:9:1;;25280:112::o;25397:127::-;25458:10;25453:3;25449:20;25446:1;25439:31;25489:4;25486:1;25479:15;25513:4;25510:1;25503:15
Swarm Source
ipfs://554cf459aee1228d6887377c3e44bc317114aaec6e8f569b75a0dea4e712ea6f
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.