More Info
Private Name Tags
ContractCreator
Latest 24 from a total of 24 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Payback | 16703541 | 705 days ago | IN | 0.20476098 ETH | 0.00196969 | ||||
Loan Ether | 16517937 | 731 days ago | IN | 0 ETH | 0.00654443 | ||||
Update Native To... | 16427285 | 744 days ago | IN | 0 ETH | 0.00120437 | ||||
Payback | 16405114 | 747 days ago | IN | 0.21233375 ETH | 0.00166802 | ||||
Loan Ether | 16399624 | 748 days ago | IN | 0 ETH | 0.01253399 | ||||
Payback | 16364722 | 753 days ago | IN | 0.15346131 ETH | 0.00192445 | ||||
Loan Ether | 16311493 | 760 days ago | IN | 0 ETH | 0.00585489 | ||||
Payback | 16289294 | 763 days ago | IN | 0.27452319 ETH | 0.00143165 | ||||
Loan Ether | 16277331 | 765 days ago | IN | 0 ETH | 0.00897849 | ||||
Payback | 16229029 | 771 days ago | IN | 0.61981965 ETH | 0.00187462 | ||||
Loan Ether | 16212956 | 774 days ago | IN | 0 ETH | 0.00804204 | ||||
Loan Ether | 16211396 | 774 days ago | IN | 0 ETH | 0.00787361 | ||||
Transfer | 16205209 | 775 days ago | IN | 2.5 ETH | 0.00033339 | ||||
Add Loan Pool | 16198444 | 776 days ago | IN | 0 ETH | 0.00737454 | ||||
Add Loan Pool | 16198442 | 776 days ago | IN | 0 ETH | 0.00761734 | ||||
Add Loan Pool | 16198439 | 776 days ago | IN | 0 ETH | 0.00746261 | ||||
Add Loan Pool | 16198437 | 776 days ago | IN | 0 ETH | 0.00756757 | ||||
Add Loan Pool | 16198435 | 776 days ago | IN | 0 ETH | 0.00737485 | ||||
Add Loan Pool | 16198430 | 776 days ago | IN | 0 ETH | 0.00709211 | ||||
Add Loan Pool | 16198426 | 776 days ago | IN | 0 ETH | 0.0074885 | ||||
Add Loan Pool | 16198424 | 776 days ago | IN | 0 ETH | 0.00753807 | ||||
Add Loan Pool | 16198422 | 776 days ago | IN | 0 ETH | 0.00807936 | ||||
Add Loan Pool | 16198420 | 776 days ago | IN | 0 ETH | 0.00782886 | ||||
Add Loan Pool | 16198418 | 776 days ago | IN | 0 ETH | 0.00845308 |
Latest 8 internal transactions
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
17296197 | 622 days ago | 0.95903623 ETH | ||||
17296197 | 622 days ago | 0.95903623 ETH | ||||
16517937 | 731 days ago | 0.19688556 ETH | ||||
16399624 | 748 days ago | 0.20416706 ETH | ||||
16311493 | 760 days ago | 0.14755895 ETH | ||||
16277331 | 765 days ago | 0.26396461 ETH | ||||
16212956 | 774 days ago | 0.59643099 ETH | ||||
16211396 | 774 days ago | 0.59598043 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Loan
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.7.0 <0.9.0; import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; // 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 loanMaxEth; uint256 public loanMinEth; uint256 public totalLoaned; uint256 public currentLoaned; uint256 public totalInterestCollected; uint256 public totalLiquidatedCollateral; uint256 public nativeTokenMin; address public nativeTokenAddress; address public operator; address public ETHUSD_PRICEFEED; struct LoanPool { uint256 loanLimit; uint256 loanLimitNative; uint256 repayRate; uint256 repayRateNative; uint256 liquidateRate; bool closed; } struct LoanRequest { address borrower; address token; uint256 borrowedPrice; uint256 loanAmount; uint256 collateralAmount; uint256 paybackAmount; uint256 loanId; uint256 liquidateRate; bool isPayback; bool isLiquidated; } uint256 public lastSwapTs; uint256 public loansCount = 0; mapping(address => address[]) public swapPaths; mapping(address => uint256) public userTotalLoaned; mapping(address => uint256) public userTotalPayback; mapping(address => uint256) public userLoansCount; mapping(address => mapping(uint256 => uint256)) public userLoanIds; mapping(uint256 => LoanRequest) public totalLoans; address[] public collateralTokens; address[] public loanUsers; mapping(address => LoanPool) public loanPools; IUniswapV2Router02 public immutable uniswapV2Router; event NewAddLoanPool( address collateralToken, uint256 loanLimit, uint256 loanLimitNative, uint256 repayRate, uint256 repayRateNative, uint256 liquidateRate ); event NewLoanEther( address indexed borrower, uint256 collateralTokenPrice, uint256 loanAmount, uint256 collateralAmount, uint256 paybackAmount ); event PayBack( address borrower, bool paybackSuccess, uint256 paybackTime, uint256 paybackAmount, uint256 returnCollateralAmount ); event Received(address, uint256); event UpdatePairToken(address collateralToken, address[] swapPath); constructor( address _routerAddress, address _ethUSDPriceFeed, address _nativeTokenAddress, uint256 _nativeMin ) { loanMaxEth = 10 ** 18; loanMinEth = 10 ** 17; nativeTokenMin = _nativeMin; nativeTokenAddress = _nativeTokenAddress; operator = msg.sender; IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02( _routerAddress ); uniswapV2Router = _uniswapV2Router; ETHUSD_PRICEFEED = _ethUSDPriceFeed; } // 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 _loanLimit, uint256 _loanLimitNative, uint256 _repayRate, uint256 _repayRateNative, uint256 _liquidateRate, 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: should be over 100%"); require(_repayRateNative >= 100, "add: should be over 100%"); bool isColToken = isCollateralToken(_collateralToken); if (!isColToken) { collateralTokens.push(_collateralToken); swapPaths[_collateralToken] = _path; } LoanPool memory newLoanPool; newLoanPool.loanLimit = _loanLimit; newLoanPool.loanLimitNative = _loanLimitNative; newLoanPool.repayRate = _repayRate; newLoanPool.repayRateNative = _repayRateNative; newLoanPool.liquidateRate = _liquidateRate; newLoanPool.closed = false; loanPools[_collateralToken] = newLoanPool; emit NewAddLoanPool( _collateralToken, _loanLimit, _loanLimitNative, _repayRate, _repayRateNative, _liquidateRate ); } function updateLoanPool( address _collateralToken, uint256 _loanLimit, uint256 _loanLimitNative, uint256 _repayRate, uint256 _repayRateNative, uint256 _liquidateRate ) public onlyOwner { require( _collateralToken != address(0), "update: Zero collateral address" ); bool isColToken = isCollateralToken(_collateralToken); require(isColToken, "update: No collateral token"); require(_loanLimit < 100, "add: Can't over 100% limit"); require(_loanLimitNative < 100, "add: Can't over 100% limit"); require(_repayRate >= 100, "add: repayRate should be over 100%"); require(_repayRateNative >= 100, "add: repayRateNative should be over 100%"); loanPools[_collateralToken].loanLimit = _loanLimit; loanPools[_collateralToken].loanLimitNative = _loanLimitNative; loanPools[_collateralToken].repayRate = _repayRate; loanPools[_collateralToken].repayRateNative = _repayRateNative; loanPools[_collateralToken].liquidateRate = _liquidateRate; } 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, bool _closed ) public onlyOwner { require( _collateralToken != address(0), "update: Zero collateral address" ); bool isColToken = isCollateralToken(_collateralToken); require(isColToken, "update: No collateral token"); loanPools[_collateralToken].closed = _closed; } function updateLoanPoolLiquidate( address _collateralToken, uint256 _liquidateRate ) public onlyOwner { require( _collateralToken != address(0), "update: Zero collateral address" ); bool isColToken = isCollateralToken(_collateralToken); require(isColToken, "update: No collateral token"); loanPools[_collateralToken].liquidateRate = _liquidateRate; } 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 _loanMaxEth, uint256 _loanMinEth) public onlyOwner { loanMaxEth = _loanMaxEth; loanMinEth = _loanMinEth; } function getETHPrice() public view returns (uint256) { AggregatorV3Interface priceFeed = AggregatorV3Interface( ETHUSD_PRICEFEED ); ( , /*uint80 roundID*/ int256 price, /*uint startedAt*/ /*uint timeStamp*/ /*uint80 answeredInRound*/ , , ) = priceFeed.latestRoundData(); return uint256(price); } function getTokenPrice(address _token) public view returns(uint256) { address[] memory path = swapPaths[_token]; uint256[] memory amounts = new uint256[](path.length); uint256 tokenDecimals = IERC20(_token).decimals(); uint256 OneTokenAmount = 10 ** (tokenDecimals); amounts = uniswapV2Router.getAmountsOut(OneTokenAmount, path); uint256 ethAmount = amounts[path.length - 1]; uint256 ethPrice = getETHPrice(); uint256 tokenPrice = ethAmount.mul(ethPrice).div(10 ** 8); return tokenPrice; } // 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 checkLoanEthLimit(uint256 _amount) public view returns (bool) { uint256 totalEth = address(this).balance; if (_amount <= loanMaxEth && _amount > loanMinEth && _amount < totalEth) { return true; } else { return false; } } 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 _colTokenAmount ) public nonReentrant { bool isColToken = isCollateralToken(_collateralToken); require(isColToken, "loanEther: No collateral token"); uint256 colTokenAmount = _colTokenAmount; address collateralToken = _collateralToken; require( !loanPools[_collateralToken].closed, "loanEther: Loan Pool is closed" ); uint256 balance = IERC20(collateralToken).balanceOf(msg.sender); require(balance > colTokenAmount, "loanEther: not enough token balance"); bool isHolder = isNativeTokenHolder(msg.sender); uint256 limit = !isHolder ? loanPools[collateralToken].loanLimit : loanPools[collateralToken].loanLimitNative; uint256 beforeBalance = IERC20(collateralToken).balanceOf( address(this) ); require( TokenTransfer(msg.sender, collateralToken, colTokenAmount), "loanEther: Transfer token from user to contract failed" ); uint256 afterBalance = IERC20(collateralToken).balanceOf(address(this)); uint256 colTokenAmountReal = afterBalance - beforeBalance; uint256 ethAmountReal = countEtherFromCollateral( collateralToken, limit, colTokenAmountReal ); 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( checkLoanEthLimit(ethAmountReal), "loanEther: not enough liquidity or can't borrow limited ETH amount" ); uint256 tokenPrice = getTokenPrice(collateralToken); LoanRequest memory newLoan; newLoan.borrower = msg.sender; newLoan.token = collateralToken; newLoan.borrowedPrice = tokenPrice; newLoan.loanAmount = ethAmountReal; newLoan.collateralAmount = colTokenAmountReal; newLoan.loanId = loansCount; newLoan.isPayback = false; newLoan.isLiquidated = false; LoanPool memory temploanPool = loanPools[collateralToken]; uint256 repayRate = temploanPool.repayRate; uint256 repayRateNative = temploanPool.repayRateNative; newLoan.liquidateRate = temploanPool.liquidateRate; uint256 paybackAmountTemp = 0; if(isHolder) { paybackAmountTemp = ethAmountReal.mul(repayRateNative).div(100); } else { paybackAmountTemp = ethAmountReal.mul(repayRate).div(100); } newLoan.paybackAmount = paybackAmountTemp; totalLoans[loansCount] = newLoan; uint256 tempId = userLoansCount[msg.sender]; userLoanIds[msg.sender][tempId] = loansCount; userTotalLoaned[msg.sender] = userTotalLoaned[msg.sender].add(ethAmountReal); totalLoaned = totalLoaned.add(ethAmountReal); currentLoaned = currentLoaned.add(ethAmountReal); userLoansCount[msg.sender]++; loansCount++; payable(msg.sender).transfer(ethAmountReal); emit NewLoanEther( msg.sender, tokenPrice, newLoan.loanAmount, newLoan.collateralAmount, newLoan.paybackAmount ); } function payback(uint256 _id) public payable nonReentrant { LoanRequest storage loanReq = totalLoans[_id]; address collateralToken = loanReq.token; require( loanReq.borrower == msg.sender, "payback: Only borrower can payback" ); require(!loanReq.isLiquidated, "payback: liquidate already"); require(!loanReq.isPayback, "payback: payback already"); require( msg.value >= loanReq.paybackAmount, "payback: Not enough ether" ); loanReq.isPayback = true; currentLoaned = currentLoaned.sub(loanReq.loanAmount); totalInterestCollected = totalInterestCollected.add(loanReq.paybackAmount).sub(loanReq.loanAmount); userTotalPayback[msg.sender] = userTotalPayback[msg.sender].add(loanReq.paybackAmount); 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 liquidate(uint256 _id) public onlyOwnerOrOperator { LoanRequest storage loanReq = totalLoans[_id]; require(!loanReq.isLiquidated, "liquidate: liquidate already"); require(!loanReq.isPayback, "liquidate: payback already"); address collateralToken = loanReq.token; uint256 borrowedPrice = loanReq.borrowedPrice; uint256 currentPrice = getTokenPrice(collateralToken); uint256 tokenAmount = loanReq.collateralAmount; uint256 liquidateRate = loanReq.liquidateRate; require(currentPrice <= borrowedPrice.mul(liquidateRate).div(100), "liquidate:: price is not dropped"); IERC20(collateralToken).approve(address(uniswapV2Router),tokenAmount); address[] memory path = swapPaths[collateralToken]; uint256 beforeEthBalance = address(this).balance; uniswapV2Router .swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); uint256 afterEthBalance = address(this).balance; totalLiquidatedCollateral = totalLiquidatedCollateral.add(afterEthBalance).sub(beforeEthBalance); loanReq.isLiquidated = true; } function getAllUserLoans(address _user) public view returns (LoanRequest[] memory) { LoanRequest[] memory requests = new LoanRequest[]( userLoansCount[_user] ); for (uint256 i = 0; i < userLoansCount[_user]; i++) { uint256 _loanId = userLoanIds[_user][i]; requests[i] = totalLoans[_loanId]; } return requests; } function getLoanByIndex(uint256 _index) public view returns(LoanRequest memory) { LoanRequest storage loanReq = totalLoans[_index]; return loanReq; } function getUserLoanByIndex(address _user, uint256 _index) public view returns(LoanRequest memory) { uint256 tempUserLoanId = userLoanIds[_user][_index]; LoanRequest storage loanReq = totalLoans[tempUserLoanId]; return loanReq; } 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(msg.sender); _owner.transfer(_amount); } function emergencyWithdrawToken(address _token, uint256 _amount) external onlyOwnerOrOperator { IERC20(_token).transfer(msg.sender, _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; } function getTotalLoanedUsers() public view returns (uint256) { return loanUsers.length; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_routerAddress","type":"address"},{"internalType":"address","name":"_ethUSDPriceFeed","type":"address"},{"internalType":"address","name":"_nativeTokenAddress","type":"address"},{"internalType":"uint256","name":"_nativeMin","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"loanLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loanLimitNative","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"repayRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"repayRateNative","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidateRate","type":"uint256"}],"name":"NewAddLoanPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"collateralTokenPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loanAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paybackAmount","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":[],"name":"ETHUSD_PRICEFEED","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_loanLimit","type":"uint256"},{"internalType":"uint256","name":"_loanLimitNative","type":"uint256"},{"internalType":"uint256","name":"_repayRate","type":"uint256"},{"internalType":"uint256","name":"_repayRateNative","type":"uint256"},{"internalType":"uint256","name":"_liquidateRate","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"addLoanPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"checkLoanEthLimit","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":[],"name":"currentLoaned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyWithdrawToken","outputs":[],"stateMutability":"nonpayable","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":"borrowedPrice","type":"uint256"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"uint256","name":"liquidateRate","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"},{"internalType":"bool","name":"isLiquidated","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":"getETHPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getLoanByIndex","outputs":[{"components":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"borrowedPrice","type":"uint256"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"uint256","name":"liquidateRate","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"},{"internalType":"bool","name":"isLiquidated","type":"bool"}],"internalType":"struct Loan.LoanRequest","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalLoanedUsers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getUserLoanByIndex","outputs":[{"components":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"borrowedPrice","type":"uint256"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"uint256","name":"liquidateRate","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"},{"internalType":"bool","name":"isLiquidated","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":"lastSwapTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"liquidate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_colTokenAmount","type":"uint256"}],"name":"loanEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"loanMaxEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"loanMinEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"loanPools","outputs":[{"internalType":"uint256","name":"loanLimit","type":"uint256"},{"internalType":"uint256","name":"loanLimitNative","type":"uint256"},{"internalType":"uint256","name":"repayRate","type":"uint256"},{"internalType":"uint256","name":"repayRateNative","type":"uint256"},{"internalType":"uint256","name":"liquidateRate","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":[],"name":"loansCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"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":"bool","name":"_closed","type":"bool"}],"name":"setLoanPoolClose","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":[],"name":"totalInterestCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLiquidatedCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLoaned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalLoans","outputs":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"borrowedPrice","type":"uint256"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"uint256","name":"liquidateRate","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"},{"internalType":"bool","name":"isLiquidated","type":"bool"}],"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":"_loanMaxEth","type":"uint256"},{"internalType":"uint256","name":"_loanMinEth","type":"uint256"}],"name":"updateEthLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_loanLimit","type":"uint256"},{"internalType":"uint256","name":"_loanLimitNative","type":"uint256"},{"internalType":"uint256","name":"_repayRate","type":"uint256"},{"internalType":"uint256","name":"_repayRateNative","type":"uint256"},{"internalType":"uint256","name":"_liquidateRate","type":"uint256"}],"name":"updateLoanPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_liquidateRate","type":"uint256"}],"name":"updateLoanPoolLiquidate","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"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userLoanIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userLoansCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userTotalLoaned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userTotalPayback","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
60a06040526000600d553480156200001657600080fd5b5060405162003ebe38038062003ebe8339810160408190526200003991620000f8565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060018055670de0b6b3a764000060025567016345785d8a0000600355600855600980546001600160a01b03199081166001600160a01b0393841617909155600a805433908316179055928116608052600b805490931691161790556200014a565b80516001600160a01b0381168114620000f357600080fd5b919050565b600080600080608085870312156200010f57600080fd5b6200011a85620000db565b93506200012a60208601620000db565b92506200013a60408601620000db565b6060959095015193969295505050565b608051613d35620001896000396000818161039901528181611c3401528181611d3901528181612b6701528181612d430152612fbe0152613d356000f3fe6080604052600436106103035760003560e01c80635df94fb711610190578063a803180d116100dc578063e31323ac11610095578063f2fde38b1161006f578063f2fde38b14610a72578063f4b01e4e14610a92578063f4b6b9e514610ab2578063f891539114610ac857600080fd5b8063e31323ac14610965578063ed921a141461097b578063ef03f1cd1461099b57600080fd5b8063a803180d146108b2578063a846c2fd146108d2578063b8118bbe146108e5578063c311d04914610905578063d02641a014610925578063db8bb3a11461094557600080fd5b80638da5cb5b116101495780639f4749af116101235780639f4749af14610852578063a007945e14610868578063a4c3b0911461087d578063a607a8d91461089d57600080fd5b80638da5cb5b146107fe5780639d11ed751461081c5780639e8c708e1461083257600080fd5b80635df94fb71461075e578063679909ce1461077357806367f7b06f146107935780636f783313146107b3578063715018a6146107c9578063888eb1ee146107de57600080fd5b806340983c961161024f57806348defde3116102085780634d0047ee116101e25780634d0047ee146106e85780634e509f7414610708578063570ca7351461071e5780635a8ff7321461073e57600080fd5b806348defde3146106565780634a47696b1461068e5780634c0a79fb146106bb57600080fd5b806340983c9614610583578063415f1240146105a3578063442ef8e7146105c357806344b8044a146105f057806345fd8dfa146106205780634766162c1461063657600080fd5b806329605e77116102bc578063350378601161029657806335037860146104b857806335c7e9251461053a5780633a838c2a1461054d5780633c7e19061461056357600080fd5b806329605e77146104555780632cd1d250146104755780632f759d911461048b57600080fd5b80631137a536146103475780631694505e14610387578063172c48c7146103d35780631846ba56146103f357806324350de314610415578063274dca921461043557600080fd5b3661034257604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b34801561035357600080fd5b50610374610362366004613403565b600f6020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561039357600080fd5b506103bb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161037e565b3480156103df57600080fd5b506103bb6103ee36600461341e565b610ae8565b3480156103ff57600080fd5b5061041361040e366004613437565b610b12565b005b34801561042157600080fd5b50610413610430366004613461565b6112dc565b34801561044157600080fd5b506104136104503660046134ab565b611489565b34801561046157600080fd5b50610413610470366004613403565b6114be565b34801561048157600080fd5b5061037460085481565b34801561049757600080fd5b506104ab6104a6366004613403565b611559565b60405161037e919061355a565b3480156104c457600080fd5b5061050b6104d3366004613403565b601660205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909160ff1686565b6040805196875260208701959095529385019290925260608401526080830152151560a082015260c00161037e565b34801561054657600080fd5b5047610374565b34801561055957600080fd5b5061037460045481565b34801561056f57600080fd5b5061041361057e3660046135ba565b6116d4565b34801561058f57600080fd5b5061041361059e3660046136ce565b61177d565b3480156105af57600080fd5b506104136105be36600461341e565b611a94565b3480156105cf57600080fd5b506103746105de366004613403565b60106020526000908152604090205481565b3480156105fc57600080fd5b5061061061060b36600461341e565b611de7565b604051901515815260200161037e565b34801561062c57600080fd5b5061037460075481565b34801561064257600080fd5b50610610610651366004613403565b611e21565b34801561066257600080fd5b50610374610671366004613437565b601260209081526000928352604080842090915290825290205481565b34801561069a57600080fd5b506106ae6106a9366004613437565b611e87565b60405161037e919061374c565b3480156106c757600080fd5b506103746106d6366004613403565b60116020526000908152604090205481565b3480156106f457600080fd5b506009546103bb906001600160a01b031681565b34801561071457600080fd5b5061037460035481565b34801561072a57600080fd5b50600a546103bb906001600160a01b031681565b34801561074a57600080fd5b50610413610759366004613437565b611f43565b34801561076a57600080fd5b50601554610374565b34801561077f57600080fd5b506106ae61078e36600461341e565b611fdd565b34801561079f57600080fd5b506104136107ae366004613437565b612081565b3480156107bf57600080fd5b5061037460065481565b3480156107d557600080fd5b50610413612127565b3480156107ea57600080fd5b506104136107f936600461375b565b61219b565b34801561080a57600080fd5b506000546001600160a01b03166103bb565b34801561082857600080fd5b50610374600d5481565b34801561083e57600080fd5b5061041361084d366004613403565b61227d565b34801561085e57600080fd5b5061037460025481565b34801561087457600080fd5b50601454610374565b34801561088957600080fd5b50610413610898366004613437565b6123db565b3480156108a957600080fd5b50610374612490565b3480156108be57600080fd5b506103bb6108cd36600461341e565b61250e565b6104136108e036600461341e565b61251e565b3480156108f157600080fd5b50610610610900366004613403565b6128c3565b34801561091157600080fd5b5061041361092036600461341e565b61294a565b34801561093157600080fd5b50610374610940366004613403565b612a21565b34801561095157600080fd5b506103bb610960366004613437565b612c3d565b34801561097157600080fd5b50610374600c5481565b34801561098757600080fd5b506103746109963660046137a9565b612c75565b3480156109a757600080fd5b50610a196109b636600461341e565b6013602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460078801546008909801546001600160a01b039788169897909616969495939492939192909160ff808216916101009004168a565b604080516001600160a01b039b8c1681529a90991660208b0152978901969096526060880194909452608087019290925260a086015260c085015260e0840152151561010083015215156101208201526101400161037e565b348015610a7e57600080fd5b50610413610a8d366004613403565b612e06565b348015610a9e57600080fd5b50600b546103bb906001600160a01b031681565b348015610abe57600080fd5b5061037460055481565b348015610ad457600080fd5b50610374610ae33660046137a9565b612ef0565b60148181548110610af857600080fd5b6000918252602090912001546001600160a01b0316905081565b600260015403610b695760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026001556000610b7983611e21565b905080610bc85760405162461bcd60e51b815260206004820152601e60248201527f6c6f616e45746865723a204e6f20636f6c6c61746572616c20746f6b656e00006044820152606401610b60565b6001600160a01b0383166000908152601660205260409020600501548290849060ff1615610c385760405162461bcd60e51b815260206004820152601e60248201527f6c6f616e45746865723a204c6f616e20506f6f6c20697320636c6f73656400006044820152606401610b60565b6040516370a0823160e01b81523360048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610c7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca391906137dc565b9050828111610d005760405162461bcd60e51b815260206004820152602360248201527f6c6f616e45746865723a206e6f7420656e6f75676820746f6b656e2062616c616044820152626e636560e81b6064820152608401610b60565b6000610d0b336128c3565b905060008115610d36576001600160a01b038416600090815260166020526040902060010154610d50565b6001600160a01b0384166000908152601660205260409020545b6040516370a0823160e01b81523060048201529091506000906001600160a01b038616906370a0823190602401602060405180830381865afa158015610d9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbe91906137dc565b9050610dcb33868861307c565b610e365760405162461bcd60e51b815260206004820152603660248201527f6c6f616e45746865723a205472616e7366657220746f6b656e2066726f6d20756044820152751cd95c881d1bc818dbdb9d1c9858dd0819985a5b195960521b6064820152608401610b60565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a0823190602401602060405180830381865afa158015610e7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea191906137dc565b90506000610eaf838361380b565b90506000610ebe888684612ef0565b90506000805b601554811015610f2057336001600160a01b031660158281548110610eeb57610eeb61381e565b6000918252602090912001546001600160a01b031603610f0e5760019150610f20565b80610f1881613834565b915050610ec4565b50801515600003610f6e57601580546001810182556000919091527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750180546001600160a01b031916331790555b610f7782611de7565b610ff45760405162461bcd60e51b815260206004820152604260248201527f6c6f616e45746865723a206e6f7420656e6f756768206c69717569646974792060448201527f6f722063616e277420626f72726f77206c696d697465642045544820616d6f756064820152611b9d60f21b608482015260a401610b60565b6000610fff8a612a21565b9050611009613304565b3381526001600160a01b038b1660208083018290526040808401859052606080850188905260808086018a9052600d5460c08088019190915260006101008801819052610120880181905295865260168552838620845191820185528054825260018101549582019590955260028501549381018490526003850154928101839052600485015491810182905260059094015460ff16151560a085015260e086015291929091908c156110d2576110cb60646110c58a85613103565b9061318c565b90506110e4565b6110e160646110c58a86613103565b90505b60a08501818152600d805460009081526013602090815260408083208a5181546001600160a01b039182166001600160a01b0319918216178355848d0151600184018054919093169116179055818b0151600282015560608b0151600382015560808b015160048201559451600586015560c08a0151600686015560e08a01516007860155610100808b0151600890960180546101208d0151151590920261ff00199715159790971661ffff1990921691909117959095179094553380835260118252848320549354601283528584208585528352858420558252600f905291909120546111d2908a6131ce565b336000908152600f60205260409020556004546111ef908a6131ce565b6004556005546111ff908a6131ce565b60055533600090815260116020526040812080549161121d83613834565b9091555050600d805490600061123283613834565b909155505060405133908a156108fc02908b906000818181858888f19350505050158015611264573d6000803e3d6000fd5b506060860151608087015160a088015160405133937f95557a73cb6105ae8e591a83242fc3c4ae4366289878d6213937ab0f6b5d20af936112ba938d845260208401929092526040830152606082015260800190565b60405180910390a2505060018055505050505050505050505050505050505050565b6000546001600160a01b031633146113065760405162461bcd60e51b8152600401610b609061384d565b6001600160a01b03861661132c5760405162461bcd60e51b8152600401610b6090613882565b600061133787611e21565b9050806113565760405162461bcd60e51b8152600401610b60906138b9565b606486106113765760405162461bcd60e51b8152600401610b60906138f0565b606485106113965760405162461bcd60e51b8152600401610b60906138f0565b60648410156113f25760405162461bcd60e51b815260206004820152602260248201527f6164643a207265706179526174652073686f756c64206265206f766572203130604482015261302560f01b6064820152608401610b60565b60648310156114545760405162461bcd60e51b815260206004820152602860248201527f6164643a207265706179526174654e61746976652073686f756c64206265206f604482015267766572203130302560c01b6064820152608401610b60565b506001600160a01b03909516600090815260166020526040902093845560018401929092556002830155600382015560040155565b6000546001600160a01b031633146114b35760405162461bcd60e51b8152600401610b609061384d565b600291909155600355565b6000546001600160a01b031633146114e85760405162461bcd60e51b8152600401610b609061384d565b6001600160a01b0381166115375760405162461bcd60e51b81526020600482015260166024820152756f70657261746f723a205a65726f204164647265737360501b6044820152606401610b60565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152601160205260408120546060919067ffffffffffffffff81111561158e5761158e6135f1565b6040519080825280602002602001820160405280156115c757816020015b6115b4613304565b8152602001906001900390816115ac5790505b50905060005b6001600160a01b0384166000908152601160205260409020548110156116cd576001600160a01b03808516600090815260126020908152604080832085845282528083205480845260138352928190208151610140810183528154861681526001820154909516928501929092526002820154908401526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e08401526008015460ff80821615156101008086019190915290910416151561012083015283519091908490849081106116ae576116ae61381e565b60200260200101819052505080806116c590613834565b9150506115cd565b5092915050565b6000546001600160a01b031633146116fe5760405162461bcd60e51b8152600401610b609061384d565b6001600160a01b0382166117245760405162461bcd60e51b8152600401610b6090613882565b600061172f83611e21565b90508061174e5760405162461bcd60e51b8152600401610b60906138b9565b506001600160a01b03919091166000908152601660205260409020600501805460ff1916911515919091179055565b6000546001600160a01b031633146117a75760405162461bcd60e51b8152600401610b609061384d565b6001600160a01b0387166117cd5760405162461bcd60e51b8152600401610b6090613882565b606486106117ed5760405162461bcd60e51b8152600401610b60906138f0565b6064851061180d5760405162461bcd60e51b8152600401610b60906138f0565b60648410156118595760405162461bcd60e51b81526020600482015260186024820152776164643a2073686f756c64206265206f766572203130302560401b6044820152606401610b60565b60648310156118a55760405162461bcd60e51b81526020600482015260186024820152776164643a2073686f756c64206265206f766572203130302560401b6044820152606401610b60565b60006118b088611e21565b9050806119215760148054600181019091557fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0180546001600160a01b0319166001600160a01b038a169081179091556000908152600e60209081526040909120835161191f9285019061336d565b505b61195c6040518060c0016040528060008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b878160000181815250508681602001818152505085816040018181525050848160600181815250508381608001818152505060008160a001901515908115158152505080601660008b6001600160a01b03166001600160a01b03168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff0219169083151502179055509050507fe66ffeb1a36b4cb72d79e9b98aed4a5a24f864c02ac86bb5b53a6a6a39b3b5f1898989898989604051611a81969594939291906001600160a01b03969096168652602086019490945260408501929092526060840152608083015260a082015260c00190565b60405180910390a1505050505050505050565b6000546001600160a01b0316331480611ab75750600a546001600160a01b031633145b611ad35760405162461bcd60e51b8152600401610b6090613927565b60008181526013602052604090206008810154610100900460ff1615611b3b5760405162461bcd60e51b815260206004820152601c60248201527f6c69717569646174653a206c697175696461746520616c7265616479000000006044820152606401610b60565b600881015460ff1615611b905760405162461bcd60e51b815260206004820152601a60248201527f6c69717569646174653a207061796261636b20616c72656164790000000000006044820152606401610b60565b600181015460028201546001600160a01b03909116906000611bb183612a21565b6004850154600786015491925090611bce60646110c58684613103565b831115611c1d5760405162461bcd60e51b815260206004820181905260248201527f6c69717569646174653a3a207072696365206973206e6f742064726f707065646044820152606401610b60565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820184905286169063095ea7b3906044016020604051808303816000875af1158015611c8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb09190613956565b506001600160a01b0385166000908152600e6020908152604080832080548251818502810185019093528083529192909190830182828015611d1b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611cfd575b505060405163791ac94760e01b815293945047936001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016935063791ac9479250611d7a915087906000908790309042906004016139b7565b600060405180830381600087803b158015611d9457600080fd5b505af1158015611da8573d6000803e3d6000fd5b5050600754479250611dc791508390611dc190846131ce565b9061322d565b6007555050506008909501805461ff001916610100179055505050505050565b60025460009047908311801590611dff575060035483115b8015611e0a57508083105b15611e185750600192915050565b50600092915050565b60145460009081805b82811015611e7f5760148181548110611e4557611e4561381e565b6000918252602090912001546001600160a01b0390811690861603611e6d5760019150611e7f565b80611e7781613834565b915050611e2a565b509392505050565b611e8f613304565b506001600160a01b038083166000908152601260209081526040808320858452825280832054835260138252918290208251610140810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff8082161515610100808501919091529091041615156101208201525b92915050565b6000546001600160a01b03163314611f6d5760405162461bcd60e51b8152600401610b609061384d565b6001600160a01b038216611f935760405162461bcd60e51b8152600401610b6090613882565b6000611f9e83611e21565b905080611fbd5760405162461bcd60e51b8152600401610b60906138b9565b506001600160a01b03909116600090815260166020526040902060040155565b611fe5613304565b5060009081526013602090815260409182902082516101408101845281546001600160a01b039081168252600183015416928101929092526002810154928201929092526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260089091015460ff80821615156101008085019190915290910416151561012082015290565b6000546001600160a01b031633146120ab5760405162461bcd60e51b8152600401610b609061384d565b6001600160a01b0382166121015760405162461bcd60e51b815260206004820152601a60248201527f6e61746976653a207a65726f20746f6b656e20616464726573730000000000006044820152606401610b60565b600980546001600160a01b0319166001600160a01b039390931692909217909155600855565b6000546001600160a01b031633146121515760405162461bcd60e51b8152600401610b609061384d565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146121c55760405162461bcd60e51b8152600401610b609061384d565b6001600160a01b0382166121eb5760405162461bcd60e51b8152600401610b6090613882565b60006121f683611e21565b9050806122155760405162461bcd60e51b8152600401610b60906138b9565b6001600160a01b0383166000908152600e60209081526040909120835161223e9285019061336d565b507f078e8a4737553c8d944056c4087a42039847a7c1ed868d8c0e5d82a224f94f5883836040516122709291906139f3565b60405180910390a1505050565b600a546001600160a01b031633146122e35760405162461bcd60e51b8152602060048201526024808201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260448201526330ba37b960e11b6064820152608401610b60565b60006122ee82611e21565b9050806123d7576040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561233c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236091906137dc565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0384169063a9059cbb906044016020604051808303816000875af11580156123b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d49190613956565b50505b5050565b6000546001600160a01b03163314806123fe5750600a546001600160a01b031633145b61241a5760405162461bcd60e51b8152600401610b6090613927565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015612467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248b9190613956565b505050565b600b5460408051633fabe5a360e21b815290516000926001600160a01b0316918391839163feaf968c9160048083019260a09291908290030181865afa1580156124de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125029190613a31565b50919695505050505050565b60158181548110610af857600080fd5b6002600154036125705760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b60565b6002600190815560008281526013602052604090209081015481546001600160a01b03918216911633146125f15760405162461bcd60e51b815260206004820152602260248201527f7061796261636b3a204f6e6c7920626f72726f7765722063616e207061796261604482015261636b60f01b6064820152608401610b60565b6008820154610100900460ff161561264b5760405162461bcd60e51b815260206004820152601a60248201527f7061796261636b3a206c697175696461746520616c72656164790000000000006044820152606401610b60565b600882015460ff16156126a05760405162461bcd60e51b815260206004820152601860248201527f7061796261636b3a207061796261636b20616c726561647900000000000000006044820152606401610b60565b81600501543410156126f45760405162461bcd60e51b815260206004820152601960248201527f7061796261636b3a204e6f7420656e6f756768206574686572000000000000006044820152606401610b60565b60088201805460ff1916600117905560038201546005546127149161322d565b60058190555061273b8260030154611dc184600501546006546131ce90919063ffffffff16565b60065560058201543360009081526010602052604090205461275c916131ce565b336000818152601060205260409081902092909255600484810154925163a9059cbb60e01b81529081019190915260248101919091526001600160a01b0382169063a9059cbb906044016020604051808303816000875af11580156127c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e99190613956565b61285b5760405162461bcd60e51b815260206004820152603960248201527f7061796261636b3a205472616e7366657220636f6c6c61746572616c2066726f60448201527f6d20636f6e747261637420746f2075736572206661696c6564000000000000006064820152608401610b60565b6008820154600583015460048401546040805133815260ff90941615156020850152428482015260608401929092526080830152517ff022a4d91d174959862c530aa30a63411b4f0e37186283bd5fc0000acc217a859181900360a00190a150506001805550565b6009546040516370a0823160e01b81526001600160a01b03838116600483015260009283929116906370a0823190602401602060405180830381865afa158015612911573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293591906137dc565b9050600854811115611e185750600192915050565b6000546001600160a01b031633148061296d5750600a546001600160a01b031633145b6129895760405162461bcd60e51b8152600401610b6090613927565b47808211156129f25760405162461bcd60e51b815260206004820152602f60248201527f77697468647261773a2043616e277420657863656564206d6f7265207468616e60448201526e20746f74616c4c697175696469747960881b6064820152608401610b60565b6040513390819084156108fc029085906000818181858888f193505050501580156123d4573d6000803e3d6000fd5b6001600160a01b0381166000908152600e6020908152604080832080548251818502810185019093528083528493830182828015612a8857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612a6a575b505050505090506000815167ffffffffffffffff811115612aab57612aab6135f1565b604051908082528060200260200182016040528015612ad4578160200160208202803683370190505b5090506000846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3b9190613a81565b60ff1690506000612b4d82600a613b88565b60405163d06ca61f60e01b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d06ca61f90612b9e9084908890600401613b94565b600060405180830381865afa158015612bbb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612be39190810190613bad565b925060008360018651612bf6919061380b565b81518110612c0657612c0661381e565b602002602001015190506000612c1a612490565b90506000612c306305f5e1006110c58585613103565b9998505050505050505050565b600e6020528160005260406000208181548110612c5957600080fd5b6000918252602090912001546001600160a01b03169150829050565b6001600160a01b0383166000908152600e6020908152604080832080548251818502810185019093528083528493830182828015612cdc57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612cbe575b505050505090506000815167ffffffffffffffff811115612cff57612cff6135f1565b604051908082528060200260200182016040528015612d28578160200160208202803683370190505b506040516307c0329d60e21b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631f00ca7490612d7a9087908690600401613b94565b600060405180830381865afa158015612d97573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612dbf9190810190613bad565b90506000612dfb6064612df58885600081518110612ddf57612ddf61381e565b602002602001015161318c90919063ffffffff16565b90613103565b979650505050505050565b6000546001600160a01b03163314612e305760405162461bcd60e51b8152600401610b609061384d565b6001600160a01b038116612e955760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b60565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166000908152600e6020908152604080832080548251818502810185019093528083528493830182828015612f5757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612f39575b505050505090506000815167ffffffffffffffff811115612f7a57612f7a6135f1565b604051908082528060200260200182016040528015612fa3578160200160208202803683370190505b5060405163d06ca61f60e01b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d06ca61f90612ff59087908690600401613b94565b600060405180830381865afa158015613012573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261303a9190810190613bad565b90506000612dfb60646110c5888560018851613056919061380b565b815181106130665761306661381e565b602002602001015161310390919063ffffffff16565b6040516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820183905260009182918516906323b872dd906064016020604051808303816000875af11580156130d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130fa9190613956565b95945050505050565b60008260000361311557506000611f3d565b60006131218385613c33565b90508261312e8583613c60565b146131855760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b60565b9392505050565b600061318583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061326f565b6000806131db8385613c74565b9050838110156131855760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b60565b600061318583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506132d3565b600081836132905760405162461bcd60e51b8152600401610b609190613c87565b50600061329d8486613c60565b90506132a98486613cd5565b6132b38286613c33565b6132bd9190613c74565b85146132cb576132cb613ce9565b949350505050565b600081848411156132f75760405162461bcd60e51b8152600401610b609190613c87565b5060006130fa848661380b565b60405180610140016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090565b8280548282559060005260206000209081019282156133c2579160200282015b828111156133c257825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061338d565b506133ce9291506133d2565b5090565b5b808211156133ce57600081556001016133d3565b80356001600160a01b03811681146133fe57600080fd5b919050565b60006020828403121561341557600080fd5b613185826133e7565b60006020828403121561343057600080fd5b5035919050565b6000806040838503121561344a57600080fd5b613453836133e7565b946020939093013593505050565b60008060008060008060c0878903121561347a57600080fd5b613483876133e7565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b600080604083850312156134be57600080fd5b50508035926020909101359150565b80516001600160a01b0316825260208101516134f460208401826001600160a01b03169052565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e0830152610100808201516135458285018215159052565b505061012081810151801515848301526123d4565b6020808252825182820181905260009190848201906040850190845b8181101561359d576135898385516134cd565b928401926101409290920191600101613576565b50909695505050505050565b80151581146135b757600080fd5b50565b600080604083850312156135cd57600080fd5b6135d6836133e7565b915060208301356135e6816135a9565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613630576136306135f1565b604052919050565b600067ffffffffffffffff821115613652576136526135f1565b5060051b60200190565b600082601f83011261366d57600080fd5b8135602061368261367d83613638565b613607565b82815260059290921b840181019181810190868411156136a157600080fd5b8286015b848110156136c3576136b6816133e7565b83529183019183016136a5565b509695505050505050565b600080600080600080600060e0888a0312156136e957600080fd5b6136f2886133e7565b96506020880135955060408801359450606088013593506080880135925060a0880135915060c088013567ffffffffffffffff81111561373157600080fd5b61373d8a828b0161365c565b91505092959891949750929550565b6101408101611f3d82846134cd565b6000806040838503121561376e57600080fd5b613777836133e7565b9150602083013567ffffffffffffffff81111561379357600080fd5b61379f8582860161365c565b9150509250929050565b6000806000606084860312156137be57600080fd5b6137c7846133e7565b95602085013595506040909401359392505050565b6000602082840312156137ee57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115611f3d57611f3d6137f5565b634e487b7160e01b600052603260045260246000fd5b600060018201613846576138466137f5565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f7570646174653a205a65726f20636f6c6c61746572616c206164647265737300604082015260600190565b6020808252601b908201527f7570646174653a204e6f20636f6c6c61746572616c20746f6b656e0000000000604082015260600190565b6020808252601a908201527f6164643a2043616e2774206f7665722031303025206c696d6974000000000000604082015260600190565b6020808252601590820152742737ba1037bbb732b91037b91037b832b930ba37b960591b604082015260600190565b60006020828403121561396857600080fd5b8151613185816135a9565b600081518084526020808501945080840160005b838110156139ac5781516001600160a01b031687529582019590820190600101613987565b509495945050505050565b85815284602082015260a0604082015260006139d660a0830186613973565b6001600160a01b0394909416606083015250608001529392505050565b6001600160a01b03831681526040602082018190526000906132cb90830184613973565b805169ffffffffffffffffffff811681146133fe57600080fd5b600080600080600060a08688031215613a4957600080fd5b613a5286613a17565b9450602086015193506040860151925060608601519150613a7560808701613a17565b90509295509295909350565b600060208284031215613a9357600080fd5b815160ff8116811461318557600080fd5b600181815b80851115613adf578160001904821115613ac557613ac56137f5565b80851615613ad257918102915b93841c9390800290613aa9565b509250929050565b600082613af657506001611f3d565b81613b0357506000611f3d565b8160018114613b195760028114613b2357613b3f565b6001915050611f3d565b60ff841115613b3457613b346137f5565b50506001821b611f3d565b5060208310610133831016604e8410600b8410161715613b62575081810a611f3d565b613b6c8383613aa4565b8060001904821115613b8057613b806137f5565b029392505050565b60006131858383613ae7565b8281526040602082015260006132cb6040830184613973565b60006020808385031215613bc057600080fd5b825167ffffffffffffffff811115613bd757600080fd5b8301601f81018513613be857600080fd5b8051613bf661367d82613638565b81815260059190911b82018301908381019087831115613c1557600080fd5b928401925b82841015612dfb57835182529284019290840190613c1a565b8082028115828204841417611f3d57611f3d6137f5565b634e487b7160e01b600052601260045260246000fd5b600082613c6f57613c6f613c4a565b500490565b80820180821115611f3d57611f3d6137f5565b600060208083528351808285015260005b81811015613cb457858101830151858201604001528201613c98565b506000604082860101526040601f19601f8301168501019250505092915050565b600082613ce457613ce4613c4a565b500690565b634e487b7160e01b600052600160045260246000fdfea2646970667358221220145465267eaf4992ccd6077c956eb8eacdc1a3f30080ae52bb4cd9ae42cf2e6164736f6c634300081100330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419000000000000000000000000e13879194578c6f1a591a96c45b65022c43cec0700000000000000000000000000000000000000000000000000024f2beb1aa000
Deployed Bytecode
0x6080604052600436106103035760003560e01c80635df94fb711610190578063a803180d116100dc578063e31323ac11610095578063f2fde38b1161006f578063f2fde38b14610a72578063f4b01e4e14610a92578063f4b6b9e514610ab2578063f891539114610ac857600080fd5b8063e31323ac14610965578063ed921a141461097b578063ef03f1cd1461099b57600080fd5b8063a803180d146108b2578063a846c2fd146108d2578063b8118bbe146108e5578063c311d04914610905578063d02641a014610925578063db8bb3a11461094557600080fd5b80638da5cb5b116101495780639f4749af116101235780639f4749af14610852578063a007945e14610868578063a4c3b0911461087d578063a607a8d91461089d57600080fd5b80638da5cb5b146107fe5780639d11ed751461081c5780639e8c708e1461083257600080fd5b80635df94fb71461075e578063679909ce1461077357806367f7b06f146107935780636f783313146107b3578063715018a6146107c9578063888eb1ee146107de57600080fd5b806340983c961161024f57806348defde3116102085780634d0047ee116101e25780634d0047ee146106e85780634e509f7414610708578063570ca7351461071e5780635a8ff7321461073e57600080fd5b806348defde3146106565780634a47696b1461068e5780634c0a79fb146106bb57600080fd5b806340983c9614610583578063415f1240146105a3578063442ef8e7146105c357806344b8044a146105f057806345fd8dfa146106205780634766162c1461063657600080fd5b806329605e77116102bc578063350378601161029657806335037860146104b857806335c7e9251461053a5780633a838c2a1461054d5780633c7e19061461056357600080fd5b806329605e77146104555780632cd1d250146104755780632f759d911461048b57600080fd5b80631137a536146103475780631694505e14610387578063172c48c7146103d35780631846ba56146103f357806324350de314610415578063274dca921461043557600080fd5b3661034257604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b34801561035357600080fd5b50610374610362366004613403565b600f6020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561039357600080fd5b506103bb7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b03909116815260200161037e565b3480156103df57600080fd5b506103bb6103ee36600461341e565b610ae8565b3480156103ff57600080fd5b5061041361040e366004613437565b610b12565b005b34801561042157600080fd5b50610413610430366004613461565b6112dc565b34801561044157600080fd5b506104136104503660046134ab565b611489565b34801561046157600080fd5b50610413610470366004613403565b6114be565b34801561048157600080fd5b5061037460085481565b34801561049757600080fd5b506104ab6104a6366004613403565b611559565b60405161037e919061355a565b3480156104c457600080fd5b5061050b6104d3366004613403565b601660205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909160ff1686565b6040805196875260208701959095529385019290925260608401526080830152151560a082015260c00161037e565b34801561054657600080fd5b5047610374565b34801561055957600080fd5b5061037460045481565b34801561056f57600080fd5b5061041361057e3660046135ba565b6116d4565b34801561058f57600080fd5b5061041361059e3660046136ce565b61177d565b3480156105af57600080fd5b506104136105be36600461341e565b611a94565b3480156105cf57600080fd5b506103746105de366004613403565b60106020526000908152604090205481565b3480156105fc57600080fd5b5061061061060b36600461341e565b611de7565b604051901515815260200161037e565b34801561062c57600080fd5b5061037460075481565b34801561064257600080fd5b50610610610651366004613403565b611e21565b34801561066257600080fd5b50610374610671366004613437565b601260209081526000928352604080842090915290825290205481565b34801561069a57600080fd5b506106ae6106a9366004613437565b611e87565b60405161037e919061374c565b3480156106c757600080fd5b506103746106d6366004613403565b60116020526000908152604090205481565b3480156106f457600080fd5b506009546103bb906001600160a01b031681565b34801561071457600080fd5b5061037460035481565b34801561072a57600080fd5b50600a546103bb906001600160a01b031681565b34801561074a57600080fd5b50610413610759366004613437565b611f43565b34801561076a57600080fd5b50601554610374565b34801561077f57600080fd5b506106ae61078e36600461341e565b611fdd565b34801561079f57600080fd5b506104136107ae366004613437565b612081565b3480156107bf57600080fd5b5061037460065481565b3480156107d557600080fd5b50610413612127565b3480156107ea57600080fd5b506104136107f936600461375b565b61219b565b34801561080a57600080fd5b506000546001600160a01b03166103bb565b34801561082857600080fd5b50610374600d5481565b34801561083e57600080fd5b5061041361084d366004613403565b61227d565b34801561085e57600080fd5b5061037460025481565b34801561087457600080fd5b50601454610374565b34801561088957600080fd5b50610413610898366004613437565b6123db565b3480156108a957600080fd5b50610374612490565b3480156108be57600080fd5b506103bb6108cd36600461341e565b61250e565b6104136108e036600461341e565b61251e565b3480156108f157600080fd5b50610610610900366004613403565b6128c3565b34801561091157600080fd5b5061041361092036600461341e565b61294a565b34801561093157600080fd5b50610374610940366004613403565b612a21565b34801561095157600080fd5b506103bb610960366004613437565b612c3d565b34801561097157600080fd5b50610374600c5481565b34801561098757600080fd5b506103746109963660046137a9565b612c75565b3480156109a757600080fd5b50610a196109b636600461341e565b6013602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460078801546008909801546001600160a01b039788169897909616969495939492939192909160ff808216916101009004168a565b604080516001600160a01b039b8c1681529a90991660208b0152978901969096526060880194909452608087019290925260a086015260c085015260e0840152151561010083015215156101208201526101400161037e565b348015610a7e57600080fd5b50610413610a8d366004613403565b612e06565b348015610a9e57600080fd5b50600b546103bb906001600160a01b031681565b348015610abe57600080fd5b5061037460055481565b348015610ad457600080fd5b50610374610ae33660046137a9565b612ef0565b60148181548110610af857600080fd5b6000918252602090912001546001600160a01b0316905081565b600260015403610b695760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026001556000610b7983611e21565b905080610bc85760405162461bcd60e51b815260206004820152601e60248201527f6c6f616e45746865723a204e6f20636f6c6c61746572616c20746f6b656e00006044820152606401610b60565b6001600160a01b0383166000908152601660205260409020600501548290849060ff1615610c385760405162461bcd60e51b815260206004820152601e60248201527f6c6f616e45746865723a204c6f616e20506f6f6c20697320636c6f73656400006044820152606401610b60565b6040516370a0823160e01b81523360048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610c7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca391906137dc565b9050828111610d005760405162461bcd60e51b815260206004820152602360248201527f6c6f616e45746865723a206e6f7420656e6f75676820746f6b656e2062616c616044820152626e636560e81b6064820152608401610b60565b6000610d0b336128c3565b905060008115610d36576001600160a01b038416600090815260166020526040902060010154610d50565b6001600160a01b0384166000908152601660205260409020545b6040516370a0823160e01b81523060048201529091506000906001600160a01b038616906370a0823190602401602060405180830381865afa158015610d9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbe91906137dc565b9050610dcb33868861307c565b610e365760405162461bcd60e51b815260206004820152603660248201527f6c6f616e45746865723a205472616e7366657220746f6b656e2066726f6d20756044820152751cd95c881d1bc818dbdb9d1c9858dd0819985a5b195960521b6064820152608401610b60565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a0823190602401602060405180830381865afa158015610e7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea191906137dc565b90506000610eaf838361380b565b90506000610ebe888684612ef0565b90506000805b601554811015610f2057336001600160a01b031660158281548110610eeb57610eeb61381e565b6000918252602090912001546001600160a01b031603610f0e5760019150610f20565b80610f1881613834565b915050610ec4565b50801515600003610f6e57601580546001810182556000919091527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750180546001600160a01b031916331790555b610f7782611de7565b610ff45760405162461bcd60e51b815260206004820152604260248201527f6c6f616e45746865723a206e6f7420656e6f756768206c69717569646974792060448201527f6f722063616e277420626f72726f77206c696d697465642045544820616d6f756064820152611b9d60f21b608482015260a401610b60565b6000610fff8a612a21565b9050611009613304565b3381526001600160a01b038b1660208083018290526040808401859052606080850188905260808086018a9052600d5460c08088019190915260006101008801819052610120880181905295865260168552838620845191820185528054825260018101549582019590955260028501549381018490526003850154928101839052600485015491810182905260059094015460ff16151560a085015260e086015291929091908c156110d2576110cb60646110c58a85613103565b9061318c565b90506110e4565b6110e160646110c58a86613103565b90505b60a08501818152600d805460009081526013602090815260408083208a5181546001600160a01b039182166001600160a01b0319918216178355848d0151600184018054919093169116179055818b0151600282015560608b0151600382015560808b015160048201559451600586015560c08a0151600686015560e08a01516007860155610100808b0151600890960180546101208d0151151590920261ff00199715159790971661ffff1990921691909117959095179094553380835260118252848320549354601283528584208585528352858420558252600f905291909120546111d2908a6131ce565b336000908152600f60205260409020556004546111ef908a6131ce565b6004556005546111ff908a6131ce565b60055533600090815260116020526040812080549161121d83613834565b9091555050600d805490600061123283613834565b909155505060405133908a156108fc02908b906000818181858888f19350505050158015611264573d6000803e3d6000fd5b506060860151608087015160a088015160405133937f95557a73cb6105ae8e591a83242fc3c4ae4366289878d6213937ab0f6b5d20af936112ba938d845260208401929092526040830152606082015260800190565b60405180910390a2505060018055505050505050505050505050505050505050565b6000546001600160a01b031633146113065760405162461bcd60e51b8152600401610b609061384d565b6001600160a01b03861661132c5760405162461bcd60e51b8152600401610b6090613882565b600061133787611e21565b9050806113565760405162461bcd60e51b8152600401610b60906138b9565b606486106113765760405162461bcd60e51b8152600401610b60906138f0565b606485106113965760405162461bcd60e51b8152600401610b60906138f0565b60648410156113f25760405162461bcd60e51b815260206004820152602260248201527f6164643a207265706179526174652073686f756c64206265206f766572203130604482015261302560f01b6064820152608401610b60565b60648310156114545760405162461bcd60e51b815260206004820152602860248201527f6164643a207265706179526174654e61746976652073686f756c64206265206f604482015267766572203130302560c01b6064820152608401610b60565b506001600160a01b03909516600090815260166020526040902093845560018401929092556002830155600382015560040155565b6000546001600160a01b031633146114b35760405162461bcd60e51b8152600401610b609061384d565b600291909155600355565b6000546001600160a01b031633146114e85760405162461bcd60e51b8152600401610b609061384d565b6001600160a01b0381166115375760405162461bcd60e51b81526020600482015260166024820152756f70657261746f723a205a65726f204164647265737360501b6044820152606401610b60565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152601160205260408120546060919067ffffffffffffffff81111561158e5761158e6135f1565b6040519080825280602002602001820160405280156115c757816020015b6115b4613304565b8152602001906001900390816115ac5790505b50905060005b6001600160a01b0384166000908152601160205260409020548110156116cd576001600160a01b03808516600090815260126020908152604080832085845282528083205480845260138352928190208151610140810183528154861681526001820154909516928501929092526002820154908401526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e08401526008015460ff80821615156101008086019190915290910416151561012083015283519091908490849081106116ae576116ae61381e565b60200260200101819052505080806116c590613834565b9150506115cd565b5092915050565b6000546001600160a01b031633146116fe5760405162461bcd60e51b8152600401610b609061384d565b6001600160a01b0382166117245760405162461bcd60e51b8152600401610b6090613882565b600061172f83611e21565b90508061174e5760405162461bcd60e51b8152600401610b60906138b9565b506001600160a01b03919091166000908152601660205260409020600501805460ff1916911515919091179055565b6000546001600160a01b031633146117a75760405162461bcd60e51b8152600401610b609061384d565b6001600160a01b0387166117cd5760405162461bcd60e51b8152600401610b6090613882565b606486106117ed5760405162461bcd60e51b8152600401610b60906138f0565b6064851061180d5760405162461bcd60e51b8152600401610b60906138f0565b60648410156118595760405162461bcd60e51b81526020600482015260186024820152776164643a2073686f756c64206265206f766572203130302560401b6044820152606401610b60565b60648310156118a55760405162461bcd60e51b81526020600482015260186024820152776164643a2073686f756c64206265206f766572203130302560401b6044820152606401610b60565b60006118b088611e21565b9050806119215760148054600181019091557fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0180546001600160a01b0319166001600160a01b038a169081179091556000908152600e60209081526040909120835161191f9285019061336d565b505b61195c6040518060c0016040528060008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b878160000181815250508681602001818152505085816040018181525050848160600181815250508381608001818152505060008160a001901515908115158152505080601660008b6001600160a01b03166001600160a01b03168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff0219169083151502179055509050507fe66ffeb1a36b4cb72d79e9b98aed4a5a24f864c02ac86bb5b53a6a6a39b3b5f1898989898989604051611a81969594939291906001600160a01b03969096168652602086019490945260408501929092526060840152608083015260a082015260c00190565b60405180910390a1505050505050505050565b6000546001600160a01b0316331480611ab75750600a546001600160a01b031633145b611ad35760405162461bcd60e51b8152600401610b6090613927565b60008181526013602052604090206008810154610100900460ff1615611b3b5760405162461bcd60e51b815260206004820152601c60248201527f6c69717569646174653a206c697175696461746520616c7265616479000000006044820152606401610b60565b600881015460ff1615611b905760405162461bcd60e51b815260206004820152601a60248201527f6c69717569646174653a207061796261636b20616c72656164790000000000006044820152606401610b60565b600181015460028201546001600160a01b03909116906000611bb183612a21565b6004850154600786015491925090611bce60646110c58684613103565b831115611c1d5760405162461bcd60e51b815260206004820181905260248201527f6c69717569646174653a3a207072696365206973206e6f742064726f707065646044820152606401610b60565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d811660048301526024820184905286169063095ea7b3906044016020604051808303816000875af1158015611c8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb09190613956565b506001600160a01b0385166000908152600e6020908152604080832080548251818502810185019093528083529192909190830182828015611d1b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611cfd575b505060405163791ac94760e01b815293945047936001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d16935063791ac9479250611d7a915087906000908790309042906004016139b7565b600060405180830381600087803b158015611d9457600080fd5b505af1158015611da8573d6000803e3d6000fd5b5050600754479250611dc791508390611dc190846131ce565b9061322d565b6007555050506008909501805461ff001916610100179055505050505050565b60025460009047908311801590611dff575060035483115b8015611e0a57508083105b15611e185750600192915050565b50600092915050565b60145460009081805b82811015611e7f5760148181548110611e4557611e4561381e565b6000918252602090912001546001600160a01b0390811690861603611e6d5760019150611e7f565b80611e7781613834565b915050611e2a565b509392505050565b611e8f613304565b506001600160a01b038083166000908152601260209081526040808320858452825280832054835260138252918290208251610140810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff8082161515610100808501919091529091041615156101208201525b92915050565b6000546001600160a01b03163314611f6d5760405162461bcd60e51b8152600401610b609061384d565b6001600160a01b038216611f935760405162461bcd60e51b8152600401610b6090613882565b6000611f9e83611e21565b905080611fbd5760405162461bcd60e51b8152600401610b60906138b9565b506001600160a01b03909116600090815260166020526040902060040155565b611fe5613304565b5060009081526013602090815260409182902082516101408101845281546001600160a01b039081168252600183015416928101929092526002810154928201929092526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260089091015460ff80821615156101008085019190915290910416151561012082015290565b6000546001600160a01b031633146120ab5760405162461bcd60e51b8152600401610b609061384d565b6001600160a01b0382166121015760405162461bcd60e51b815260206004820152601a60248201527f6e61746976653a207a65726f20746f6b656e20616464726573730000000000006044820152606401610b60565b600980546001600160a01b0319166001600160a01b039390931692909217909155600855565b6000546001600160a01b031633146121515760405162461bcd60e51b8152600401610b609061384d565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146121c55760405162461bcd60e51b8152600401610b609061384d565b6001600160a01b0382166121eb5760405162461bcd60e51b8152600401610b6090613882565b60006121f683611e21565b9050806122155760405162461bcd60e51b8152600401610b60906138b9565b6001600160a01b0383166000908152600e60209081526040909120835161223e9285019061336d565b507f078e8a4737553c8d944056c4087a42039847a7c1ed868d8c0e5d82a224f94f5883836040516122709291906139f3565b60405180910390a1505050565b600a546001600160a01b031633146122e35760405162461bcd60e51b8152602060048201526024808201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260448201526330ba37b960e11b6064820152608401610b60565b60006122ee82611e21565b9050806123d7576040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561233c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236091906137dc565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0384169063a9059cbb906044016020604051808303816000875af11580156123b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d49190613956565b50505b5050565b6000546001600160a01b03163314806123fe5750600a546001600160a01b031633145b61241a5760405162461bcd60e51b8152600401610b6090613927565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015612467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248b9190613956565b505050565b600b5460408051633fabe5a360e21b815290516000926001600160a01b0316918391839163feaf968c9160048083019260a09291908290030181865afa1580156124de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125029190613a31565b50919695505050505050565b60158181548110610af857600080fd5b6002600154036125705760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b60565b6002600190815560008281526013602052604090209081015481546001600160a01b03918216911633146125f15760405162461bcd60e51b815260206004820152602260248201527f7061796261636b3a204f6e6c7920626f72726f7765722063616e207061796261604482015261636b60f01b6064820152608401610b60565b6008820154610100900460ff161561264b5760405162461bcd60e51b815260206004820152601a60248201527f7061796261636b3a206c697175696461746520616c72656164790000000000006044820152606401610b60565b600882015460ff16156126a05760405162461bcd60e51b815260206004820152601860248201527f7061796261636b3a207061796261636b20616c726561647900000000000000006044820152606401610b60565b81600501543410156126f45760405162461bcd60e51b815260206004820152601960248201527f7061796261636b3a204e6f7420656e6f756768206574686572000000000000006044820152606401610b60565b60088201805460ff1916600117905560038201546005546127149161322d565b60058190555061273b8260030154611dc184600501546006546131ce90919063ffffffff16565b60065560058201543360009081526010602052604090205461275c916131ce565b336000818152601060205260409081902092909255600484810154925163a9059cbb60e01b81529081019190915260248101919091526001600160a01b0382169063a9059cbb906044016020604051808303816000875af11580156127c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e99190613956565b61285b5760405162461bcd60e51b815260206004820152603960248201527f7061796261636b3a205472616e7366657220636f6c6c61746572616c2066726f60448201527f6d20636f6e747261637420746f2075736572206661696c6564000000000000006064820152608401610b60565b6008820154600583015460048401546040805133815260ff90941615156020850152428482015260608401929092526080830152517ff022a4d91d174959862c530aa30a63411b4f0e37186283bd5fc0000acc217a859181900360a00190a150506001805550565b6009546040516370a0823160e01b81526001600160a01b03838116600483015260009283929116906370a0823190602401602060405180830381865afa158015612911573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293591906137dc565b9050600854811115611e185750600192915050565b6000546001600160a01b031633148061296d5750600a546001600160a01b031633145b6129895760405162461bcd60e51b8152600401610b6090613927565b47808211156129f25760405162461bcd60e51b815260206004820152602f60248201527f77697468647261773a2043616e277420657863656564206d6f7265207468616e60448201526e20746f74616c4c697175696469747960881b6064820152608401610b60565b6040513390819084156108fc029085906000818181858888f193505050501580156123d4573d6000803e3d6000fd5b6001600160a01b0381166000908152600e6020908152604080832080548251818502810185019093528083528493830182828015612a8857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612a6a575b505050505090506000815167ffffffffffffffff811115612aab57612aab6135f1565b604051908082528060200260200182016040528015612ad4578160200160208202803683370190505b5090506000846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3b9190613a81565b60ff1690506000612b4d82600a613b88565b60405163d06ca61f60e01b81529091506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063d06ca61f90612b9e9084908890600401613b94565b600060405180830381865afa158015612bbb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612be39190810190613bad565b925060008360018651612bf6919061380b565b81518110612c0657612c0661381e565b602002602001015190506000612c1a612490565b90506000612c306305f5e1006110c58585613103565b9998505050505050505050565b600e6020528160005260406000208181548110612c5957600080fd5b6000918252602090912001546001600160a01b03169150829050565b6001600160a01b0383166000908152600e6020908152604080832080548251818502810185019093528083528493830182828015612cdc57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612cbe575b505050505090506000815167ffffffffffffffff811115612cff57612cff6135f1565b604051908082528060200260200182016040528015612d28578160200160208202803683370190505b506040516307c0329d60e21b81529091506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1690631f00ca7490612d7a9087908690600401613b94565b600060405180830381865afa158015612d97573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612dbf9190810190613bad565b90506000612dfb6064612df58885600081518110612ddf57612ddf61381e565b602002602001015161318c90919063ffffffff16565b90613103565b979650505050505050565b6000546001600160a01b03163314612e305760405162461bcd60e51b8152600401610b609061384d565b6001600160a01b038116612e955760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b60565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166000908152600e6020908152604080832080548251818502810185019093528083528493830182828015612f5757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612f39575b505050505090506000815167ffffffffffffffff811115612f7a57612f7a6135f1565b604051908082528060200260200182016040528015612fa3578160200160208202803683370190505b5060405163d06ca61f60e01b81529091506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063d06ca61f90612ff59087908690600401613b94565b600060405180830381865afa158015613012573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261303a9190810190613bad565b90506000612dfb60646110c5888560018851613056919061380b565b815181106130665761306661381e565b602002602001015161310390919063ffffffff16565b6040516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820183905260009182918516906323b872dd906064016020604051808303816000875af11580156130d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130fa9190613956565b95945050505050565b60008260000361311557506000611f3d565b60006131218385613c33565b90508261312e8583613c60565b146131855760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b60565b9392505050565b600061318583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061326f565b6000806131db8385613c74565b9050838110156131855760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b60565b600061318583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506132d3565b600081836132905760405162461bcd60e51b8152600401610b609190613c87565b50600061329d8486613c60565b90506132a98486613cd5565b6132b38286613c33565b6132bd9190613c74565b85146132cb576132cb613ce9565b949350505050565b600081848411156132f75760405162461bcd60e51b8152600401610b609190613c87565b5060006130fa848661380b565b60405180610140016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090565b8280548282559060005260206000209081019282156133c2579160200282015b828111156133c257825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061338d565b506133ce9291506133d2565b5090565b5b808211156133ce57600081556001016133d3565b80356001600160a01b03811681146133fe57600080fd5b919050565b60006020828403121561341557600080fd5b613185826133e7565b60006020828403121561343057600080fd5b5035919050565b6000806040838503121561344a57600080fd5b613453836133e7565b946020939093013593505050565b60008060008060008060c0878903121561347a57600080fd5b613483876133e7565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b600080604083850312156134be57600080fd5b50508035926020909101359150565b80516001600160a01b0316825260208101516134f460208401826001600160a01b03169052565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e0830152610100808201516135458285018215159052565b505061012081810151801515848301526123d4565b6020808252825182820181905260009190848201906040850190845b8181101561359d576135898385516134cd565b928401926101409290920191600101613576565b50909695505050505050565b80151581146135b757600080fd5b50565b600080604083850312156135cd57600080fd5b6135d6836133e7565b915060208301356135e6816135a9565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613630576136306135f1565b604052919050565b600067ffffffffffffffff821115613652576136526135f1565b5060051b60200190565b600082601f83011261366d57600080fd5b8135602061368261367d83613638565b613607565b82815260059290921b840181019181810190868411156136a157600080fd5b8286015b848110156136c3576136b6816133e7565b83529183019183016136a5565b509695505050505050565b600080600080600080600060e0888a0312156136e957600080fd5b6136f2886133e7565b96506020880135955060408801359450606088013593506080880135925060a0880135915060c088013567ffffffffffffffff81111561373157600080fd5b61373d8a828b0161365c565b91505092959891949750929550565b6101408101611f3d82846134cd565b6000806040838503121561376e57600080fd5b613777836133e7565b9150602083013567ffffffffffffffff81111561379357600080fd5b61379f8582860161365c565b9150509250929050565b6000806000606084860312156137be57600080fd5b6137c7846133e7565b95602085013595506040909401359392505050565b6000602082840312156137ee57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115611f3d57611f3d6137f5565b634e487b7160e01b600052603260045260246000fd5b600060018201613846576138466137f5565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f7570646174653a205a65726f20636f6c6c61746572616c206164647265737300604082015260600190565b6020808252601b908201527f7570646174653a204e6f20636f6c6c61746572616c20746f6b656e0000000000604082015260600190565b6020808252601a908201527f6164643a2043616e2774206f7665722031303025206c696d6974000000000000604082015260600190565b6020808252601590820152742737ba1037bbb732b91037b91037b832b930ba37b960591b604082015260600190565b60006020828403121561396857600080fd5b8151613185816135a9565b600081518084526020808501945080840160005b838110156139ac5781516001600160a01b031687529582019590820190600101613987565b509495945050505050565b85815284602082015260a0604082015260006139d660a0830186613973565b6001600160a01b0394909416606083015250608001529392505050565b6001600160a01b03831681526040602082018190526000906132cb90830184613973565b805169ffffffffffffffffffff811681146133fe57600080fd5b600080600080600060a08688031215613a4957600080fd5b613a5286613a17565b9450602086015193506040860151925060608601519150613a7560808701613a17565b90509295509295909350565b600060208284031215613a9357600080fd5b815160ff8116811461318557600080fd5b600181815b80851115613adf578160001904821115613ac557613ac56137f5565b80851615613ad257918102915b93841c9390800290613aa9565b509250929050565b600082613af657506001611f3d565b81613b0357506000611f3d565b8160018114613b195760028114613b2357613b3f565b6001915050611f3d565b60ff841115613b3457613b346137f5565b50506001821b611f3d565b5060208310610133831016604e8410600b8410161715613b62575081810a611f3d565b613b6c8383613aa4565b8060001904821115613b8057613b806137f5565b029392505050565b60006131858383613ae7565b8281526040602082015260006132cb6040830184613973565b60006020808385031215613bc057600080fd5b825167ffffffffffffffff811115613bd757600080fd5b8301601f81018513613be857600080fd5b8051613bf661367d82613638565b81815260059190911b82018301908381019087831115613c1557600080fd5b928401925b82841015612dfb57835182529284019290840190613c1a565b8082028115828204841417611f3d57611f3d6137f5565b634e487b7160e01b600052601260045260246000fd5b600082613c6f57613c6f613c4a565b500490565b80820180821115611f3d57611f3d6137f5565b600060208083528351808285015260005b81811015613cb457858101830151858201604001528201613c98565b506000604082860101526040601f19601f8301168501019250505092915050565b600082613ce457613ce4613c4a565b500690565b634e487b7160e01b600052600160045260246000fdfea2646970667358221220145465267eaf4992ccd6077c956eb8eacdc1a3f30080ae52bb4cd9ae42cf2e6164736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419000000000000000000000000e13879194578c6f1a591a96c45b65022c43cec0700000000000000000000000000000000000000000000000000024f2beb1aa000
-----Decoded View---------------
Arg [0] : _routerAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [1] : _ethUSDPriceFeed (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
Arg [2] : _nativeTokenAddress (address): 0xe13879194578C6F1A591a96C45B65022c43CEc07
Arg [3] : _nativeMin (uint256): 650000000000000
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [1] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Arg [2] : 000000000000000000000000e13879194578c6f1a591a96c45b65022c43cec07
Arg [3] : 00000000000000000000000000000000000000000000000000024f2beb1aa000
Deployed Bytecode Sourcemap
16956:19602:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20255:31;;;20264:10;297:51:2;;20276:9:1;379:2:2;364:18;;357:34;20255:31:1;;270:18:2;20255:31:1;;;;;;;16956:19602;;;;;18066:50;;;;;;;;;;-1:-1:-1;18066:50:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;917:25:2;;;905:2;890:18;18066:50:1;;;;;;;;18495:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1144:32:2;;;1126:51;;1114:2;1099:18;18495:51:1;953:230:2;18368:33:1;;;;;;;;;;-1:-1:-1;18368:33:1;;;;;:::i;:::-;;:::i;28101:3554::-;;;;;;;;;;-1:-1:-1;28101:3554:1;;;;;:::i;:::-;;:::i;:::-;;21800:1138;;;;;;;;;;-1:-1:-1;21800:1138:1;;;;;:::i;:::-;;:::i;25210:161::-;;;;;;;;;;-1:-1:-1;25210:161:1;;;;;:::i;:::-;;:::i;35228:167::-;;;;;;;;;;-1:-1:-1;35228:167:1;;;;;:::i;:::-;;:::i;17265:29::-;;;;;;;;;;;;;;;;34339:432;;;;;;;;;;-1:-1:-1;34339:432:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18441:45::-;;;;;;;;;;-1:-1:-1;18441:45:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4546:25:2;;;4602:2;4587:18;;4580:34;;;;4630:18;;;4623:34;;;;4688:2;4673:18;;4666:34;4731:3;4716:19;;4709:35;4788:14;4781:22;4775:3;4760:19;;4753:51;4533:3;4518:19;18441:45:1;4265:545:2;36332:106:1;;;;;;;;;;-1:-1:-1;36409:21:1;36332:106;;17104:26;;;;;;;;;;;;;;;;23427:418;;;;;;;;;;-1:-1:-1;23427:418:1;;;;;:::i;:::-;;:::i;20302:1490::-;;;;;;;;;;-1:-1:-1;20302:1490:1;;;;;:::i;:::-;;:::i;32995:1336::-;;;;;;;;;;-1:-1:-1;32995:1336:1;;;;;:::i;:::-;;:::i;18123:51::-;;;;;;;;;;-1:-1:-1;18123:51:1;;;;;:::i;:::-;;;;;;;;;;;;;;27456:296;;;;;;;;;;-1:-1:-1;27456:296:1;;;;;:::i;:::-;;:::i;:::-;;;7467:14:2;;7460:22;7442:41;;7430:2;7415:18;27456:296:1;7302:187:2;17216:40:1;;;;;;;;;;;;;;;;24310:358;;;;;;;;;;-1:-1:-1;24310:358:1;;;;;:::i;:::-;;:::i;18237:66::-;;;;;;;;;;-1:-1:-1;18237:66:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;34959:261;;;;;;;;;;-1:-1:-1;34959:261:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18181:49::-;;;;;;;;;;-1:-1:-1;18181:49:1;;;;;:::i;:::-;;;;;;;;;;;;;;17301:33;;;;;;;;;;-1:-1:-1;17301:33:1;;;;-1:-1:-1;;;;;17301:33:1;;;17071:25;;;;;;;;;;;;;;;;17341:23;;;;;;;;;;-1:-1:-1;17341:23:1;;;;-1:-1:-1;;;;;17341:23:1;;;23853:449;;;;;;;;;;-1:-1:-1;23853:449:1;;;;;:::i;:::-;;:::i;36446:103::-;;;;;;;;;;-1:-1:-1;36525:9:1;:16;36446:103;;34779:172;;;;;;;;;;-1:-1:-1;34779:172:1;;;;;:::i;:::-;;:::i;24936:266::-;;;;;;;;;;-1:-1:-1;24936:266:1;;;;;:::i;:::-;;:::i;17172:37::-;;;;;;;;;;;;;;;;13778:148;;;;;;;;;;;;;:::i;22946:473::-;;;;;;;;;;-1:-1:-1;22946:473:1;;;;;:::i;:::-;;:::i;13136:79::-;;;;;;;;;;-1:-1:-1;13174:7:1;13201:6;-1:-1:-1;;;;;13201:6:1;13136:79;;17977:29;;;;;;;;;;;;;;;;35919:290;;;;;;;;;;-1:-1:-1;35919:290:1;;;;;:::i;:::-;;:::i;17038:25::-;;;;;;;;;;;;;;;;36217:107;;;;;;;;;;-1:-1:-1;36293:16:1;:23;36217:107;;35754:157;;;;;;;;;;-1:-1:-1;35754:157:1;;;;;:::i;:::-;;:::i;25379:427::-;;;;;;;;;;;;;:::i;18408:26::-;;;;;;;;;;-1:-1:-1;18408:26:1;;;;;:::i;:::-;;:::i;31663:1324::-;;;;;;:::i;:::-;;:::i;24676:252::-;;;;;;;;;;-1:-1:-1;24676:252:1;;;;;:::i;:::-;;:::i;35403:343::-;;;;;;;;;;-1:-1:-1;35403:343:1;;;;;:::i;:::-;;:::i;25814:575::-;;;;;;;;;;-1:-1:-1;25814:575:1;;;;;:::i;:::-;;:::i;18013:46::-;;;;;;;;;;-1:-1:-1;18013:46:1;;;;;:::i;:::-;;:::i;17945:25::-;;;;;;;;;;;;;;;;26471:438;;;;;;;;;;-1:-1:-1;26471:438:1;;;;;:::i;:::-;;:::i;18310:49::-;;;;;;;;;;-1:-1:-1;18310:49:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18310:49:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8955:15:2;;;8937:34;;9007:15;;;;9002:2;8987:18;;8980:43;9039:18;;;9032:34;;;;9097:2;9082:18;;9075:34;;;;9140:3;9125:19;;9118:35;;;;8917:3;9169:19;;9162:35;9228:3;9213:19;;9206:35;9272:3;9257:19;;9250:35;9329:14;9322:22;9316:3;9301:19;;9294:51;9389:14;9382:22;9376:3;9361:19;;9354:51;8886:3;8871:19;18310:49:1;8512:899:2;14081:281:1;;;;;;;;;;-1:-1:-1;14081:281:1;;;;;:::i;:::-;;:::i;17371:31::-;;;;;;;;;;-1:-1:-1;17371:31:1;;;;-1:-1:-1;;;;;17371:31:1;;;17137:28;;;;;;;;;;;;;;;;26985:463;;;;;;;;;;-1:-1:-1;26985:463:1;;;;;:::i;:::-;;:::i;18368:33::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18368:33:1;;-1:-1:-1;18368:33:1;:::o;28101:3554::-;16011:1;16607:7;;:19;16599:63;;;;-1:-1:-1;;;16599:63:1;;9618:2:2;16599:63:1;;;9600:21:2;9657:2;9637:18;;;9630:30;9696:33;9676:18;;;9669:61;9747:18;;16599:63:1;;;;;;;;;16011:1;16740:7;:18;28229:15:::1;28247:35;28265:16:::0;28247:17:::1;:35::i;:::-;28229:53;;28301:10;28293:53;;;::::0;-1:-1:-1;;;28293:53:1;;9978:2:2;28293:53:1::1;::::0;::::1;9960:21:2::0;10017:2;9997:18;;;9990:30;10056:32;10036:18;;;10029:60;10106:18;;28293:53:1::1;9776:354:2::0;28293:53:1::1;-1:-1:-1::0;;;;;28484:27:1;::::1;28357:22;28484:27:::0;;;:9:::1;:27;::::0;;;;:34:::1;;::::0;28382:15;;28434:16;;28484:34:::1;;28483:35;28461:115;;;::::0;-1:-1:-1;;;28461:115:1;;10337:2:2;28461:115:1::1;::::0;::::1;10319:21:2::0;10376:2;10356:18;;;10349:30;10415:32;10395:18;;;10388:60;10465:18;;28461:115:1::1;10135:354:2::0;28461:115:1::1;28607:45;::::0;-1:-1:-1;;;28607:45:1;;28641:10:::1;28607:45;::::0;::::1;1126:51:2::0;28589:15:1::1;::::0;-1:-1:-1;;;;;28607:33:1;::::1;::::0;::::1;::::0;1099:18:2;;28607:45:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28589:63;;28681:14;28671:7;:24;28663:72;;;::::0;-1:-1:-1;;;28663:72:1;;10885:2:2;28663:72:1::1;::::0;::::1;10867:21:2::0;10924:2;10904:18;;;10897:30;10963:34;10943:18;;;10936:62;-1:-1:-1;;;11014:18:2;;;11007:33;11057:19;;28663:72:1::1;10683:399:2::0;28663:72:1::1;28748:13;28764:31;28784:10;28764:19;:31::i;:::-;28748:47;;28806:13;28823:8;28822:9;:119;;-1:-1:-1::0;;;;;28899:26:1;::::1;;::::0;;;:9:::1;:26;::::0;;;;:42:::1;;::::0;28822:119:::1;;;-1:-1:-1::0;;;;;28847:26:1;::::1;;::::0;;;:9:::1;:26;::::0;;;;:36;28822:119:::1;28976:72;::::0;-1:-1:-1;;;28976:72:1;;29032:4:::1;28976:72;::::0;::::1;1126:51:2::0;28806:135:1;;-1:-1:-1;28952:21:1::1;::::0;-1:-1:-1;;;;;28976:33:1;::::1;::::0;::::1;::::0;1099:18:2;;28976:72:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28952:96;;29081:58;29095:10;29107:15;29124:14;29081:13;:58::i;:::-;29059:162;;;::::0;-1:-1:-1;;;29059:162:1;;11289:2:2;29059:162:1::1;::::0;::::1;11271:21:2::0;11328:2;11308:18;;;11301:30;11367:34;11347:18;;;11340:62;-1:-1:-1;;;11418:18:2;;;11411:52;11480:19;;29059:162:1::1;11087:418:2::0;29059:162:1::1;29255:48;::::0;-1:-1:-1;;;29255:48:1;;29297:4:::1;29255:48;::::0;::::1;1126:51:2::0;29232:20:1::1;::::0;-1:-1:-1;;;;;29255:33:1;::::1;::::0;::::1;::::0;1099:18:2;;29255:48:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29232:71:::0;-1:-1:-1;29314:26:1::1;29343:28;29358:13:::0;29232:71;29343:28:::1;:::i;:::-;29314:57;;29382:21;29406:118;29445:15;29475:5;29495:18;29406:24;:118::i;:::-;29382:142;;29535:14;29573:9:::0;29568:180:::1;29592:9;:16:::0;29588:20;::::1;29568:180;;;29650:10;-1:-1:-1::0;;;;;29634:26:1::1;:9;29644:1;29634:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;29634:12:1::1;:26:::0;29630:107:::1;;29693:4;29681:16;;29716:5;;29630:107;29610:3:::0;::::1;::::0;::::1;:::i;:::-;;;;29568:180;;;-1:-1:-1::0;29762:18:1;::::1;;29775:5;29762:18:::0;29758:77:::1;;29797:9;:26:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;29797:26:1;;;;;::::1;::::0;;-1:-1:-1;;;;;;29797:26:1::1;29812:10;29797:26;::::0;;29758:77:::1;29867:32;29885:13;29867:17;:32::i;:::-;29845:148;;;::::0;-1:-1:-1;;;29845:148:1;;12249:2:2;29845:148:1::1;::::0;::::1;12231:21:2::0;12288:2;12268:18;;;12261:30;12327:34;12307:18;;;12300:62;12398:34;12378:18;;;12371:62;-1:-1:-1;;;12449:19:2;;;12442:33;12492:19;;29845:148:1::1;12047:470:2::0;29845:148:1::1;30004:18;30025:30;30039:15;30025:13;:30::i;:::-;30004:51;;30066:26;;:::i;:::-;30122:10;30103:29:::0;;-1:-1:-1;;;;;30143:31:1;::::1;:13;::::0;;::::1;:31:::0;;;30185:21:::1;::::0;;::::1;:34:::0;;;30230:18:::1;::::0;;::::1;:34:::0;;;30275:24:::1;::::0;;::::1;:45:::0;;;30348:10:::1;::::0;30331:14:::1;::::0;;::::1;:27:::0;;;;30103:16:::1;30369:17;::::0;::::1;:25:::0;;;30405:20:::1;::::0;::::1;:28:::0;;;30475:26;;;:9:::1;:26:::0;;;;;30444:57;;;;::::1;::::0;;;;;;30369:25;30444:57;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;;30630:21:::1;::::0;::::1;:50:::0;30444:57;;;;;30733:193;::::1;;;30781:43;30820:3;30781:34;:13:::0;30799:15;30781:17:::1;:34::i;:::-;:38:::0;::::1;:43::i;:::-;30761:63;;30733:193;;;30877:37;30910:3;30877:28;:13:::0;30895:9;30877:17:::1;:28::i;:37::-;30857:57;;30733:193;30936:21;::::0;::::1;:41:::0;;;30999:10:::1;::::0;;30988:22:::1;::::0;;;:10:::1;:22;::::0;;;;;;;:32;;;;-1:-1:-1;;;;;30988:32:1;;::::1;-1:-1:-1::0;;;;;;30988:32:1;;::::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;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;;::::0;;::::1;-1:-1:-1::0;;30988:32:1;::::1;;::::0;;;;-1:-1:-1;;30988:32:1;;;;;;;;;;::::1;::::0;;;31065:10:::1;31050:26:::0;;;:14:::1;:26:::0;;;;;;31121:10;;31087:11:::1;:23:::0;;;;;:31;;;;;;;;:44;31172:27;;:15:::1;:27:::0;;;;;;;:46:::1;::::0;31204:13;31172:31:::1;:46::i;:::-;31158:10;31142:27;::::0;;;:15:::1;:27;::::0;;;;:76;31243:11:::1;::::0;:30:::1;::::0;31259:13;31243:15:::1;:30::i;:::-;31229:11;:44:::0;31300:13:::1;::::0;:32:::1;::::0;31318:13;31300:17:::1;:32::i;:::-;31284:13;:48:::0;31358:10:::1;31343:26;::::0;;;:14:::1;:26;::::0;;;;:28;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;31382:10:1::1;:12:::0;;;:10:::1;:12;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;31407:43:1::1;::::0;31415:10:::1;::::0;31407:43;::::1;;;::::0;31436:13;;31407:43:::1;::::0;;;31436:13;31415:10;31407:43;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;31543:18:1::1;::::0;::::1;::::0;31576:24:::1;::::0;::::1;::::0;31615:21:::1;::::0;::::1;::::0;31466:181:::1;::::0;31493:10:::1;::::0;31466:181:::1;::::0;::::1;::::0;31518:10;12753:25:2;;12809:2;12794:18;;12787:34;;;;12852:2;12837:18;;12830:34;12895:2;12880:18;;12873:34;12740:3;12725:19;;12522:391;31466:181:1::1;;;;;;;;-1:-1:-1::0;;15967:1:1;16919:22;;-1:-1:-1;;;;;;;;;;;;;;;;;;28101:3554:1:o;21800:1138::-;13348:6;;-1:-1:-1;;;;;13348:6:1;12352:10;13348:22;13340:67;;;;-1:-1:-1;;;13340:67:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;22077:30:1;::::1;22055:111;;;;-1:-1:-1::0;;;22055:111:1::1;;;;;;;:::i;:::-;22177:15;22195:35;22213:16;22195:17;:35::i;:::-;22177:53;;22249:10;22241:50;;;;-1:-1:-1::0;;;22241:50:1::1;;;;;;;:::i;:::-;22323:3;22310:10;:16;22302:55;;;;-1:-1:-1::0;;;22302:55:1::1;;;;;;;:::i;:::-;22395:3;22376:16;:22;22368:61;;;;-1:-1:-1::0;;;22368:61:1::1;;;;;;;:::i;:::-;22462:3;22448:10;:17;;22440:64;;;::::0;-1:-1:-1;;;22440:64:1;;14552:2:2;22440:64:1::1;::::0;::::1;14534:21:2::0;14591:2;14571:18;;;14564:30;14630:34;14610:18;;;14603:62;-1:-1:-1;;;14681:18:2;;;14674:32;14723:19;;22440:64:1::1;14350:398:2::0;22440:64:1::1;22543:3;22523:16;:23;;22515:76;;;::::0;-1:-1:-1;;;22515:76:1;;14955:2:2;22515:76:1::1;::::0;::::1;14937:21:2::0;14994:2;14974:18;;;14967:30;15033:34;15013:18;;;15006:62;-1:-1:-1;;;15084:18:2;;;15077:38;15132:19;;22515:76:1::1;14753:404:2::0;22515:76:1::1;-1:-1:-1::0;;;;;;22604:27:1;;::::1;;::::0;;;:9:::1;:27;::::0;;;;:50;;;22665:43:::1;::::0;::::1;:62:::0;;;;22738:37:::1;::::0;::::1;:50:::0;22799:43:::1;::::0;::::1;:62:::0;22872:41:::1;;:58:::0;21800:1138::o;25210:161::-;13348:6;;-1:-1:-1;;;;;13348:6:1;12352:10;13348:22;13340:67;;;;-1:-1:-1;;;13340:67:1;;;;;;;:::i;:::-;25304:10:::1;:24:::0;;;;25339:10:::1;:24:::0;25210:161::o;35228:167::-;13348:6;;-1:-1:-1;;;;;13348:6:1;12352:10;13348:22;13340:67;;;;-1:-1:-1;;;13340:67:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;35308:22:1;::::1;35300:57;;;::::0;-1:-1:-1;;;35300:57:1;;15364:2:2;35300:57:1::1;::::0;::::1;15346:21:2::0;15403:2;15383:18;;;15376:30;-1:-1:-1;;;15422:18:2;;;15415:52;15484:18;;35300:57:1::1;15162:346:2::0;35300:57:1::1;35368:8;:19:::0;;-1:-1:-1;;;;;;35368:19:1::1;-1:-1:-1::0;;;;;35368:19:1;;;::::1;::::0;;;::::1;::::0;;35228:167::o;34339:432::-;-1:-1:-1;;;;;34529:21:1;;34465:29;34529:21;;;:14;:21;;;;;;34427:20;;34465:29;34497:64;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;34465:96;;34577:9;34572:166;-1:-1:-1;;;;;34596:21:1;;;;;;:14;:21;;;;;;34592:25;;34572:166;;;-1:-1:-1;;;;;34657:18:1;;;34639:15;34657:18;;;:11;:18;;;;;;;;:21;;;;;;;;;34707:19;;;:10;:19;;;;;;34693:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;;34657:21;;34693:33;:8;;34676:1;;34693:11;;;;;;:::i;:::-;;;;;;:33;;;;34624:114;34619:3;;;;;:::i;:::-;;;;34572:166;;;-1:-1:-1;34755:8:1;34339:432;-1:-1:-1;;34339:432:1:o;23427:418::-;13348:6;;-1:-1:-1;;;;;13348:6:1;12352:10;13348:22;13340:67;;;;-1:-1:-1;;;13340:67:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;23568:30:1;::::1;23546:111;;;;-1:-1:-1::0;;;23546:111:1::1;;;;;;;:::i;:::-;23668:15;23686:35;23704:16;23686:17;:35::i;:::-;23668:53;;23740:10;23732:50;;;;-1:-1:-1::0;;;23732:50:1::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;23793:27:1;;;::::1;;::::0;;;:9:::1;:27;::::0;;;;:34:::1;;:44:::0;;-1:-1:-1;;23793:44:1::1;::::0;::::1;;::::0;;;::::1;::::0;;23427:418::o;20302:1490::-;13348:6;;-1:-1:-1;;;;;13348:6:1;12352:10;13348:22;13340:67;;;;-1:-1:-1;;;13340:67:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;20609:30:1;::::1;20587:111;;;;-1:-1:-1::0;;;20587:111:1::1;;;;;;;:::i;:::-;20730:3;20717:10;:16;20709:55;;;;-1:-1:-1::0;;;20709:55:1::1;;;;;;;:::i;:::-;20802:3;20783:16;:22;20775:61;;;;-1:-1:-1::0;;;20775:61:1::1;;;;;;;:::i;:::-;20869:3;20855:10;:17;;20847:54;;;::::0;-1:-1:-1;;;20847:54:1;;15715:2:2;20847:54:1::1;::::0;::::1;15697:21:2::0;15754:2;15734:18;;;15727:30;-1:-1:-1;;;15773:18:2;;;15766:54;15837:18;;20847:54:1::1;15513:348:2::0;20847:54:1::1;20940:3;20920:16;:23;;20912:60;;;::::0;-1:-1:-1;;;20912:60:1;;15715:2:2;20912:60:1::1;::::0;::::1;15697:21:2::0;15754:2;15734:18;;;15727:30;-1:-1:-1;;;15773:18:2;;;15766:54;15837:18;;20912:60:1::1;15513:348:2::0;20912:60:1::1;20985:15;21003:35;21021:16;21003:17;:35::i;:::-;20985:53;;21054:10;21049:133;;21081:16;:39:::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;;21081:39:1::1;-1:-1:-1::0;;;;;21081:39:1;::::1;::::0;;::::1;::::0;;;-1:-1:-1;21135:27:1;;;:9:::1;21081:39;21135:27:::0;;;;;;;:35;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;21049:133;21192:27;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21192:27:1::1;21254:10;21230:11;:21;;:34;;;::::0;::::1;21307:16;21277:11;:27;;:46;;;::::0;::::1;21358:10;21334:11;:21;;:34;;;::::0;::::1;21409:16;21379:11;:27;;:46;;;::::0;::::1;21464:14;21436:11;:25;;:42;;;::::0;::::1;21510:5;21489:11;:18;;:26;;;;;;;;;::::0;::::1;21558:11;21528:9;:27;21538:16;-1:-1:-1::0;;;;;21528:27:1::1;-1:-1:-1::0;;;;;21528:27:1::1;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21587:197;21616:16;21647:10;21672:16;21703:10;21728:16;21759:14;21587:197;;;;;;;;;;-1:-1:-1::0;;;;;16171:32:2;;;;16153:51;;16235:2;16220:18;;16213:34;;;;16278:2;16263:18;;16256:34;;;;16321:2;16306:18;;16299:34;16364:3;16349:19;;16342:35;16191:3;16393:19;;16386:35;16140:3;16125:19;;15866:561;21587:197:1::1;;;;;;;;20576:1216;;20302:1490:::0;;;;;;;:::o;32995:1336::-;13174:7;13201:6;-1:-1:-1;;;;;13201:6:1;20085:10;:21;;20084:51;;-1:-1:-1;20126:8:1;;-1:-1:-1;;;;;20126:8:1;20112:10;:22;20084:51;20062:122;;;;-1:-1:-1;;;20062:122:1;;;;;;;:::i;:::-;33065:27:::1;33095:15:::0;;;:10:::1;:15;::::0;;;;33130:20:::1;::::0;::::1;::::0;::::1;::::0;::::1;;;33129:21;33121:62;;;::::0;-1:-1:-1;;;33121:62:1;;16984:2:2;33121:62:1::1;::::0;::::1;16966:21:2::0;17023:2;17003:18;;;16996:30;17062;17042:18;;;17035:58;17110:18;;33121:62:1::1;16782:352:2::0;33121:62:1::1;33203:17;::::0;::::1;::::0;::::1;;33202:18;33194:57;;;::::0;-1:-1:-1;;;33194:57:1;;17341:2:2;33194:57:1::1;::::0;::::1;17323:21:2::0;17380:2;17360:18;;;17353:30;17419:28;17399:18;;;17392:56;17465:18;;33194:57:1::1;17139:350:2::0;33194:57:1::1;33288:13;::::0;::::1;::::0;33336:21:::1;::::0;::::1;::::0;-1:-1:-1;;;;;33288:13:1;;::::1;::::0;33262:23:::1;33391:30;33288:13:::0;33391::::1;:30::i;:::-;33454:24;::::0;::::1;::::0;33513:21:::1;::::0;::::1;::::0;33368:53;;-1:-1:-1;33454:24:1;33569:41:::1;33606:3;33569:32;:13:::0;33513:21;33569:17:::1;:32::i;:41::-;33553:12;:57;;33545:102;;;::::0;-1:-1:-1;;;33545:102:1;;17696:2:2;33545:102:1::1;::::0;::::1;17678:21:2::0;;;17715:18;;;17708:30;17774:34;17754:18;;;17747:62;17826:18;;33545:102:1::1;17494:356:2::0;33545:102:1::1;33658:69;::::0;-1:-1:-1;;;33658:69:1;;-1:-1:-1;;;;;33698:15:1::1;315:32:2::0;;33658:69:1::1;::::0;::::1;297:51:2::0;364:18;;;357:34;;;33658:31:1;::::1;::::0;::::1;::::0;270:18:2;;33658:69:1::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;33762:26:1;::::1;33738:21;33762:26:::0;;;:9:::1;:26;::::0;;;;;;;33738:50;;;;;;::::1;::::0;;;;;;;;;;;;33762:26;;33738:50;;::::1;33762:26:::0;33738:50;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;33738:50:1::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;-1:-1:-1::0;;33858:262:1::1;::::0;-1:-1:-1;;;33858:262:1;;33738:50;;-1:-1:-1;33826:21:1::1;::::0;-1:-1:-1;;;;;33858:15:1::1;:80;::::0;-1:-1:-1;33858:80:1::1;::::0;-1:-1:-1;33858:262:1::1;::::0;-1:-1:-1;33957:11:1;;33799:24:::1;::::0;33738:50;;34066:4:::1;::::0;34090:15:::1;::::0;33858:262:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;34217:25:1::1;::::0;34157:21:::1;::::0;-1:-1:-1;34217:68:1::1;::::0;-1:-1:-1;34268:16:1;;34217:46:::1;::::0;34157:21;34217:29:::1;:46::i;:::-;:50:::0;::::1;:68::i;:::-;34189:25;:96:::0;-1:-1:-1;;;34296:20:1::1;::::0;;::::1;:27:::0;;-1:-1:-1;;34296:27:1::1;;;::::0;;-1:-1:-1;;;;;;32995:1336:1:o;27456:296::-;27604:10;;27521:4;;27557:21;;27593;;;;;:45;;;27628:10;;27618:7;:20;27593:45;:67;;;;;27652:8;27642:7;:18;27593:67;27589:156;;;-1:-1:-1;27684:4:1;;27456:296;-1:-1:-1;;27456:296:1:o;27589:156::-;-1:-1:-1;27728:5:1;;27456:296;-1:-1:-1;;27456:296:1:o;24310:358::-;24404:16;:23;24373:4;;;;24469:167;24493:3;24489:1;:7;24469:167;;;24531:16;24548:1;24531:19;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;24531:19:1;;;24522:28;;;;24518:107;;24581:4;24571:14;;24604:5;;24518:107;24498:3;;;;:::i;:::-;;;;24469:167;;;-1:-1:-1;24653:7:1;24310:358;-1:-1:-1;;;24310:358:1:o;34959:261::-;35038:18;;:::i;:::-;-1:-1:-1;;;;;;35094:18:1;;;35069:22;35094:18;;;:11;:18;;;;;;;;:26;;;;;;;;;35161;;:10;:26;;;;;;35198:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34959:261;;;;;:::o;23853:449::-;13348:6;;-1:-1:-1;;;;;13348:6:1;12352:10;13348:22;13340:67;;;;-1:-1:-1;;;13340:67:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;24011:30:1;::::1;23989:111;;;;-1:-1:-1::0;;;23989:111:1::1;;;;;;;:::i;:::-;24111:15;24129:35;24147:16;24129:17;:35::i;:::-;24111:53;;24183:10;24175:50;;;;-1:-1:-1::0;;;24175:50:1::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;24236:27:1;;::::1;;::::0;;;:9:::1;:27;::::0;;;;:41:::1;;:58:::0;23853:449::o;34779:172::-;34839:18;;:::i;:::-;-1:-1:-1;34870:27:1;34900:18;;;:10;:18;;;;;;;;;34929:14;;;;;;;;;-1:-1:-1;;;;;34929:14:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34779:172::o;24936:266::-;13348:6;;-1:-1:-1;;;;;13348:6:1;12352:10;13348:22;13340:67;;;;-1:-1:-1;;;13340:67:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;25059:27:1;::::1;25051:66;;;::::0;-1:-1:-1;;;25051:66:1;;19360:2:2;25051:66:1::1;::::0;::::1;19342:21:2::0;19399:2;19379:18;;;19372:30;19438:28;19418:18;;;19411:56;19484:18;;25051:66:1::1;19158:350:2::0;25051:66:1::1;25128:18;:34:::0;;-1:-1:-1;;;;;;25128:34:1::1;-1:-1:-1::0;;;;;25128:34:1;;;::::1;::::0;;;::::1;::::0;;;25173:14:::1;:21:::0;24936:266::o;13778:148::-;13348:6;;-1:-1:-1;;;;;13348:6:1;12352:10;13348:22;13340:67;;;;-1:-1:-1;;;13340:67:1;;;;;;;:::i;:::-;13885:1:::1;13869:6:::0;;13848:40:::1;::::0;-1:-1:-1;;;;;13869:6:1;;::::1;::::0;13848:40:::1;::::0;13885:1;;13848:40:::1;13916:1;13899:19:::0;;-1:-1:-1;;;;;;13899:19:1::1;::::0;;13778:148::o;22946:473::-;13348:6;;-1:-1:-1;;;;;13348:6:1;12352:10;13348:22;13340:67;;;;-1:-1:-1;;;13340:67:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;23093:30:1;::::1;23071:111;;;;-1:-1:-1::0;;;23071:111:1::1;;;;;;;:::i;:::-;23193:15;23211:35;23229:16;23211:17;:35::i;:::-;23193:53;;23265:10;23257:50;;;;-1:-1:-1::0;;;23257:50:1::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;23318:27:1;::::1;;::::0;;;:9:::1;:27;::::0;;;;;;;:35;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;23371:40;23387:16;23405:5;23371:40;;;;;;;:::i;:::-;;;;;;;;23060:359;22946:473:::0;;:::o;35919:290::-;19929:8;;-1:-1:-1;;;;;19929:8:1;19941:10;19929:22;19921:71;;;;-1:-1:-1;;;19921:71:1;;20078:2:2;19921:71:1;;;20060:21:2;20117:2;20097:18;;;20090:30;20156:34;20136:18;;;20129:62;-1:-1:-1;;;20207:18:2;;;20200:34;20251:19;;19921:71:1;19876:400:2;19921:71:1;35988:15:::1;36006:25;36024:6;36006:17;:25::i;:::-;35988:43;;36047:10;36042:160;;36092:39;::::0;-1:-1:-1;;;36092:39:1;;36125:4:::1;36092:39;::::0;::::1;1126:51:2::0;36074:15:1::1;::::0;-1:-1:-1;;;;;36092:24:1;::::1;::::0;::::1;::::0;1099:18:2;;36092:39:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36146:44;::::0;-1:-1:-1;;;36146:44:1;;36170:10:::1;36146:44;::::0;::::1;297:51:2::0;364:18;;;357:34;;;36074:57:1;;-1:-1:-1;;;;;;36146:23:1;::::1;::::0;::::1;::::0;270:18:2;;36146:44:1::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36059:143;36042:160;35977:232;35919:290:::0;:::o;35754:157::-;13174:7;13201:6;-1:-1:-1;;;;;13201:6:1;20085:10;:21;;20084:51;;-1:-1:-1;20126:8:1;;-1:-1:-1;;;;;20126:8:1;20112:10;:22;20084:51;20062:122;;;;-1:-1:-1;;;20062:122:1;;;;;;;:::i;:::-;35859:44:::1;::::0;-1:-1:-1;;;35859:44:1;;35883:10:::1;35859:44;::::0;::::1;297:51:2::0;364:18;;;357:34;;;-1:-1:-1;;;;;35859:23:1;::::1;::::0;::::1;::::0;270:18:2;;35859:44:1::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35754:157:::0;;:::o;25379:427::-;25513:16;;25737:27;;;-1:-1:-1;;;25737:27:1;;;;25423:7;;-1:-1:-1;;;;;25513:16:1;;25423:7;;25513:16;;25737:25;;:27;;;;;;;;;;;;;;25513:16;25737:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;25551:213:1;;25379:427;-1:-1:-1;;;;;;25379:427:1:o;18408:26::-;;;;;;;;;;;;31663:1324;16011:1;16607:7;;:19;16599:63;;;;-1:-1:-1;;;16599:63:1;;9618:2:2;16599:63:1;;;9600:21:2;9657:2;9637:18;;;9630:30;9696:33;9676:18;;;9669:61;9747:18;;16599:63:1;9416:355:2;16599:63:1;16011:1;16740:7;:18;;;31764:27:::1;31794:15:::0;;;:10:::1;:15;::::0;;;;31846:13;;::::1;::::0;31892:16;;-1:-1:-1;;;;;31846:13:1;;::::1;::::0;31892:16:::1;31912:10;31892:30;31870:114;;;::::0;-1:-1:-1;;;31870:114:1;;21145:2:2;31870:114:1::1;::::0;::::1;21127:21:2::0;21184:2;21164:18;;;21157:30;21223:34;21203:18;;;21196:62;-1:-1:-1;;;21274:18:2;;;21267:32;21316:19;;31870:114:1::1;20943:398:2::0;31870:114:1::1;32004:20;::::0;::::1;::::0;::::1;::::0;::::1;;;32003:21;31995:60;;;::::0;-1:-1:-1;;;31995:60:1;;21548:2:2;31995:60:1::1;::::0;::::1;21530:21:2::0;21587:2;21567:18;;;21560:30;21626:28;21606:18;;;21599:56;21672:18;;31995:60:1::1;21346:350:2::0;31995:60:1::1;32075:17;::::0;::::1;::::0;::::1;;32074:18;32066:55;;;::::0;-1:-1:-1;;;32066:55:1;;21903:2:2;32066:55:1::1;::::0;::::1;21885:21:2::0;21942:2;21922:18;;;21915:30;21981:26;21961:18;;;21954:54;22025:18;;32066:55:1::1;21701:348:2::0;32066:55:1::1;32167:7;:21;;;32154:9;:34;;32132:109;;;::::0;-1:-1:-1;;;32132:109:1;;22256:2:2;32132:109:1::1;::::0;::::1;22238:21:2::0;22295:2;22275:18;;;22268:30;22334:27;22314:18;;;22307:55;22379:18;;32132:109:1::1;22054:349:2::0;32132:109:1::1;32252:17;::::0;::::1;:24:::0;;-1:-1:-1;;32252:24:1::1;32272:4;32252:24;::::0;;32321:18:::1;::::0;::::1;::::0;32303:13:::1;::::0;:37:::1;::::0;:17:::1;:37::i;:::-;32287:13;:53;;;;32376:73;32430:7;:18;;;32376:49;32403:7;:21;;;32376:22;;:26;;:49;;;;:::i;:73::-;32351:22;:98:::0;32524:21:::1;::::0;::::1;::::0;32508:10:::1;32491:28;::::0;;;:16:::1;:28;::::0;;;;;:55:::1;::::0;:32:::1;:55::i;:::-;32477:10;32460:28;::::0;;;:16:::1;:28;::::0;;;;;;:86;;;;32659:24:::1;::::0;;::::1;::::0;32579:119;;-1:-1:-1;;;32579:119:1;;;;::::1;297:51:2::0;;;;364:18;;;357:34;;;;-1:-1:-1;;;;;32579:32:1;::::1;::::0;::::1;::::0;270:18:2;;32579:119:1::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32557:226;;;::::0;-1:-1:-1;;;32557:226:1;;22610:2:2;32557:226:1::1;::::0;::::1;22592:21:2::0;22649:2;22629:18;;;22622:30;22688:34;22668:18;;;22661:62;22759:27;22739:18;;;22732:55;22804:19;;32557:226:1::1;22408:421:2::0;32557:226:1::1;32846:17;::::0;::::1;::::0;32908:21:::1;::::0;::::1;::::0;32944:24:::1;::::0;::::1;::::0;32799:180:::1;::::0;;32821:10:::1;23087:51:2::0;;32846:17:1::1;::::0;;::::1;23181:14:2::0;23174:22;23169:2;23154:18;;23147:50;32878:15:1::1;23213:18:2::0;;;23206:34;23271:2;23256:18;;23249:34;;;;23314:3;23299:19;;23292:35;32799:180:1;::::1;::::0;;;;23074:3:2;32799:180:1;;::::1;-1:-1:-1::0;;15967:1:1;16919:22;;-1:-1:-1;31663:1324:1:o;24676:252::-;24783:18;;24776:43;;-1:-1:-1;;;24776:43:1;;-1:-1:-1;;;;;1144:32:2;;;24776:43:1;;;1126:51:2;24741:4:1;;;;24783:18;;;24776:36;;1099:18:2;;24776:43:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24758:61;;24844:14;;24834:7;:24;24830:68;;;-1:-1:-1;24882:4:1;;24676:252;-1:-1:-1;;24676:252:1:o;35403:343::-;13174:7;13201:6;-1:-1:-1;;;;;13201:6:1;20085:10;:21;;20084:51;;-1:-1:-1;20126:8:1;;-1:-1:-1;;;;;20126:8:1;20112:10;:22;20084:51;20062:122;;;;-1:-1:-1;;;20062:122:1;;;;;;;:::i;:::-;35500:21:::1;35554:19:::0;;::::1;;35532:116;;;::::0;-1:-1:-1;;;35532:116:1;;23540:2:2;35532:116:1::1;::::0;::::1;23522:21:2::0;23579:2;23559:18;;;23552:30;23618:34;23598:18;;;23591:62;-1:-1:-1;;;23669:18:2;;;23662:45;23724:19;;35532:116:1::1;23338:411:2::0;35532:116:1::1;35714:24;::::0;35692:10:::1;::::0;;;35714:24;::::1;;;::::0;35730:7;;35659:22:::1;35714:24:::0;35659:22;35714:24;35730:7;35692:10;35714:24;::::1;;;;;;;;;;;;;::::0;::::1;;;;25814:575:::0;-1:-1:-1;;;;;25917:17:1;;25873:7;25917:17;;;:9;:17;;;;;;;;25893:41;;;;;;;;;;;;;;;;;25873:7;;25893:41;;25917:17;25893:41;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25893:41:1;;;;;;;;;;;;;;;;;;;;;;;25945:24;25986:4;:11;25972:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25972:26:1;;25945:53;;26009:21;26040:6;-1:-1:-1;;;;;26033:23:1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26009:49;;;-1:-1:-1;26069:22:1;26094:21;26009:49;26094:2;:21;:::i;:::-;26136:51;;-1:-1:-1;;;26136:51:1;;26069:46;;-1:-1:-1;;;;;;26136:15:1;:29;;;;:51;;26069:46;;26182:4;;26136:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26136:51:1;;;;;;;;;;;;:::i;:::-;26126:61;;26198:17;26218:7;26240:1;26226:4;:11;:15;;;;:::i;:::-;26218:24;;;;;;;;:::i;:::-;;;;;;;26198:44;;26253:16;26272:13;:11;:13::i;:::-;26253:32;-1:-1:-1;26296:18:1;26317:36;26345:7;26317:23;:9;26253:32;26317:13;:23::i;:36::-;26296:57;25814:575;-1:-1:-1;;;;;;;;;25814:575:1:o;18013:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18013:46:1;;-1:-1:-1;18013:46:1;;-1:-1:-1;18013:46:1:o;26471:438::-;-1:-1:-1;;;;;26663:27:1;;26619:7;26663:27;;;:9;:27;;;;;;;;26639:51;;;;;;;;;;;;;;;;;26619:7;;26639:51;;26663:27;26639:51;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26639:51:1;;;;;;;;;;;;;;;;;;;;;;;26701:24;26742:4;:11;26728:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26728:26:1;-1:-1:-1;26775:43:1;;-1:-1:-1;;;26775:43:1;;26701:53;;-1:-1:-1;;;;;;26775:15:1;:28;;;;:43;;26804:7;;26813:4;;26775:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26775:43:1;;;;;;;;;;;;:::i;:::-;26765:53;;26829:14;26846:31;26873:3;26846:22;26861:6;26846:7;26854:1;26846:10;;;;;;;;:::i;:::-;;;;;;;:14;;:22;;;;:::i;:::-;:26;;:31::i;:::-;26829:48;26471:438;-1:-1:-1;;;;;;;26471:438:1:o;14081:281::-;13348:6;;-1:-1:-1;;;;;13348:6:1;12352:10;13348:22;13340:67;;;;-1:-1:-1;;;13340:67:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;14184:22:1;::::1;14162:110;;;::::0;-1:-1:-1;;;14162:110:1;;26831:2:2;14162:110:1::1;::::0;::::1;26813:21:2::0;26870:2;26850:18;;;26843:30;26909:34;26889:18;;;26882:62;-1:-1:-1;;;26960:18:2;;;26953:36;27006:19;;14162:110:1::1;26629:402:2::0;14162:110:1::1;14309:6;::::0;;14288:38:::1;::::0;-1:-1:-1;;;;;14288:38:1;;::::1;::::0;14309:6;::::1;::::0;14288:38:::1;::::0;::::1;14337:6;:17:::0;;-1:-1:-1;;;;;;14337:17:1::1;-1:-1:-1::0;;;;;14337:17:1;;;::::1;::::0;;;::::1;::::0;;14081:281::o;26985:463::-;-1:-1:-1;;;;;27182:27:1;;27138:7;27182:27;;;:9;:27;;;;;;;;27158:51;;;;;;;;;;;;;;;;;27138:7;;27158:51;;27182:27;27158:51;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27158:51:1;;;;;;;;;;;;;;;;;;;;;;;27220:24;27261:4;:11;27247:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27247:26:1;-1:-1:-1;27294:49:1;;-1:-1:-1;;;27294:49:1;;27220:53;;-1:-1:-1;;;;;;27294:15:1;:29;;;;:49;;27324:12;;27338:4;;27294:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27294:49:1;;;;;;;;;;;;:::i;:::-;27284:59;;27354:14;27371:45;27412:3;27371:36;27400:6;27371:7;27393:1;27379:4;:11;:15;;;;:::i;:::-;27371:24;;;;;;;;:::i;:::-;;;;;;;:28;;:36;;;;:::i;27760:333::-;27933:123;;-1:-1:-1;;;27933:123:1;;-1:-1:-1;;;;;27294:15:2;;;27933:123:1;;;27276:34:2;28013:4:1;27326:18:2;;;27319:43;27378:18;;;27371:34;;;27897:4:1;;;;27933:37;;;;;27211:18:2;;27933:123:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27914:142;27760:333;-1:-1:-1;;;;;27760:333:1:o;817:250::-;875:7;899:1;904;899:6;895:47;;-1:-1:-1;929:1:1;922:8;;895:47;954:9;966:5;970:1;966;:5;:::i;:::-;954:17;-1:-1:-1;999:1:1;990:5;994:1;954:17;990:5;:::i;:::-;:10;982:56;;;;-1:-1:-1;;;982:56:1;;28048:2:2;982:56:1;;;28030:21:2;28087:2;28067:18;;;28060:30;28126:34;28106:18;;;28099:62;-1:-1:-1;;;28177:18:2;;;28170:31;28218:19;;982:56:1;27846:397:2;982:56:1;1058:1;817:250;-1:-1:-1;;;817:250:1:o;1075:132::-;1133:7;1160:39;1164:1;1167;1160:39;;;;;;;;;;;;;;;;;:3;:39::i;250:181::-;308:7;;340:5;344:1;340;:5;:::i;:::-;328:17;;369:1;364;:6;;356:46;;;;-1:-1:-1;;;356:46:1;;28580:2:2;356:46:1;;;28562:21:2;28619:2;28599:18;;;28592:30;28658:29;28638:18;;;28631:57;28705:18;;356:46:1;28378:351:2;439:136:1;497:7;524:43;528:1;531;524:43;;;;;;;;;;;;;;;;;:3;:43::i;1215:311::-;1335:7;1370:12;1363:5;1355:28;;;;-1:-1:-1;;;1355:28:1;;;;;;;;:::i;:::-;-1:-1:-1;1394:9:1;1406:5;1410:1;1406;:5;:::i;:::-;1394:17;-1:-1:-1;1443:5:1;1447:1;1443;:5;:::i;:::-;1434;1438:1;1434;:5;:::i;:::-;:15;;;;:::i;:::-;1429:1;:20;1422:28;;;;:::i;:::-;1517:1;1215:311;-1:-1:-1;;;;1215:311:1:o;583:226::-;703:7;739:12;731:6;;;;723:29;;;;-1:-1:-1;;;723:29:1;;;;;;;;:::i;:::-;-1:-1:-1;763:9:1;775:5;779:1;775;:5;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;402:173:2;470:20;;-1:-1:-1;;;;;519:31:2;;509:42;;499:70;;565:1;562;555:12;499:70;402:173;;;:::o;580:186::-;639:6;692:2;680:9;671:7;667:23;663:32;660:52;;;708:1;705;698:12;660:52;731:29;750:9;731:29;:::i;1188:180::-;1247:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:52;;;1316:1;1313;1306:12;1268:52;-1:-1:-1;1339:23:2;;1188:180;-1:-1:-1;1188:180:2:o;1581:254::-;1649:6;1657;1710:2;1698:9;1689:7;1685:23;1681:32;1678:52;;;1726:1;1723;1716:12;1678:52;1749:29;1768:9;1749:29;:::i;:::-;1739:39;1825:2;1810:18;;;;1797:32;;-1:-1:-1;;;1581:254:2:o;1840:529::-;1944:6;1952;1960;1968;1976;1984;2037:3;2025:9;2016:7;2012:23;2008:33;2005:53;;;2054:1;2051;2044:12;2005:53;2077:29;2096:9;2077:29;:::i;:::-;2067:39;2153:2;2138:18;;2125:32;;-1:-1:-1;2204:2:2;2189:18;;2176:32;;2255:2;2240:18;;2227:32;;-1:-1:-1;2306:3:2;2291:19;;2278:33;;-1:-1:-1;2358:3:2;2343:19;2330:33;;-1:-1:-1;1840:529:2;-1:-1:-1;;;1840:529:2:o;2374:248::-;2442:6;2450;2503:2;2491:9;2482:7;2478:23;2474:32;2471:52;;;2519:1;2516;2509:12;2471:52;-1:-1:-1;;2542:23:2;;;2612:2;2597:18;;;2584:32;;-1:-1:-1;2374:248:2:o;2723:815::-;2807:12;;-1:-1:-1;;;;;80:31:2;68:44;;2871:4;2864:5;2860:16;2854:23;2886:48;2928:4;2923:3;2919:14;2905:12;-1:-1:-1;;;;;80:31:2;68:44;;14:104;2886:48;;2983:4;2976:5;2972:16;2966:23;2959:4;2954:3;2950:14;2943:47;3039:4;3032:5;3028:16;3022:23;3015:4;3010:3;3006:14;2999:47;3095:4;3088:5;3084:16;3078:23;3071:4;3066:3;3062:14;3055:47;3151:4;3144:5;3140:16;3134:23;3127:4;3122:3;3118:14;3111:47;3207:4;3200:5;3196:16;3190:23;3183:4;3178:3;3174:14;3167:47;3263:4;3256:5;3252:16;3246:23;3239:4;3234:3;3230:14;3223:47;3289:6;3343:2;3336:5;3332:14;3326:21;3356:45;3397:2;3392:3;3388:12;3372:14;2697:13;2690:21;2678:34;;2627:91;3356:45;-1:-1:-1;;3420:6:2;3463:14;;;3457:21;2697:13;;2690:21;3519:12;;;2678:34;3487:45;2627:91;3543:717;3772:2;3824:21;;;3894:13;;3797:18;;;3916:22;;;3743:4;;3772:2;3995:15;;;;3969:2;3954:18;;;3743:4;4038:196;4052:6;4049:1;4046:13;4038:196;;;4101:49;4146:3;4137:6;4131:13;4101:49;:::i;:::-;4209:15;;;;4179:6;4170:16;;;;;4074:1;4067:9;4038:196;;;-1:-1:-1;4251:3:2;;3543:717;-1:-1:-1;;;;;;3543:717:2:o;4815:118::-;4901:5;4894:13;4887:21;4880:5;4877:32;4867:60;;4923:1;4920;4913:12;4867:60;4815:118;:::o;4938:315::-;5003:6;5011;5064:2;5052:9;5043:7;5039:23;5035:32;5032:52;;;5080:1;5077;5070:12;5032:52;5103:29;5122:9;5103:29;:::i;:::-;5093:39;;5182:2;5171:9;5167:18;5154:32;5195:28;5217:5;5195:28;:::i;:::-;5242:5;5232:15;;;4938:315;;;;;:::o;5258:127::-;5319:10;5314:3;5310:20;5307:1;5300:31;5350:4;5347:1;5340:15;5374:4;5371:1;5364:15;5390:275;5461:2;5455:9;5526:2;5507:13;;-1:-1:-1;;5503:27:2;5491:40;;5561:18;5546:34;;5582:22;;;5543:62;5540:88;;;5608:18;;:::i;:::-;5644:2;5637:22;5390:275;;-1:-1:-1;5390:275:2:o;5670:183::-;5730:4;5763:18;5755:6;5752:30;5749:56;;;5785:18;;:::i;:::-;-1:-1:-1;5830:1:2;5826:14;5842:4;5822:25;;5670:183::o;5858:668::-;5912:5;5965:3;5958:4;5950:6;5946:17;5942:27;5932:55;;5983:1;5980;5973:12;5932:55;6019:6;6006:20;6045:4;6069:60;6085:43;6125:2;6085:43;:::i;:::-;6069:60;:::i;:::-;6163:15;;;6249:1;6245:10;;;;6233:23;;6229:32;;;6194:12;;;;6273:15;;;6270:35;;;6301:1;6298;6291:12;6270:35;6337:2;6329:6;6325:15;6349:148;6365:6;6360:3;6357:15;6349:148;;;6431:23;6450:3;6431:23;:::i;:::-;6419:36;;6475:12;;;;6382;;6349:148;;;-1:-1:-1;6515:5:2;5858:668;-1:-1:-1;;;;;;5858:668:2:o;6531:766::-;6669:6;6677;6685;6693;6701;6709;6717;6770:3;6758:9;6749:7;6745:23;6741:33;6738:53;;;6787:1;6784;6777:12;6738:53;6810:29;6829:9;6810:29;:::i;:::-;6800:39;;6886:2;6875:9;6871:18;6858:32;6848:42;;6937:2;6926:9;6922:18;6909:32;6899:42;;6988:2;6977:9;6973:18;6960:32;6950:42;;7039:3;7028:9;7024:19;7011:33;7001:43;;7091:3;7080:9;7076:19;7063:33;7053:43;;7147:3;7136:9;7132:19;7119:33;7175:18;7167:6;7164:30;7161:50;;;7207:1;7204;7197:12;7161:50;7230:61;7283:7;7274:6;7263:9;7259:22;7230:61;:::i;:::-;7220:71;;;6531:766;;;;;;;;;;:::o;7494:259::-;7686:3;7671:19;;7699:48;7675:9;7729:6;7699:48;:::i;7758:422::-;7851:6;7859;7912:2;7900:9;7891:7;7887:23;7883:32;7880:52;;;7928:1;7925;7918:12;7880:52;7951:29;7970:9;7951:29;:::i;:::-;7941:39;;8031:2;8020:9;8016:18;8003:32;8058:18;8050:6;8047:30;8044:50;;;8090:1;8087;8080:12;8044:50;8113:61;8166:7;8157:6;8146:9;8142:22;8113:61;:::i;:::-;8103:71;;;7758:422;;;;;:::o;8185:322::-;8262:6;8270;8278;8331:2;8319:9;8310:7;8306:23;8302:32;8299:52;;;8347:1;8344;8337:12;8299:52;8370:29;8389:9;8370:29;:::i;:::-;8360:39;8446:2;8431:18;;8418:32;;-1:-1:-1;8497:2:2;8482:18;;;8469:32;;8185:322;-1:-1:-1;;;8185:322:2:o;10494:184::-;10564:6;10617:2;10605:9;10596:7;10592:23;10588:32;10585:52;;;10633:1;10630;10623:12;10585:52;-1:-1:-1;10656:16:2;;10494:184;-1:-1:-1;10494:184:2:o;11510:127::-;11571:10;11566:3;11562:20;11559:1;11552:31;11602:4;11599:1;11592:15;11626:4;11623:1;11616:15;11642:128;11709:9;;;11730:11;;;11727:37;;;11744:18;;:::i;11775:127::-;11836:10;11831:3;11827:20;11824:1;11817:31;11867:4;11864:1;11857:15;11891:4;11888:1;11881:15;11907:135;11946:3;11967:17;;;11964:43;;11987:18;;:::i;:::-;-1:-1:-1;12034:1:2;12023:13;;11907:135::o;12918:356::-;13120:2;13102:21;;;13139:18;;;13132:30;13198:34;13193:2;13178:18;;13171:62;13265:2;13250:18;;12918:356::o;13279:355::-;13481:2;13463:21;;;13520:2;13500:18;;;13493:30;13559:33;13554:2;13539:18;;13532:61;13625:2;13610:18;;13279:355::o;13639:351::-;13841:2;13823:21;;;13880:2;13860:18;;;13853:30;13919:29;13914:2;13899:18;;13892:57;13981:2;13966:18;;13639:351::o;13995:350::-;14197:2;14179:21;;;14236:2;14216:18;;;14209:30;14275:28;14270:2;14255:18;;14248:56;14336:2;14321:18;;13995:350::o;16432:345::-;16634:2;16616:21;;;16673:2;16653:18;;;16646:30;-1:-1:-1;;;16707:2:2;16692:18;;16685:51;16768:2;16753:18;;16432:345::o;17855:245::-;17922:6;17975:2;17963:9;17954:7;17950:23;17946:32;17943:52;;;17991:1;17988;17981:12;17943:52;18023:9;18017:16;18042:28;18064:5;18042:28;:::i;18105:461::-;18158:3;18196:5;18190:12;18223:6;18218:3;18211:19;18249:4;18278:2;18273:3;18269:12;18262:19;;18315:2;18308:5;18304:14;18336:1;18346:195;18360:6;18357:1;18354:13;18346:195;;;18425:13;;-1:-1:-1;;;;;18421:39:2;18409:52;;18481:12;;;;18516:15;;;;18457:1;18375:9;18346:195;;;-1:-1:-1;18557:3:2;;18105:461;-1:-1:-1;;;;;18105:461:2:o;18571:582::-;18870:6;18859:9;18852:25;18913:6;18908:2;18897:9;18893:18;18886:34;18956:3;18951:2;18940:9;18936:18;18929:31;18833:4;18977:57;19029:3;19018:9;19014:19;19006:6;18977:57;:::i;:::-;-1:-1:-1;;;;;19070:32:2;;;;19065:2;19050:18;;19043:60;-1:-1:-1;19134:3:2;19119:19;19112:35;18969:65;18571:582;-1:-1:-1;;;18571:582:2:o;19513:358::-;-1:-1:-1;;;;;19720:32:2;;19702:51;;19789:2;19784;19769:18;;19762:30;;;-1:-1:-1;;19809:56:2;;19846:18;;19838:6;19809:56;:::i;20281:179::-;20359:13;;20412:22;20401:34;;20391:45;;20381:73;;20450:1;20447;20440:12;20465:473;20568:6;20576;20584;20592;20600;20653:3;20641:9;20632:7;20628:23;20624:33;20621:53;;;20670:1;20667;20660:12;20621:53;20693:39;20722:9;20693:39;:::i;:::-;20683:49;;20772:2;20761:9;20757:18;20751:25;20741:35;;20816:2;20805:9;20801:18;20795:25;20785:35;;20860:2;20849:9;20845:18;20839:25;20829:35;;20883:49;20927:3;20916:9;20912:19;20883:49;:::i;:::-;20873:59;;20465:473;;;;;;;;:::o;23754:273::-;23822:6;23875:2;23863:9;23854:7;23850:23;23846:32;23843:52;;;23891:1;23888;23881:12;23843:52;23923:9;23917:16;23973:4;23966:5;23962:16;23955:5;23952:27;23942:55;;23993:1;23990;23983:12;24032:422;24121:1;24164:5;24121:1;24178:270;24199:7;24189:8;24186:21;24178:270;;;24258:4;24254:1;24250:6;24246:17;24240:4;24237:27;24234:53;;;24267:18;;:::i;:::-;24317:7;24307:8;24303:22;24300:55;;;24337:16;;;;24300:55;24416:22;;;;24376:15;;;;24178:270;;;24182:3;24032:422;;;;;:::o;24459:806::-;24508:5;24538:8;24528:80;;-1:-1:-1;24579:1:2;24593:5;;24528:80;24627:4;24617:76;;-1:-1:-1;24664:1:2;24678:5;;24617:76;24709:4;24727:1;24722:59;;;;24795:1;24790:130;;;;24702:218;;24722:59;24752:1;24743:10;;24766:5;;;24790:130;24827:3;24817:8;24814:17;24811:43;;;24834:18;;:::i;:::-;-1:-1:-1;;24890:1:2;24876:16;;24905:5;;24702:218;;25004:2;24994:8;24991:16;24985:3;24979:4;24976:13;24972:36;24966:2;24956:8;24953:16;24948:2;24942:4;24939:12;24935:35;24932:77;24929:159;;;-1:-1:-1;25041:19:2;;;25073:5;;24929:159;25120:34;25145:8;25139:4;25120:34;:::i;:::-;25190:6;25186:1;25182:6;25178:19;25169:7;25166:32;25163:58;;;25201:18;;:::i;:::-;25239:20;;24459:806;-1:-1:-1;;;24459:806:2:o;25270:131::-;25330:5;25359:36;25386:8;25380:4;25359:36;:::i;25406:332::-;25613:6;25602:9;25595:25;25656:2;25651;25640:9;25636:18;25629:30;25576:4;25676:56;25728:2;25717:9;25713:18;25705:6;25676:56;:::i;25743:881::-;25838:6;25869:2;25912;25900:9;25891:7;25887:23;25883:32;25880:52;;;25928:1;25925;25918:12;25880:52;25961:9;25955:16;25994:18;25986:6;25983:30;25980:50;;;26026:1;26023;26016:12;25980:50;26049:22;;26102:4;26094:13;;26090:27;-1:-1:-1;26080:55:2;;26131:1;26128;26121:12;26080:55;26160:2;26154:9;26183:60;26199:43;26239:2;26199:43;:::i;26183:60::-;26277:15;;;26359:1;26355:10;;;;26347:19;;26343:28;;;26308:12;;;;26383:19;;;26380:39;;;26415:1;26412;26405:12;26380:39;26439:11;;;;26459:135;26475:6;26470:3;26467:15;26459:135;;;26541:10;;26529:23;;26492:12;;;;26572;;;;26459:135;;27416:168;27489:9;;;27520;;27537:15;;;27531:22;;27517:37;27507:71;;27558:18;;:::i;27589:127::-;27650:10;27645:3;27641:20;27638:1;27631:31;27681:4;27678:1;27671:15;27705:4;27702:1;27695:15;27721:120;27761:1;27787;27777:35;;27792:18;;:::i;:::-;-1:-1:-1;27826:9:2;;27721:120::o;28248:125::-;28313:9;;;28334:10;;;28331:36;;;28347:18;;:::i;28734:548::-;28846:4;28875:2;28904;28893:9;28886:21;28936:6;28930:13;28979:6;28974:2;28963:9;28959:18;28952:34;29004:1;29014:140;29028:6;29025:1;29022:13;29014:140;;;29123:14;;;29119:23;;29113:30;29089:17;;;29108:2;29085:26;29078:66;29043:10;;29014:140;;;29018:3;29203:1;29198:2;29189:6;29178:9;29174:22;29170:31;29163:42;29273:2;29266;29262:7;29257:2;29249:6;29245:15;29241:29;29230:9;29226:45;29222:54;29214:62;;;;28734:548;;;;:::o;29287:112::-;29319:1;29345;29335:35;;29350:18;;:::i;:::-;-1:-1:-1;29384:9:2;;29287:112::o;29404:127::-;29465:10;29460:3;29456:20;29453:1;29446:31;29496:4;29493:1;29486:15;29520:4;29517:1;29510:15
Swarm Source
ipfs://145465267eaf4992ccd6077c956eb8eacdc1a3f30080ae52bb4cd9ae42cf2e61
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.