ETH Price: $3,244.61 (+3.32%)
 

Overview

ETH Balance

0.041838792656097339 ETH

Eth Value

$135.75 (@ $3,244.61/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Payback167035412023-02-25 6:31:11705 days ago1677306671IN
0x5139a056...75f7a6C13
0.20476098 ETH0.0019696921.5613767
Loan Ether165179372023-01-30 6:45:59731 days ago1675061159IN
0x5139a056...75f7a6C13
0 ETH0.0065444315.69879502
Update Native To...164272852023-01-17 15:01:23744 days ago1673967683IN
0x5139a056...75f7a6C13
0 ETH0.0012043738.25484252
Payback164051142023-01-14 12:42:23747 days ago1673700143IN
0x5139a056...75f7a6C13
0.21233375 ETH0.0016680218.259089
Loan Ether163996242023-01-13 18:20:35748 days ago1673634035IN
0x5139a056...75f7a6C13
0 ETH0.0125339930.06654969
Payback163647222023-01-08 21:21:11753 days ago1673212871IN
0x5139a056...75f7a6C13
0.15346131 ETH0.0019244521.0661756
Loan Ether163114932023-01-01 11:03:11760 days ago1672570991IN
0x5139a056...75f7a6C13
0 ETH0.0058548914.04472252
Payback162892942022-12-29 8:42:47763 days ago1672303367IN
0x5139a056...75f7a6C13
0.27452319 ETH0.0014316515.67167219
Loan Ether162773312022-12-27 16:39:35765 days ago1672159175IN
0x5139a056...75f7a6C13
0 ETH0.0089784921.53762321
Payback162290292022-12-20 22:55:35771 days ago1671576935IN
0x5139a056...75f7a6C13
0.61981965 ETH0.0018746214.93234432
Loan Ether162129562022-12-18 17:04:59774 days ago1671383099IN
0x5139a056...75f7a6C13
0 ETH0.0080420412.88772804
Loan Ether162113962022-12-18 11:52:11774 days ago1671364331IN
0x5139a056...75f7a6C13
0 ETH0.0078736115.66938758
Transfer162052092022-12-17 15:07:47775 days ago1671289667IN
0x5139a056...75f7a6C13
2.5 ETH0.0003333914.89448508
Add Loan Pool161984442022-12-16 16:26:47776 days ago1671208007IN
0x5139a056...75f7a6C13
0 ETH0.0073745428.22726369
Add Loan Pool161984422022-12-16 16:26:23776 days ago1671207983IN
0x5139a056...75f7a6C13
0 ETH0.0076173429.43265999
Add Loan Pool161984392022-12-16 16:25:47776 days ago1671207947IN
0x5139a056...75f7a6C13
0 ETH0.0074626129.11037296
Add Loan Pool161984372022-12-16 16:25:23776 days ago1671207923IN
0x5139a056...75f7a6C13
0 ETH0.0075675729.80461904
Add Loan Pool161984352022-12-16 16:24:59776 days ago1671207899IN
0x5139a056...75f7a6C13
0 ETH0.0073748529.32859703
Add Loan Pool161984302022-12-16 16:23:59776 days ago1671207839IN
0x5139a056...75f7a6C13
0 ETH0.0070921128.48168394
Add Loan Pool161984262022-12-16 16:23:11776 days ago1671207791IN
0x5139a056...75f7a6C13
0 ETH0.007488530.37539519
Add Loan Pool161984242022-12-16 16:22:47776 days ago1671207767IN
0x5139a056...75f7a6C13
0 ETH0.0075380730.88032452
Add Loan Pool161984222022-12-16 16:22:23776 days ago1671207743IN
0x5139a056...75f7a6C13
0 ETH0.0080793630.56049005
Add Loan Pool161984202022-12-16 16:21:59776 days ago1671207719IN
0x5139a056...75f7a6C13
0 ETH0.0078288632.72854297
Add Loan Pool161984182022-12-16 16:21:35776 days ago1671207695IN
0x5139a056...75f7a6C13
0 ETH0.0084530833.29872116

Latest 8 internal transactions

Advanced mode:
Parent Transaction Hash Block
From
To
172961972023-05-19 21:28:59622 days ago1684531739
0x5139a056...75f7a6C13
0.95903623 ETH
172961972023-05-19 21:28:59622 days ago1684531739
0x5139a056...75f7a6C13
0.95903623 ETH
165179372023-01-30 6:45:59731 days ago1675061159
0x5139a056...75f7a6C13
0.19688556 ETH
163996242023-01-13 18:20:35748 days ago1673634035
0x5139a056...75f7a6C13
0.20416706 ETH
163114932023-01-01 11:03:11760 days ago1672570991
0x5139a056...75f7a6C13
0.14755895 ETH
162773312022-12-27 16:39:35765 days ago1672159175
0x5139a056...75f7a6C13
0.26396461 ETH
162129562022-12-18 17:04:59774 days ago1671383099
0x5139a056...75f7a6C13
0.59643099 ETH
162113962022-12-18 11:52:11774 days ago1671364331
0x5139a056...75f7a6C13
0.59598043 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Loan

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 2 : 4_LoanDrop.sol
// 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;
    }
    
}

File 2 of 2 : AggregatorV3Interface.sol
// 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
    );
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"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"}]

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.