Contract 0x4a575d34e645ec94ad0f37d2913a052728ac5ed8

Contract Overview

Balance:
0 MATIC

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x731278da7bf16c6db37cd945aa8ea7a71d6fc4bde15bbd6c75aee169d3acc1cfWithdraw261871032022-05-03 15:48:4419 days 18 hrs ago0xe40521daf71eb20d65aa6ddfed4e29941cbaed9e IN  0x4a575d34e645ec94ad0f37d2913a052728ac5ed80 MATIC0.00007018435 2.425000025
0x651f39aeba4e330464791feef199b93f43d2dca3444cf29d709394fb4c0f1caeUniswap Trade261870732022-05-03 15:46:1419 days 18 hrs ago0xe40521daf71eb20d65aa6ddfed4e29941cbaed9e IN  0x4a575d34e645ec94ad0f37d2913a052728ac5ed80.001 MATIC0.006240975 25
0xeb8077dcce8f88e006fa7b7323840282e9786592ec87c1d7c66f58b0910ce365Flashloan Aave261869172022-05-03 15:33:1119 days 19 hrs ago0xe40521daf71eb20d65aa6ddfed4e29941cbaed9e IN  0x4a575d34e645ec94ad0f37d2913a052728ac5ed80 MATIC0.015332946016 34.000000036
0x7790f6e2974f4b7c6a55050f53f0c47eb1d3dc44371b6a41fd4bdace0bcafc2eFlashloan Swap261867482022-05-03 15:13:4319 days 19 hrs ago0xe40521daf71eb20d65aa6ddfed4e29941cbaed9e IN  0x4a575d34e645ec94ad0f37d2913a052728ac5ed80 MATIC0.010665655 35
0x0ca8af8e12a9515ff58de846c3bc0623db18461fbe78b246cff588162b54ec9aFlashloan Swap261865582022-05-03 14:57:4619 days 19 hrs ago0xe40521daf71eb20d65aa6ddfed4e29941cbaed9e IN  0x4a575d34e645ec94ad0f37d2913a052728ac5ed80 MATIC0.010663975 35
0x19e021a42cfe30f985f4ed74524558697991561f2c5c22001aec2a9c2eb90c3fFlashloan Swap261861382022-05-03 14:19:2719 days 20 hrs ago0xe40521daf71eb20d65aa6ddfed4e29941cbaed9e IN  0x4a575d34e645ec94ad0f37d2913a052728ac5ed80 MATIC0.0118914 50
0xd603d4aa10c28884558d8d4862c161474dddfb217ea8426f7cb5ce094c406019Flashloan Swap261860232022-05-03 14:07:3519 days 20 hrs ago0xe40521daf71eb20d65aa6ddfed4e29941cbaed9e IN  0x4a575d34e645ec94ad0f37d2913a052728ac5ed80 MATIC0.0059457 25
0x46a257e21701d4e53a206d933fba17c561a14e39063c999a238e5b241cdfbffd0x61010060261855502022-05-03 13:27:5119 days 21 hrs ago0xe40521daf71eb20d65aa6ddfed4e29941cbaed9e IN  Create: PolyMultiCallFL0 MATIC0.0633117620
[ Download CSV Export 
Latest 9 internal transactions
Parent Txn Hash Block From To Value
0x731278da7bf16c6db37cd945aa8ea7a71d6fc4bde15bbd6c75aee169d3acc1cf261871032022-05-03 15:48:4419 days 18 hrs ago 0x4a575d34e645ec94ad0f37d2913a052728ac5ed80xe40521daf71eb20d65aa6ddfed4e29941cbaed9e0.059899503793431533 MATIC
0x651f39aeba4e330464791feef199b93f43d2dca3444cf29d709394fb4c0f1cae261870732022-05-03 15:46:1419 days 18 hrs ago 0x4a575d34e645ec94ad0f37d2913a052728ac5ed80xc275dc8be39f50d12f66b6a63629c39da5bae5bd1 wei
0x651f39aeba4e330464791feef199b93f43d2dca3444cf29d709394fb4c0f1cae261870732022-05-03 15:46:1419 days 18 hrs ago 0x4a575d34e645ec94ad0f37d2913a052728ac5ed8 0x9c3c9283d3e44854697cd22d3faa240cfb0328890.001 MATIC
0xeb8077dcce8f88e006fa7b7323840282e9786592ec87c1d7c66f58b0910ce365261869172022-05-03 15:33:1119 days 19 hrs ago 0x4a575d34e645ec94ad0f37d2913a052728ac5ed80xbe188d6641e8b680743a4815dfa0f6208038960f1 wei
0xeb8077dcce8f88e006fa7b7323840282e9786592ec87c1d7c66f58b0910ce365261869172022-05-03 15:33:1119 days 19 hrs ago 0x9c3c9283d3e44854697cd22d3faa240cfb032889 0x4a575d34e645ec94ad0f37d2913a052728ac5ed80.019306379902894828 MATIC
0x7790f6e2974f4b7c6a55050f53f0c47eb1d3dc44371b6a41fd4bdace0bcafc2e261867482022-05-03 15:13:4319 days 19 hrs ago 0x4a575d34e645ec94ad0f37d2913a052728ac5ed80xc275dc8be39f50d12f66b6a63629c39da5bae5bd0.00001 MATIC
0x7790f6e2974f4b7c6a55050f53f0c47eb1d3dc44371b6a41fd4bdace0bcafc2e261867482022-05-03 15:13:4319 days 19 hrs ago 0x9c3c9283d3e44854697cd22d3faa240cfb032889 0x4a575d34e645ec94ad0f37d2913a052728ac5ed80.019958193268042398 MATIC
0x0ca8af8e12a9515ff58de846c3bc0623db18461fbe78b246cff588162b54ec9a261865582022-05-03 14:57:4619 days 19 hrs ago 0x4a575d34e645ec94ad0f37d2913a052728ac5ed80xbe188d6641e8b680743a4815dfa0f6208038960f100 wei
0x0ca8af8e12a9515ff58de846c3bc0623db18461fbe78b246cff588162b54ec9a261865582022-05-03 14:57:4619 days 19 hrs ago 0x9c3c9283d3e44854697cd22d3faa240cfb032889 0x4a575d34e645ec94ad0f37d2913a052728ac5ed80.020644930622494409 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PolyMultiCallFL

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 1 of 3: BundleExecutorPolygon.sol
//SPDX-License-Identifier: agpl-3.0
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

import "./Interfaces.sol";
import "./Libraries.sol";

interface IWETH is IERC20 {
    function deposit() external payable;
    function withdraw(uint) external;
}

abstract contract FlashLoanReceiverBase is IFlashLoanReceiver {
  using SafeERC20 for IERC20;
  using SafeMath for uint256;

  ILendingPoolAddressesProvider public immutable ADDRESSES_PROVIDER;
  ILendingPool public immutable LENDING_POOL;

  constructor(ILendingPoolAddressesProvider provider) public {
    ADDRESSES_PROVIDER = provider;
    LENDING_POOL = ILendingPool(provider.getLendingPool());
  }
}

contract PolyMultiCallFL is FlashLoanReceiverBase, IUniswapV2Callee {
    address private immutable owner;
    address private immutable executor;

    // Testnet
    address private constant SAND = address(0xe11A86849d99F524cAC3E7A0Ec1241828e332C62);
    address public WETH_address = address(0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889);
    IWETH private constant WETH = IWETH(0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889);
    address private constant ETH_address = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
    address private constant UNISWAP_Factory = address(0x5757371414417b8C6CAad45bAeF941aBc7d3Ab32);
    address private constant UNISWAP_Router = address(0x8954AfA98594b838bda56FE4C12a09D7739D179b);

    // Mainnet
    // address private constant SAND = address(0xBbba073C31bF03b8ACf7c28EF0738DeCF3695683);
    // address public WETH_address = address(0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270);
    // IWETH private constant WETH = IWETH(0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270);
    // address private constant ETH_address = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
    // address private constant UNISWAP_Factory = address(0x5757371414417b8C6CAad45bAeF941aBc7d3Ab32);
    // address private constant UNISWAP_Router = address(0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff);
    
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    modifier onlyExecutor() {
        require(msg.sender == executor);
        _;
    }

    constructor(ILendingPoolAddressesProvider _addressProvider) FlashLoanReceiverBase(_addressProvider) public payable {
        owner = msg.sender;
        executor = msg.sender;
    }


    function flashloanParams(address _baseToken, uint256 _amountToFirstMarket, bytes memory _params, uint256 _totalDebt) internal {
        (uint256 _ethAmountToCoinbase, address[] memory _targets, bytes[] memory _payloads) = abi.decode(_params, (uint256, address[], bytes[]));
        require(_targets.length == _payloads.length, "len target != payload");
        IERC20 TOKEN = IERC20(_baseToken);
        uint256 _wethBalanceBefore = TOKEN.balanceOf(address(this));
        TOKEN.transfer(_targets[0], _amountToFirstMarket);
        uint256 len = _targets.length;
        for (uint256 i = 0; i < len; ++i) {
            (bool _success, /* bytes memory _response */) = _targets[i].call(_payloads[i]);
            require(_success); 
        }
        uint256 _wethBalanceAfter = TOKEN.balanceOf(address(this));
        require(_wethBalanceAfter > _wethBalanceBefore + _ethAmountToCoinbase + _totalDebt);
        uint256 _profit = _wethBalanceAfter - _totalDebt - _ethAmountToCoinbase;

        if (_ethAmountToCoinbase > 0) {
            if (_baseToken == WETH_address) {
                WETH.withdraw(_ethAmountToCoinbase + _profit);
            } else {
                TOKEN.approve(UNISWAP_Router, _ethAmountToCoinbase);

                address[] memory path = new address[](2);
                path[0] = _baseToken;
                path[1] = WETH_address;
                
                uint256[] memory _amountOutWETH = IUniswapV2Router(UNISWAP_Router).getAmountsOut(_ethAmountToCoinbase, path);
                IUniswapV2Router(UNISWAP_Router).swapExactTokensForTokens(_ethAmountToCoinbase, _amountOutWETH[0], path, address(this), block.timestamp);
                _ethAmountToCoinbase = _amountOutWETH[0];
                WETH.withdraw(_ethAmountToCoinbase);
            }
            (bool _success, ) = block.coinbase.call{value: _ethAmountToCoinbase}(new bytes(0));
            require(_success);
        }
    }

    /* 
        Aave Flashloan
    */

    function flashloanAave(address borrowedTokenAddress, uint256 amountToBorrow, bytes memory _params) external onlyExecutor {
        address receiverAddress = address(this);

        address[] memory assets = new address[](1);
        assets[0] = borrowedTokenAddress;
        uint256[] memory amounts = new uint256[](1);
        amounts[0] = amountToBorrow;
        uint256[] memory modes = new uint256[](1);
        modes[0] = 0;
        address onBehalfOf = address(this);
        uint16 referralCode = 0;
        LENDING_POOL.flashLoan(
            receiverAddress,
            assets,
            amounts,
            modes,
            onBehalfOf,
            _params,
            referralCode
        );
    }


    function executeOperation(
        address[] calldata assets,
        uint256[] calldata amounts,
        uint256[] calldata premiums,
        address /* initiator */,
        bytes calldata params
    )
        external
        override
        returns (bool)
    {
        address pool_address = address(LENDING_POOL);
        require(msg.sender == pool_address);
        uint amountOwing = amounts[0].add(premiums[0]);
        flashloanParams(assets[0], amounts[0], params, amountOwing);
        WETH.approve(pool_address, amountOwing);
        return true;
    }

    /* 
        QuickSwap Flashloan
    */

    function flashloanSwap(address borrowedTokenAddress, uint256 amountToBorrow, bytes memory _params) external onlyExecutor {
        address pair;
        if (borrowedTokenAddress == WETH_address || borrowedTokenAddress == SAND) {
            // WMATIC-USDC
            pair = address(0xabd99B35a91dD3e4BC02dca75730F9E337662519);
        } else {
            pair = IUniswapV2Factory(UNISWAP_Factory).getPair(borrowedTokenAddress, address(WETH_address));
            require(pair != address(0), "!pair");
        }
        address token0 = IUniswapV2Pair(pair).token0();
        address token1 = IUniswapV2Pair(pair).token1();
        uint amount0Out = borrowedTokenAddress == token0 ? amountToBorrow : 0;
        uint amount1Out = borrowedTokenAddress == token1 ? amountToBorrow : 0;
        

        bytes memory data = abi.encode(borrowedTokenAddress, amountToBorrow, _params);

        IUniswapV2Pair(pair).swap(amount0Out, amount1Out, address(this), data);
    }


    function uniswapV2Call(
        address _sender,
        uint /* _amount0 */,
        uint /* _amount1 */,
        bytes calldata _data
    ) external override {
        address token0 = IUniswapV2Pair(msg.sender).token0();
        address token1 = IUniswapV2Pair(msg.sender).token1();
        address pair = IUniswapV2Factory(UNISWAP_Factory).getPair(token0, token1);

        require(msg.sender == pair, "!pair");
        require(_sender == address(this), "!sender");

        (address borrowedTokenAddress, uint amountToBorrow, bytes memory _params) = abi.decode(_data, (address, uint, bytes));

        uint fee = ((amountToBorrow * 3) / 997) + 1;
        uint amountToRepay = amountToBorrow + fee;

        flashloanParams(borrowedTokenAddress, amountToBorrow, _params, amountToRepay);
        IERC20(borrowedTokenAddress).transfer(pair, amountToRepay);
    }

    /* 
        Simple Trade
    */


    function uniswapTrade(address _baseToken, uint256 _wethAmountToFirstMarket, uint256 _ethAmountToCoinbase, address[] memory _targets, bytes[] memory _payloads) external payable onlyExecutor {
        require(_targets.length == _payloads.length, "len target != payload");

        IERC20 TOKEN = IERC20(_baseToken);
        
        if (msg.value > 0) {    
            WETH.deposit{value : msg.value}();
        } 

        uint256 _wethBalanceBefore = TOKEN.balanceOf(address(this));
        if (_baseToken == WETH_address && _wethBalanceBefore < _wethAmountToFirstMarket) { 
            WETH.deposit{value : _wethAmountToFirstMarket - _wethBalanceBefore}();
        }
        
        uint256 len = _targets.length;
        TOKEN.transfer(_targets[0], _wethAmountToFirstMarket);
        for (uint256 i = 0; i < len; ++i) {
            (bool _success, ) = _targets[i].call(_payloads[i]);
            require(_success); 
        }

        uint256 _wethBalanceAfter = TOKEN.balanceOf(address(this));
        require(_wethBalanceAfter > _wethBalanceBefore + _ethAmountToCoinbase);

        if (_ethAmountToCoinbase > 0) {
            if (_baseToken == WETH_address) {
                uint256 _ethBalance = address(this).balance;
                if (_ethBalance < _ethAmountToCoinbase) {
                    WETH.withdraw(_ethAmountToCoinbase - _ethBalance);
                }
            } else {
                TOKEN.approve(UNISWAP_Router, _ethAmountToCoinbase);
                
                address[] memory path = new address[](2);
                path[0] = _baseToken;
                path[1] = WETH_address;
                
                uint256[] memory _amountOutWETH = IUniswapV2Router(UNISWAP_Router).getAmountsOut(_ethAmountToCoinbase, path);
                IUniswapV2Router(UNISWAP_Router).swapExactTokensForTokens(_ethAmountToCoinbase, _amountOutWETH[0], path, address(this), block.timestamp);
                _ethAmountToCoinbase = _amountOutWETH[0];
                WETH.withdraw(_ethAmountToCoinbase);
            }
            (bool _success, ) = block.coinbase.call{value: _ethAmountToCoinbase}(new bytes(0));
            require(_success);
        }
    }

    function call(address payable _to, uint256 _value, bytes calldata _data) external onlyOwner payable returns (bytes memory) {
        require(_to != address(0));
        (bool _success, bytes memory _result) = payable(_to).call{value: _value}(_data);
        require(_success);
        return _result;
    }

    receive() external payable {
    }

    function withdraw(address token) external onlyOwner {
        if (token == ETH_address) {
            payable(msg.sender).transfer(address(this).balance);
        } else if (token != ETH_address) {
            uint256 bal = IERC20(token).balanceOf(address(this));
            IERC20(token).transfer(msg.sender, bal);
        }
    }
}

File 2 of 3: Interfaces.sol
// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

import "./Libraries.sol";

interface IUniswapV2Callee {
    function uniswapV2Call(address sender, uint amount0, uint amount1, bytes calldata data) external;
}

interface IUniswapV2Pair {
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
}

interface IUniswapV2Factory {
    function getPair(address tokenA, address tokenB) external view returns (address pair);
}

interface IUniswapV2Router {
  function getAmountsOut(uint256 amountIn, address[] memory path)
    external
    view
    returns (uint256[] memory amounts);
  
  function swapExactTokensForTokens(
  
    //amount of tokens we are sending in
    uint256 amountIn,
    //the minimum amount of tokens we want out of the trade
    uint256 amountOutMin,
    //list of token addresses we are going to trade in.  this is necessary to calculate amounts
    address[] calldata path,
    //this is the address we are going to send the output tokens to
    address to,
    //the last time that the trade is valid for
    uint256 deadline
  ) external returns (uint256[] memory amounts);
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
  /**
   * @dev Returns the amount of tokens in existence.
   */
  function totalSupply() external view returns (uint256);

  /**
   * @dev Returns the amount of tokens owned by `account`.
   */
  function balanceOf(address account) external view returns (uint256);

  /**
   * @dev Moves `amount` tokens from the caller's account to `recipient`.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transfer(address recipient, uint256 amount) external returns (bool);

  /**
   * @dev Returns the remaining number of tokens that `spender` will be
   * allowed to spend on behalf of `owner` through {transferFrom}. This is
   * zero by default.
   *
   * This value changes when {approve} or {transferFrom} are called.
   */
  function allowance(address owner, address spender) external view returns (uint256);

  /**
   * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * IMPORTANT: Beware that changing an allowance with this method brings the risk
   * that someone may use both the old and the new allowance by unfortunate
   * transaction ordering. One possible solution to mitigate this race
   * condition is to first reduce the spender's allowance to 0 and set the
   * desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   *
   * Emits an {Approval} event.
   */
  function approve(address spender, uint256 amount) external returns (bool);

  /**
   * @dev Moves `amount` tokens from `sender` to `recipient` using the
   * allowance mechanism. `amount` is then deducted from the caller's
   * allowance.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transferFrom(
    address sender,
    address recipient,
    uint256 amount
  ) external returns (bool);

  /**
   * @dev Emitted when `value` tokens are moved from one account (`from`) to
   * another (`to`).
   *
   * Note that `value` may be zero.
   */
  event Transfer(address indexed from, address indexed to, uint256 value);

  /**
   * @dev Emitted when the allowance of a `spender` for an `owner` is set by
   * a call to {approve}. `value` is the new allowance.
   */
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IFlashLoanReceiver {
  function executeOperation(
    address[] calldata assets,
    uint256[] calldata amounts,
    uint256[] calldata premiums,
    address initiator,
    bytes calldata params
  ) external returns (bool);
}

/**
 * @title LendingPoolAddressesProvider contract
 * @dev Main registry of addresses part of or connected to the protocol, including permissioned roles
 * - Acting also as factory of proxies and admin of those, so with right to change its implementations
 * - Owned by the Aave Governance
 * @author Aave
 **/
interface ILendingPoolAddressesProvider {
  event LendingPoolUpdated(address indexed newAddress);
  event ConfigurationAdminUpdated(address indexed newAddress);
  event EmergencyAdminUpdated(address indexed newAddress);
  event LendingPoolConfiguratorUpdated(address indexed newAddress);
  event LendingPoolCollateralManagerUpdated(address indexed newAddress);
  event PriceOracleUpdated(address indexed newAddress);
  event LendingRateOracleUpdated(address indexed newAddress);
  event ProxyCreated(bytes32 id, address indexed newAddress);
  event AddressSet(bytes32 id, address indexed newAddress, bool hasProxy);

  function setAddress(bytes32 id, address newAddress) external;

  function setAddressAsProxy(bytes32 id, address impl) external;

  function getAddress(bytes32 id) external view returns (address);

  function getLendingPool() external view returns (address);

  function setLendingPoolImpl(address pool) external;

  function getLendingPoolConfigurator() external view returns (address);

  function setLendingPoolConfiguratorImpl(address configurator) external;

  function getLendingPoolCollateralManager() external view returns (address);

  function setLendingPoolCollateralManager(address manager) external;

  function getPoolAdmin() external view returns (address);

  function setPoolAdmin(address admin) external;

  function getEmergencyAdmin() external view returns (address);

  function setEmergencyAdmin(address admin) external;

  function getPriceOracle() external view returns (address);

  function setPriceOracle(address priceOracle) external;

  function getLendingRateOracle() external view returns (address);

  function setLendingRateOracle(address lendingRateOracle) external;
}

interface ILendingPool {
  /**
   * @dev Emitted on deposit()
   * @param reserve The address of the underlying asset of the reserve
   * @param user The address initiating the deposit
   * @param onBehalfOf The beneficiary of the deposit, receiving the aTokens
   * @param amount The amount deposited
   * @param referral The referral code used
   **/
  event Deposit(
    address indexed reserve,
    address user,
    address indexed onBehalfOf,
    uint256 amount,
    uint16 indexed referral
  );

  /**
   * @dev Emitted on withdraw()
   * @param reserve The address of the underlyng asset being withdrawn
   * @param user The address initiating the withdrawal, owner of aTokens
   * @param to Address that will receive the underlying
   * @param amount The amount to be withdrawn
   **/
  event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount);

  /**
   * @dev Emitted on borrow() and flashLoan() when debt needs to be opened
   * @param reserve The address of the underlying asset being borrowed
   * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just
   * initiator of the transaction on flashLoan()
   * @param onBehalfOf The address that will be getting the debt
   * @param amount The amount borrowed out
   * @param borrowRateMode The rate mode: 1 for Stable, 2 for Variable
   * @param borrowRate The numeric rate at which the user has borrowed
   * @param referral The referral code used
   **/
  event Borrow(
    address indexed reserve,
    address user,
    address indexed onBehalfOf,
    uint256 amount,
    uint256 borrowRateMode,
    uint256 borrowRate,
    uint16 indexed referral
  );

  /**
   * @dev Emitted on repay()
   * @param reserve The address of the underlying asset of the reserve
   * @param user The beneficiary of the repayment, getting his debt reduced
   * @param repayer The address of the user initiating the repay(), providing the funds
   * @param amount The amount repaid
   **/
  event Repay(
    address indexed reserve,
    address indexed user,
    address indexed repayer,
    uint256 amount
  );

  /**
   * @dev Emitted on swapBorrowRateMode()
   * @param reserve The address of the underlying asset of the reserve
   * @param user The address of the user swapping his rate mode
   * @param rateMode The rate mode that the user wants to swap to
   **/
  event Swap(address indexed reserve, address indexed user, uint256 rateMode);

  /**
   * @dev Emitted on setUserUseReserveAsCollateral()
   * @param reserve The address of the underlying asset of the reserve
   * @param user The address of the user enabling the usage as collateral
   **/
  event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user);

  /**
   * @dev Emitted on setUserUseReserveAsCollateral()
   * @param reserve The address of the underlying asset of the reserve
   * @param user The address of the user enabling the usage as collateral
   **/
  event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user);

  /**
   * @dev Emitted on rebalanceStableBorrowRate()
   * @param reserve The address of the underlying asset of the reserve
   * @param user The address of the user for which the rebalance has been executed
   **/
  event RebalanceStableBorrowRate(address indexed reserve, address indexed user);

  /**
   * @dev Emitted on flashLoan()
   * @param target The address of the flash loan receiver contract
   * @param initiator The address initiating the flash loan
   * @param asset The address of the asset being flash borrowed
   * @param amount The amount flash borrowed
   * @param premium The fee flash borrowed
   * @param referralCode The referral code used
   **/
  event FlashLoan(
    address indexed target,
    address indexed initiator,
    address indexed asset,
    uint256 amount,
    uint256 premium,
    uint16 referralCode
  );

  /**
   * @dev Emitted when the pause is triggered.
   */
  event Paused();

  /**
   * @dev Emitted when the pause is lifted.
   */
  event Unpaused();

  /**
   * @dev Emitted when a borrower is liquidated. This event is emitted by the LendingPool via
   * LendingPoolCollateral manager using a DELEGATECALL
   * This allows to have the events in the generated ABI for LendingPool.
   * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation
   * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation
   * @param user The address of the borrower getting liquidated
   * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover
   * @param liquidatedCollateralAmount The amount of collateral received by the liiquidator
   * @param liquidator The address of the liquidator
   * @param receiveAToken `true` if the liquidators wants to receive the collateral aTokens, `false` if he wants
   * to receive the underlying collateral asset directly
   **/
  event LiquidationCall(
    address indexed collateralAsset,
    address indexed debtAsset,
    address indexed user,
    uint256 debtToCover,
    uint256 liquidatedCollateralAmount,
    address liquidator,
    bool receiveAToken
  );

  /**
   * @dev Emitted when the state of a reserve is updated. NOTE: This event is actually declared
   * in the ReserveLogic library and emitted in the updateInterestRates() function. Since the function is internal,
   * the event will actually be fired by the LendingPool contract. The event is therefore replicated here so it
   * gets added to the LendingPool ABI
   * @param reserve The address of the underlying asset of the reserve
   * @param liquidityRate The new liquidity rate
   * @param stableBorrowRate The new stable borrow rate
   * @param variableBorrowRate The new variable borrow rate
   * @param liquidityIndex The new liquidity index
   * @param variableBorrowIndex The new variable borrow index
   **/
  event ReserveDataUpdated(
    address indexed reserve,
    uint256 liquidityRate,
    uint256 stableBorrowRate,
    uint256 variableBorrowRate,
    uint256 liquidityIndex,
    uint256 variableBorrowIndex
  );

  /**
   * @dev Deposits an `amount` of underlying asset into the reserve, receiving in return overlying aTokens.
   * - E.g. User deposits 100 USDC and gets in return 100 aUSDC
   * @param asset The address of the underlying asset to deposit
   * @param amount The amount to be deposited
   * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user
   *   wants to receive them on his own wallet, or a different address if the beneficiary of aTokens
   *   is a different wallet
   * @param referralCode Code used to register the integrator originating the operation, for potential rewards.
   *   0 if the action is executed directly by the user, without any middle-man
   **/
  function deposit(
    address asset,
    uint256 amount,
    address onBehalfOf,
    uint16 referralCode
  ) external;

  /**
   * @dev Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned
   * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC
   * @param asset The address of the underlying asset to withdraw
   * @param amount The underlying amount to be withdrawn
   *   - Send the value type(uint256).max in order to withdraw the whole aToken balance
   * @param to Address that will receive the underlying, same as msg.sender if the user
   *   wants to receive it on his own wallet, or a different address if the beneficiary is a
   *   different wallet
   **/
  function withdraw(
    address asset,
    uint256 amount,
    address to
  ) external;

  /**
   * @dev Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower
   * already deposited enough collateral, or he was given enough allowance by a credit delegator on the
   * corresponding debt token (StableDebtToken or VariableDebtToken)
   * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet
   *   and 100 stable/variable debt tokens, depending on the `interestRateMode`
   * @param asset The address of the underlying asset to borrow
   * @param amount The amount to be borrowed
   * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable
   * @param referralCode Code used to register the integrator originating the operation, for potential rewards.
   *   0 if the action is executed directly by the user, without any middle-man
   * @param onBehalfOf Address of the user who will receive the debt. Should be the address of the borrower itself
   * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator
   * if he has been given credit delegation allowance
   **/
  function borrow(
    address asset,
    uint256 amount,
    uint256 interestRateMode,
    uint16 referralCode,
    address onBehalfOf
  ) external;

  /**
   * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned
   * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address
   * @param asset The address of the borrowed underlying asset previously borrowed
   * @param amount The amount to repay
   * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode`
   * @param rateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable
   * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the
   * user calling the function if he wants to reduce/remove his own debt, or the address of any other
   * other borrower whose debt should be removed
   **/
  function repay(
    address asset,
    uint256 amount,
    uint256 rateMode,
    address onBehalfOf
  ) external;

  /**
   * @dev Allows a borrower to swap his debt between stable and variable mode, or viceversa
   * @param asset The address of the underlying asset borrowed
   * @param rateMode The rate mode that the user wants to swap to
   **/
  function swapBorrowRateMode(address asset, uint256 rateMode) external;

  /**
   * @dev Rebalances the stable interest rate of a user to the current stable rate defined on the reserve.
   * - Users can be rebalanced if the following conditions are satisfied:
   *     1. Usage ratio is above 95%
   *     2. the current deposit APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too much has been
   *        borrowed at a stable rate and depositors are not earning enough
   * @param asset The address of the underlying asset borrowed
   * @param user The address of the user to be rebalanced
   **/
  function rebalanceStableBorrowRate(address asset, address user) external;

  /**
   * @dev Allows depositors to enable/disable a specific deposited asset as collateral
   * @param asset The address of the underlying asset deposited
   * @param useAsCollateral `true` if the user wants to use the deposit as collateral, `false` otherwise
   **/
  function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external;

  /**
   * @dev Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1
   * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives
   *   a proportionally amount of the `collateralAsset` plus a bonus to cover market risk
   * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation
   * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation
   * @param user The address of the borrower getting liquidated
   * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover
   * @param receiveAToken `true` if the liquidators wants to receive the collateral aTokens, `false` if he wants
   * to receive the underlying collateral asset directly
   **/
  function liquidationCall(
    address collateralAsset,
    address debtAsset,
    address user,
    uint256 debtToCover,
    bool receiveAToken
  ) external;

  /**
   * @dev Allows smartcontracts to access the liquidity of the pool within one transaction,
   * as long as the amount taken plus a fee is returned.
   * IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept into consideration.
   * For further details please visit https://developers.aave.com
   * @param receiverAddress The address of the contract receiving the funds, implementing the IFlashLoanReceiver interface
   * @param assets The addresses of the assets being flash-borrowed
   * @param amounts The amounts amounts being flash-borrowed
   * @param modes Types of the debt to open if the flash loan is not returned:
   *   0 -> Don't open any debt, just revert if funds can't be transferred from the receiver
   *   1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address
   *   2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address
   * @param onBehalfOf The address  that will receive the debt in the case of using on `modes` 1 or 2
   * @param params Variadic packed params to pass to the receiver as extra information
   * @param referralCode Code used to register the integrator originating the operation, for potential rewards.
   *   0 if the action is executed directly by the user, without any middle-man
   **/
  function flashLoan(
    address receiverAddress,
    address[] calldata assets,
    uint256[] calldata amounts,
    uint256[] calldata modes,
    address onBehalfOf,
    bytes calldata params,
    uint16 referralCode
  ) external;

  /**
   * @dev Returns the user account data across all the reserves
   * @param user The address of the user
   * @return totalCollateralETH the total collateral in ETH of the user
   * @return totalDebtETH the total debt in ETH of the user
   * @return availableBorrowsETH the borrowing power left of the user
   * @return currentLiquidationThreshold the liquidation threshold of the user
   * @return ltv the loan to value of the user
   * @return healthFactor the current health factor of the user
   **/
  function getUserAccountData(address user)
    external
    view
    returns (
      uint256 totalCollateralETH,
      uint256 totalDebtETH,
      uint256 availableBorrowsETH,
      uint256 currentLiquidationThreshold,
      uint256 ltv,
      uint256 healthFactor
    );

  function initReserve(
    address reserve,
    address aTokenAddress,
    address stableDebtAddress,
    address variableDebtAddress,
    address interestRateStrategyAddress
  ) external;

  function setReserveInterestRateStrategyAddress(address reserve, address rateStrategyAddress)
    external;

  function setConfiguration(address reserve, uint256 configuration) external;

  /**
   * @dev Returns the configuration of the reserve
   * @param asset The address of the underlying asset of the reserve
   * @return The configuration of the reserve
   **/
  function getConfiguration(address asset) external view returns (DataTypes.ReserveConfigurationMap memory);

  /**
   * @dev Returns the configuration of the user across all the reserves
   * @param user The user address
   * @return The configuration of the user
   **/
  function getUserConfiguration(address user) external view returns (DataTypes.UserConfigurationMap memory);

  /**
   * @dev Returns the normalized income normalized income of the reserve
   * @param asset The address of the underlying asset of the reserve
   * @return The reserve's normalized income
   */
  function getReserveNormalizedIncome(address asset) external view returns (uint256);

  /**
   * @dev Returns the normalized variable debt per unit of asset
   * @param asset The address of the underlying asset of the reserve
   * @return The reserve normalized variable debt
   */
  function getReserveNormalizedVariableDebt(address asset) external view returns (uint256);

  /**
   * @dev Returns the state and configuration of the reserve
   * @param asset The address of the underlying asset of the reserve
   * @return The state of the reserve
   **/
  function getReserveData(address asset) external view returns (DataTypes.ReserveData memory);

  function finalizeTransfer(
    address asset,
    address from,
    address to,
    uint256 amount,
    uint256 balanceFromAfter,
    uint256 balanceToBefore
  ) external;

  function getReservesList() external view returns (address[] memory);

  function getAddressesProvider() external view returns (ILendingPoolAddressesProvider);

  function setPause(bool val) external;

  function paused() external view returns (bool);
} 

File 3 of 3: Libraries.sol
// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

import "./Interfaces.sol";

library SafeMath {
  /**
   * @dev Returns the addition of two unsigned integers, reverting on
   * overflow.
   *
   * Counterpart to Solidity's `+` operator.
   *
   * Requirements:
   * - Addition cannot overflow.
   */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a, 'SafeMath: addition overflow');

    return c;
  }

  /**
   * @dev Returns the subtraction of two unsigned integers, reverting on
   * overflow (when the result is negative).
   *
   * Counterpart to Solidity's `-` operator.
   *
   * Requirements:
   * - Subtraction cannot overflow.
   */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    return sub(a, b, 'SafeMath: subtraction overflow');
  }

  /**
   * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
   * overflow (when the result is negative).
   *
   * Counterpart to Solidity's `-` operator.
   *
   * Requirements:
   * - Subtraction cannot overflow.
   */
  function sub(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b <= a, errorMessage);
    uint256 c = a - b;

    return c;
  }

  /**
   * @dev Returns the multiplication of two unsigned integers, reverting on
   * overflow.
   *
   * Counterpart to Solidity's `*` operator.
   *
   * Requirements:
   * - Multiplication cannot overflow.
   */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
    if (a == 0) {
      return 0;
    }

    uint256 c = a * b;
    require(c / a == b, 'SafeMath: multiplication overflow');

    return c;
  }

  /**
   * @dev Returns the integer division of two unsigned integers. Reverts on
   * division by zero. The result is rounded towards zero.
   *
   * Counterpart to Solidity's `/` operator. Note: this function uses a
   * `revert` opcode (which leaves remaining gas untouched) while Solidity
   * uses an invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   * - The divisor cannot be zero.
   */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    return div(a, b, 'SafeMath: division by zero');
  }

  /**
   * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
   * division by zero. The result is rounded towards zero.
   *
   * Counterpart to Solidity's `/` operator. Note: this function uses a
   * `revert` opcode (which leaves remaining gas untouched) while Solidity
   * uses an invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   * - The divisor cannot be zero.
   */
  function div(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    // Solidity only automatically asserts when dividing by 0
    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;
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * Reverts when dividing by zero.
   *
   * Counterpart to Solidity's `%` operator. This function uses a `revert`
   * opcode (which leaves remaining gas untouched) while Solidity uses an
   * invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   * - The divisor cannot be zero.
   */
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    return mod(a, b, 'SafeMath: modulo by zero');
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * Reverts with custom message when dividing by zero.
   *
   * Counterpart to Solidity's `%` operator. This function uses a `revert`
   * opcode (which leaves remaining gas untouched) while Solidity uses an
   * invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   * - The divisor cannot be zero.
   */
  function mod(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b != 0, errorMessage);
    return a % b;
  }
}

library Address {
  /**
   * @dev Returns true if `account` is a contract.
   *
   * [IMPORTANT]
   * ====
   * It is unsafe to assume that an address for which this function returns
   * false is an externally-owned account (EOA) and not a contract.
   *
   * Among others, `isContract` will return false for the following
   * types of addresses:
   *
   *  - an externally-owned account
   *  - a contract in construction
   *  - an address where a contract will be created
   *  - an address where a contract lived, but was destroyed
   * ====
   */
  function isContract(address account) internal view returns (bool) {
    // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
    // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
    // for accounts without code, i.e. `keccak256('')`
    bytes32 codehash;
    bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
    // solhint-disable-next-line no-inline-assembly
    assembly {
      codehash := extcodehash(account)
    }
    return (codehash != accountHash && codehash != 0x0);
  }

  /**
   * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
   * `recipient`, forwarding all available gas and reverting on errors.
   *
   * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
   * of certain opcodes, possibly making contracts go over the 2300 gas limit
   * imposed by `transfer`, making them unable to receive funds via
   * `transfer`. {sendValue} removes this limitation.
   *
   * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
   *
   * IMPORTANT: because control is transferred to `recipient`, care must be
   * taken to not create reentrancy vulnerabilities. Consider using
   * {ReentrancyGuard} or the
   * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
   */
  function sendValue(address payable recipient, uint256 amount) internal {
    require(address(this).balance >= amount, 'Address: insufficient balance');

    // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
    (bool success, ) = recipient.call{value: amount}('');
    require(success, 'Address: unable to send value, recipient may have reverted');
  }
}



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
  using SafeMath for uint256;
  using Address for address;

  function safeTransfer(
    IERC20 token,
    address to,
    uint256 value
  ) internal {
    callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
  }

  function safeTransferFrom(
    IERC20 token,
    address from,
    address to,
    uint256 value
  ) internal {
    callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
  }

  function safeApprove(
    IERC20 token,
    address spender,
    uint256 value
  ) internal {
    require(
      (value == 0) || (token.allowance(address(this), spender) == 0),
      'SafeERC20: approve from non-zero to non-zero allowance'
    );
    callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
  }

  function callOptionalReturn(IERC20 token, bytes memory data) private {
    require(address(token).isContract(), 'SafeERC20: call to non-contract');

    // solhint-disable-next-line avoid-low-level-calls
    (bool success, bytes memory returndata) = address(token).call(data);
    require(success, 'SafeERC20: low-level call failed');

    if (returndata.length > 0) {
      // Return data is optional
      // solhint-disable-next-line max-line-length
      require(abi.decode(returndata, (bool)), 'SafeERC20: ERC20 operation did not succeed');
    }
  }
}

library DataTypes {
  // refer to the whitepaper, section 1.1 basic concepts for a formal description of these properties.
  struct ReserveData {
    //stores the reserve configuration
    ReserveConfigurationMap configuration;
    //the liquidity index. Expressed in ray
    uint128 liquidityIndex;
    //variable borrow index. Expressed in ray
    uint128 variableBorrowIndex;
    //the current supply rate. Expressed in ray
    uint128 currentLiquidityRate;
    //the current variable borrow rate. Expressed in ray
    uint128 currentVariableBorrowRate;
    //the current stable borrow rate. Expressed in ray
    uint128 currentStableBorrowRate;
    uint40 lastUpdateTimestamp;
    //tokens addresses
    address aTokenAddress;
    address stableDebtTokenAddress;
    address variableDebtTokenAddress;
    //address of the interest rate strategy
    address interestRateStrategyAddress;
    //the id of the reserve. Represents the position in the list of the active reserves
    uint8 id;
  }

  struct ReserveConfigurationMap {
    //bit 0-15: LTV
    //bit 16-31: Liq. threshold
    //bit 32-47: Liq. bonus
    //bit 48-55: Decimals
    //bit 56: Reserve is active
    //bit 57: reserve is frozen
    //bit 58: borrowing is enabled
    //bit 59: stable rate borrowing enabled
    //bit 60-63: reserved
    //bit 64-79: reserve factor
    uint256 data;
  }

  struct UserConfigurationMap {
    uint256 data;
  }

  enum InterestRateMode {NONE, STABLE, VARIABLE}
}

Contract ABI

[{"inputs":[{"internalType":"contract ILendingPoolAddressesProvider","name":"_addressProvider","type":"address"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"ADDRESSES_PROVIDER","outputs":[{"internalType":"contract ILendingPoolAddressesProvider","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LENDING_POOL","outputs":[{"internalType":"contract ILendingPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"call","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"premiums","type":"uint256[]"},{"internalType":"address","name":"","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"executeOperation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrowedTokenAddress","type":"address"},{"internalType":"uint256","name":"amountToBorrow","type":"uint256"},{"internalType":"bytes","name":"_params","type":"bytes"}],"name":"flashloanAave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrowedTokenAddress","type":"address"},{"internalType":"uint256","name":"amountToBorrow","type":"uint256"},{"internalType":"bytes","name":"_params","type":"bytes"}],"name":"flashloanSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_baseToken","type":"address"},{"internalType":"uint256","name":"_wethAmountToFirstMarket","type":"uint256"},{"internalType":"uint256","name":"_ethAmountToCoinbase","type":"uint256"},{"internalType":"address[]","name":"_targets","type":"address[]"},{"internalType":"bytes[]","name":"_payloads","type":"bytes[]"}],"name":"uniswapTrade","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"uniswapV2Call","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

610100604052739c3c9283d3e44854697cd22d3faa240cfb0328896000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405162003af438038062003af483398181016040528101906200007e91906200023e565b808073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015620000fd57600080fd5b505afa15801562000112573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000138919062000212565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050503373ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250503373ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b8152505050620002e6565b600081519050620001f581620002b2565b92915050565b6000815190506200020c81620002cc565b92915050565b6000602082840312156200022557600080fd5b60006200023584828501620001e4565b91505092915050565b6000602082840312156200025157600080fd5b60006200026184828501620001fb565b91505092915050565b6000620002778262000292565b9050919050565b60006200028b826200026a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620002bd816200026a565b8114620002c957600080fd5b50565b620002d7816200027e565b8114620002e357600080fd5b50565b60805160601c60a05160601c60c05160601c60e05160601c6137b362000341600039806105d8528061120a528061158f525080610fb652806114735250806113cf5280611a015280611bf652508061025152506137b36000f3fe6080604052600436106100955760003560e01c80636dbf2fa0116100595780636dbf2fa01461016357806381badaff14610193578063920f5c84146101bc57806397070d36146101f9578063b4dcfc77146102245761009c565b80630542975c146100a157806310d1e85c146100cc57806331f37ee9146100f557806351cff8d914610111578063561ead5e1461013a5761009c565b3661009c57005b600080fd5b3480156100ad57600080fd5b506100b661024f565b6040516100c391906132c6565b60405180910390f35b3480156100d857600080fd5b506100f360048036038101906100ee9190612b63565b610273565b005b61010f600480360381019061010a9190612abc565b6105d6565b005b34801561011d57600080fd5b5061013860048036038101906101339190612930565b610fb4565b005b34801561014657600080fd5b50610161600480360381019061015c9190612a55565b611208565b005b61017d60048036038101906101789190612982565b61146f565b60405161018a91906132a4565b60405180910390f35b34801561019f57600080fd5b506101ba60048036038101906101b59190612a55565b61158d565b005b3480156101c857600080fd5b506101e360048036038101906101de9190612be3565b6119fc565b6040516101f09190613289565b60405180910390f35b34801561020557600080fd5b5061020e611bd0565b60405161021b919061310f565b60405180910390f35b34801561023057600080fd5b50610239611bf4565b60405161024691906132e1565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60003373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156102bb57600080fd5b505afa1580156102cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f39190612959565b905060003373ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561033d57600080fd5b505afa158015610351573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103759190612959565b90506000735757371414417b8c6caad45baef941abc7d3ab3273ffffffffffffffffffffffffffffffffffffffff1663e6a4390584846040518363ffffffff1660e01b81526004016103c892919061316e565b60206040518083038186803b1580156103e057600080fd5b505afa1580156103f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104189190612959565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047f9061333c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146104f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ed9061335c565b60405180910390fd5b6000806060878781019061050a91906129ee565b925092509250600060016103e5600385028161052257fe5b040190506000818401905061053985858584611c18565b8473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87836040518363ffffffff1660e01b8152600401610574929190613222565b602060405180830381600087803b15801561058e57600080fd5b505af11580156105a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c69190612d0c565b5050505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461062e57600080fd5b8051825114610672576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106699061331c565b60405180910390fd5b600085905060003411156106f657739c3c9283d3e44854697cd22d3faa240cfb03288973ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156106dc57600080fd5b505af11580156106f0573d6000803e3d6000fd5b50505050505b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610731919061312a565b60206040518083038186803b15801561074957600080fd5b505afa15801561075d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107819190612d35565b905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161480156107dd57508581105b1561085a57739c3c9283d3e44854697cd22d3faa240cfb03288973ffffffffffffffffffffffffffffffffffffffff1663d0e30db08288036040518263ffffffff1660e01b81526004016000604051808303818588803b15801561084057600080fd5b505af1158015610854573d6000803e3d6000fd5b50505050505b6000845190508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8660008151811061088957fe5b6020026020010151896040518363ffffffff1660e01b81526004016108af929190613222565b602060405180830381600087803b1580156108c957600080fd5b505af11580156108dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109019190612d0c565b5060005b818110156109b657600086828151811061091b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1686838151811061094557fe5b602002602001015160405161095a91906130f8565b6000604051808303816000865af19150503d8060008114610997576040519150601f19603f3d011682016040523d82523d6000602084013e61099c565b606091505b50509050806109aa57600080fd5b50806001019050610905565b5060008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109f2919061312a565b60206040518083038186803b158015610a0a57600080fd5b505afa158015610a1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a429190612d35565b90508683018111610a5257600080fd5b6000871115610fa95760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415610b4457600047905087811015610b3e57739c3c9283d3e44854697cd22d3faa240cfb03288973ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d828a036040518263ffffffff1660e01b8152600401610b0b919061337c565b600060405180830381600087803b158015610b2557600080fd5b505af1158015610b39573d6000803e3d6000fd5b505050505b50610ee4565b8373ffffffffffffffffffffffffffffffffffffffff1663095ea7b3738954afa98594b838bda56fe4c12a09d7739d179b896040518363ffffffff1660e01b8152600401610b93929190613222565b602060405180830381600087803b158015610bad57600080fd5b505af1158015610bc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be59190612d0c565b506060600267ffffffffffffffff81118015610c0057600080fd5b50604051908082528060200260200182016040528015610c2f5781602001602082028036833780820191505090505b5090508981600081518110610c4057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110610ca857fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506060738954afa98594b838bda56fe4c12a09d7739d179b73ffffffffffffffffffffffffffffffffffffffff1663d06ca61f8a846040518363ffffffff1660e01b8152600401610d33929190613397565b60006040518083038186803b158015610d4b57600080fd5b505afa158015610d5f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d889190612ccb565b9050738954afa98594b838bda56fe4c12a09d7739d179b73ffffffffffffffffffffffffffffffffffffffff166338ed17398a83600081518110610dc857fe5b60200260200101518530426040518663ffffffff1660e01b8152600401610df3959493929190613413565b600060405180830381600087803b158015610e0d57600080fd5b505af1158015610e21573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e4a9190612ccb565b5080600081518110610e5857fe5b60200260200101519850739c3c9283d3e44854697cd22d3faa240cfb03288973ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8a6040518263ffffffff1660e01b8152600401610eaf919061337c565b600060405180830381600087803b158015610ec957600080fd5b505af1158015610edd573d6000803e3d6000fd5b5050505050505b60004173ffffffffffffffffffffffffffffffffffffffff1688600067ffffffffffffffff81118015610f1657600080fd5b506040519080825280601f01601f191660200182016040528015610f495781602001600182028036833780820191505090505b50604051610f5791906130f8565b60006040518083038185875af1925050503d8060008114610f94576040519150601f19603f3d011682016040523d82523d6000602084013e610f99565b606091505b5050905080610fa757600080fd5b505b505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461100c57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110a0573373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561109a573d6000803e3d6000fd5b50611205565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112045760008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611122919061312a565b60206040518083038186803b15801561113a57600080fd5b505afa15801561114e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111729190612d35565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016111af929190613145565b602060405180830381600087803b1580156111c957600080fd5b505af11580156111dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112019190612d0c565b50505b5b50565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461126057600080fd5b60003090506060600167ffffffffffffffff8111801561127f57600080fd5b506040519080825280602002602001820160405280156112ae5781602001602082028036833780820191505090505b50905084816000815181106112bf57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506060600167ffffffffffffffff8111801561131357600080fd5b506040519080825280602002602001820160405280156113425781602001602082028036833780820191505090505b509050848160008151811061135357fe5b6020026020010181815250506060600167ffffffffffffffff8111801561137957600080fd5b506040519080825280602002602001820160405280156113a85781602001602082028036833780820191505090505b5090506000816000815181106113ba57fe5b602002602001018181525050600030905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ab9c4b5d87878787878d886040518863ffffffff1660e01b81526004016114329796959493929190613197565b600060405180830381600087803b15801561144c57600080fd5b505af1158015611460573d6000803e3d6000fd5b50505050505050505050505050565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114c957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561150357600080fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1686868660405161152f9291906130df565b60006040518083038185875af1925050503d806000811461156c576040519150601f19603f3d011682016040523d82523d6000602084013e611571565b606091505b50915091508161158057600080fd5b8092505050949350505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115e557600080fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611681575073e11a86849d99f524cac3e7a0ec1241828e332c6273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b156116a25773abd99b35a91dd3e4bc02dca75730f9e33766251990506117d4565b735757371414417b8c6caad45baef941abc7d3ab3273ffffffffffffffffffffffffffffffffffffffff1663e6a439058560008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b815260040161171192919061316e565b60206040518083038186803b15801561172957600080fd5b505afa15801561173d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117619190612959565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca9061333c565b60405180910390fd5b5b60008173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561181c57600080fd5b505afa158015611830573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118549190612959565b905060008273ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561189e57600080fd5b505afa1580156118b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d69190612959565b905060008273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614611914576000611916565b855b905060008273ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614611954576000611956565b865b9050606088888860405160200161196f9392919061324b565b60405160208183030381529060405290508573ffffffffffffffffffffffffffffffffffffffff1663022c0d9f848430856040518563ffffffff1660e01b81526004016119bf94939291906133c7565b600060405180830381600087803b1580156119d957600080fd5b505af11580156119ed573d6000803e3d6000fd5b50505050505050505050505050565b6000807f000000000000000000000000000000000000000000000000000000000000000090508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a5a57600080fd5b6000611a9588886000818110611a6c57fe5b905060200201358b8b6000818110611a8057fe5b9050602002013561246690919063ffffffff16565b9050611b1b8c8c6000818110611aa757fe5b9050602002016020810190611abc9190612930565b8b8b6000818110611ac957fe5b9050602002013587878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505084611c18565b739c3c9283d3e44854697cd22d3faa240cfb03288973ffffffffffffffffffffffffffffffffffffffff1663095ea7b383836040518363ffffffff1660e01b8152600401611b6a929190613222565b602060405180830381600087803b158015611b8457600080fd5b505af1158015611b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbc9190612d0c565b506001925050509998505050505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b600060608084806020019051810190611c319190612d5e565b9250925092508051825114611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c729061331c565b60405180910390fd5b600087905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611cbb919061312a565b60206040518083038186803b158015611cd357600080fd5b505afa158015611ce7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0b9190612d35565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85600081518110611d3657fe5b60200260200101518a6040518363ffffffff1660e01b8152600401611d5c929190613222565b602060405180830381600087803b158015611d7657600080fd5b505af1158015611d8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dae9190612d0c565b5060008451905060005b81811015611e69576000868281518110611dce57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16868381518110611df857fe5b6020026020010151604051611e0d91906130f8565b6000604051808303816000865af19150503d8060008114611e4a576040519150601f19603f3d011682016040523d82523d6000602084013e611e4f565b606091505b5050905080611e5d57600080fd5b50806001019050611db8565b5060008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611ea5919061312a565b60206040518083038186803b158015611ebd57600080fd5b505afa158015611ed1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef59190612d35565b905087878401018111611f0757600080fd5b60008789830303905060008811156124585760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff161415611ff357739c3c9283d3e44854697cd22d3faa240cfb03288973ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d828a016040518263ffffffff1660e01b8152600401611fbc919061337c565b600060405180830381600087803b158015611fd657600080fd5b505af1158015611fea573d6000803e3d6000fd5b50505050612393565b8473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3738954afa98594b838bda56fe4c12a09d7739d179b8a6040518363ffffffff1660e01b8152600401612042929190613222565b602060405180830381600087803b15801561205c57600080fd5b505af1158015612070573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120949190612d0c565b506060600267ffffffffffffffff811180156120af57600080fd5b506040519080825280602002602001820160405280156120de5781602001602082028036833780820191505090505b5090508c816000815181106120ef57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160018151811061215757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506060738954afa98594b838bda56fe4c12a09d7739d179b73ffffffffffffffffffffffffffffffffffffffff1663d06ca61f8b846040518363ffffffff1660e01b81526004016121e2929190613397565b60006040518083038186803b1580156121fa57600080fd5b505afa15801561220e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906122379190612ccb565b9050738954afa98594b838bda56fe4c12a09d7739d179b73ffffffffffffffffffffffffffffffffffffffff166338ed17398b8360008151811061227757fe5b60200260200101518530426040518663ffffffff1660e01b81526004016122a2959493929190613413565b600060405180830381600087803b1580156122bc57600080fd5b505af11580156122d0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906122f99190612ccb565b508060008151811061230757fe5b60200260200101519950739c3c9283d3e44854697cd22d3faa240cfb03288973ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8b6040518263ffffffff1660e01b815260040161235e919061337c565b600060405180830381600087803b15801561237857600080fd5b505af115801561238c573d6000803e3d6000fd5b5050505050505b60004173ffffffffffffffffffffffffffffffffffffffff1689600067ffffffffffffffff811180156123c557600080fd5b506040519080825280601f01601f1916602001820160405280156123f85781602001600182028036833780820191505090505b5060405161240691906130f8565b60006040518083038185875af1925050503d8060008114612443576040519150601f19603f3d011682016040523d82523d6000602084013e612448565b606091505b505090508061245657600080fd5b505b505050505050505050505050565b6000808284019050838110156124b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a8906132fc565b60405180910390fd5b8091505092915050565b6000813590506124ca81613721565b92915050565b6000815190506124df81613721565b92915050565b6000813590506124f481613738565b92915050565b60008083601f84011261250c57600080fd5b8235905067ffffffffffffffff81111561252557600080fd5b60208301915083602082028301111561253d57600080fd5b9250929050565b600082601f83011261255557600080fd5b81356125686125638261349a565b61346d565b9150818183526020840193506020810190508385602084028201111561258d57600080fd5b60005b838110156125bd57816125a388826124bb565b845260208401935060208301925050600181019050612590565b5050505092915050565b600082601f8301126125d857600080fd5b81516125eb6125e68261349a565b61346d565b9150818183526020840193506020810190508385602084028201111561261057600080fd5b60005b83811015612640578161262688826124d0565b845260208401935060208301925050600181019050612613565b5050505092915050565b600082601f83011261265b57600080fd5b813561266e612669826134c2565b61346d565b9150818183526020840193506020810190508360005b838110156126b4578135860161269a888261285e565b845260208401935060208301925050600181019050612684565b5050505092915050565b600082601f8301126126cf57600080fd5b81516126e26126dd826134c2565b61346d565b9150818183526020840193506020810190508360005b83811015612728578151860161270e88826128b2565b8452602084019350602083019250506001810190506126f8565b5050505092915050565b60008083601f84011261274457600080fd5b8235905067ffffffffffffffff81111561275d57600080fd5b60208301915083602082028301111561277557600080fd5b9250929050565b600082601f83011261278d57600080fd5b81516127a061279b826134ea565b61346d565b915081818352602084019350602081019050838560208402820111156127c557600080fd5b60005b838110156127f557816127db888261291b565b8452602084019350602083019250506001810190506127c8565b5050505092915050565b60008151905061280e8161374f565b92915050565b60008083601f84011261282657600080fd5b8235905067ffffffffffffffff81111561283f57600080fd5b60208301915083600182028301111561285757600080fd5b9250929050565b600082601f83011261286f57600080fd5b813561288261287d82613512565b61346d565b9150808252602083016020830185838301111561289e57600080fd5b6128a98382846136ce565b50505092915050565b600082601f8301126128c357600080fd5b81516128d66128d182613512565b61346d565b915080825260208301602083018583830111156128f257600080fd5b6128fd8382846136dd565b50505092915050565b60008135905061291581613766565b92915050565b60008151905061292a81613766565b92915050565b60006020828403121561294257600080fd5b6000612950848285016124bb565b91505092915050565b60006020828403121561296b57600080fd5b6000612979848285016124d0565b91505092915050565b6000806000806060858703121561299857600080fd5b60006129a6878288016124e5565b94505060206129b787828801612906565b935050604085013567ffffffffffffffff8111156129d457600080fd5b6129e087828801612814565b925092505092959194509250565b600080600060608486031215612a0357600080fd5b6000612a11868287016124e5565b9350506020612a2286828701612906565b925050604084013567ffffffffffffffff811115612a3f57600080fd5b612a4b8682870161285e565b9150509250925092565b600080600060608486031215612a6a57600080fd5b6000612a78868287016124bb565b9350506020612a8986828701612906565b925050604084013567ffffffffffffffff811115612aa657600080fd5b612ab28682870161285e565b9150509250925092565b600080600080600060a08688031215612ad457600080fd5b6000612ae2888289016124bb565b9550506020612af388828901612906565b9450506040612b0488828901612906565b935050606086013567ffffffffffffffff811115612b2157600080fd5b612b2d88828901612544565b925050608086013567ffffffffffffffff811115612b4a57600080fd5b612b568882890161264a565b9150509295509295909350565b600080600080600060808688031215612b7b57600080fd5b6000612b89888289016124bb565b9550506020612b9a88828901612906565b9450506040612bab88828901612906565b935050606086013567ffffffffffffffff811115612bc857600080fd5b612bd488828901612814565b92509250509295509295909350565b600080600080600080600080600060a08a8c031215612c0157600080fd5b60008a013567ffffffffffffffff811115612c1b57600080fd5b612c278c828d016124fa565b995099505060208a013567ffffffffffffffff811115612c4657600080fd5b612c528c828d01612732565b975097505060408a013567ffffffffffffffff811115612c7157600080fd5b612c7d8c828d01612732565b95509550506060612c908c828d016124bb565b93505060808a013567ffffffffffffffff811115612cad57600080fd5b612cb98c828d01612814565b92509250509295985092959850929598565b600060208284031215612cdd57600080fd5b600082015167ffffffffffffffff811115612cf757600080fd5b612d038482850161277c565b91505092915050565b600060208284031215612d1e57600080fd5b6000612d2c848285016127ff565b91505092915050565b600060208284031215612d4757600080fd5b6000612d558482850161291b565b91505092915050565b600080600060608486031215612d7357600080fd5b6000612d818682870161291b565b935050602084015167ffffffffffffffff811115612d9e57600080fd5b612daa868287016125c7565b925050604084015167ffffffffffffffff811115612dc757600080fd5b612dd3868287016126be565b9150509250925092565b6000612de98383612e1c565b60208301905092915050565b6000612e0183836130c1565b60208301905092915050565b612e1681613650565b82525050565b612e25816135e8565b82525050565b612e34816135e8565b82525050565b6000612e458261355e565b612e4f8185613599565b9350612e5a8361353e565b8060005b83811015612e8b578151612e728882612ddd565b9750612e7d8361357f565b925050600181019050612e5e565b5085935050505092915050565b6000612ea382613569565b612ead81856135aa565b9350612eb88361354e565b8060005b83811015612ee9578151612ed08882612df5565b9750612edb8361358c565b925050600181019050612ebc565b5085935050505092915050565b612eff8161360c565b82525050565b6000612f1183856135cc565b9350612f1e8385846136ce565b82840190509392505050565b6000612f3582613574565b612f3f81856135bb565b9350612f4f8185602086016136dd565b612f5881613710565b840191505092915050565b6000612f6e82613574565b612f7881856135cc565b9350612f888185602086016136dd565b80840191505092915050565b612f9d81613662565b82525050565b612fac81613686565b82525050565b6000612fbf601b836135d7565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000612fff6015836135d7565b91507f6c656e2074617267657420213d207061796c6f616400000000000000000000006000830152602082019050919050565b600061303f6005836135d7565b91507f21706169720000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061307f6007836135d7565b91507f2173656e646572000000000000000000000000000000000000000000000000006000830152602082019050919050565b6130bb81613618565b82525050565b6130ca81613646565b82525050565b6130d981613646565b82525050565b60006130ec828486612f05565b91508190509392505050565b60006131048284612f63565b915081905092915050565b60006020820190506131246000830184612e2b565b92915050565b600060208201905061313f6000830184612e0d565b92915050565b600060408201905061315a6000830185612e0d565b61316760208301846130d0565b9392505050565b60006040820190506131836000830185612e2b565b6131906020830184612e2b565b9392505050565b600060e0820190506131ac600083018a612e2b565b81810360208301526131be8189612e3a565b905081810360408301526131d28188612e98565b905081810360608301526131e68187612e98565b90506131f56080830186612e2b565b81810360a08301526132078185612f2a565b905061321660c08301846130b2565b98975050505050505050565b60006040820190506132376000830185612e2b565b61324460208301846130d0565b9392505050565b60006060820190506132606000830186612e2b565b61326d60208301856130d0565b818103604083015261327f8184612f2a565b9050949350505050565b600060208201905061329e6000830184612ef6565b92915050565b600060208201905081810360008301526132be8184612f2a565b905092915050565b60006020820190506132db6000830184612f94565b92915050565b60006020820190506132f66000830184612fa3565b92915050565b6000602082019050818103600083015261331581612fb2565b9050919050565b6000602082019050818103600083015261333581612ff2565b9050919050565b6000602082019050818103600083015261335581613032565b9050919050565b6000602082019050818103600083015261337581613072565b9050919050565b600060208201905061339160008301846130d0565b92915050565b60006040820190506133ac60008301856130d0565b81810360208301526133be8184612e3a565b90509392505050565b60006080820190506133dc60008301876130d0565b6133e960208301866130d0565b6133f66040830185612e0d565b81810360608301526134088184612f2a565b905095945050505050565b600060a08201905061342860008301886130d0565b61343560208301876130d0565b81810360408301526134478186612e3a565b90506134566060830185612e0d565b61346360808301846130d0565b9695505050505050565b6000604051905081810181811067ffffffffffffffff8211171561349057600080fd5b8060405250919050565b600067ffffffffffffffff8211156134b157600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156134d957600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561350157600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561352957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006135f382613626565b9050919050565b600061360582613626565b9050919050565b60008115159050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061365b826136aa565b9050919050565b600061366d82613674565b9050919050565b600061367f82613626565b9050919050565b600061369182613698565b9050919050565b60006136a382613626565b9050919050565b60006136b5826136bc565b9050919050565b60006136c782613626565b9050919050565b82818337600083830152505050565b60005b838110156136fb5780820151818401526020810190506136e0565b8381111561370a576000848401525b50505050565b6000601f19601f8301169050919050565b61372a816135e8565b811461373557600080fd5b50565b613741816135fa565b811461374c57600080fd5b50565b6137588161360c565b811461376357600080fd5b50565b61376f81613646565b811461377a57600080fd5b5056fea2646970667358221220f0830208164834d52ed727de76fc698c48bef5c8626c601feb42b8e53da174d664736f6c634300060c0033000000000000000000000000178113104fecbcd7ff8669a0150721e231f0fd4b

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000178113104fecbcd7ff8669a0150721e231f0fd4b

-----Decoded View---------------
Arg [0] : _addressProvider (address): 0x178113104fecbcd7ff8669a0150721e231f0fd4b

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000178113104fecbcd7ff8669a0150721e231f0fd4b


Deployed ByteCode Sourcemap

690:9972:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;402:65;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6789:884;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7724:2226;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10320:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4412:734;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9958:311;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5795:984;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5156:583;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;952:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;472:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;402:65;;;:::o;6789:884::-;6965:14;6997:10;6982:33;;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6965:52;;7028:14;7060:10;7045:33;;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7028:52;;7091:12;1274:42;7106;;;7149:6;7157;7106:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7091:73;;7199:4;7185:18;;:10;:18;;;7177:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;7251:4;7232:24;;:7;:24;;;7224:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;7282:28;7312:19;7333:20;7368:5;;7357:41;;;;;;;:::i;:::-;7281:117;;;;;;7411:8;7453:1;7446:3;7441:1;7424:14;:18;7423:26;;;;;;7422:32;7411:43;;7465:18;7503:3;7486:14;:20;7465:41;;7519:77;7535:20;7557:14;7573:7;7582:13;7519:15;:77::i;:::-;7614:20;7607:37;;;7645:4;7651:13;7607:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6789:884;;;;;;;;;;;;;:::o;7724:2226::-;2173:8;2159:22;;:10;:22;;;2151:31;;;;;;7951:9:::1;:16;7932:8;:15;:35;7924:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;8006:12;8028:10;8006:33;;8076:1;8064:9;:13;8060:83;;;1076:42;8098:12;;;8119:9;8098:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;8060:83;8156:26;8185:5;:15;;;8209:4;8185:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8156:59;;8244:12;::::0;::::1;;;;;;;;8230:26;;:10;:26;;;:75;;;;;8281:24;8260:18;:45;8230:75;8226:178;;;1076:42;8323:12;;;8371:18;8344:24;:45;8323:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;8226:178;8424:11;8438:8;:15;8424:29;;8464:5;:14;;;8479:8;8488:1;8479:11;;;;;;;;;;;;;;8492:24;8464:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;8533:9;8528:144;8552:3;8548:1;:7;8528:144;;;8578:13;8597:8;8606:1;8597:11;;;;;;;;;;;;;;:16;;8614:9;8624:1;8614:12;;;;;;;;;;;;;;8597:30;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8577:50;;;8650:8;8642:17;;;::::0;::::1;;8528:144;8557:3;;;;;8528:144;;;;8684:25;8712:5;:15;;;8736:4;8712:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8684:58;;8802:20;8781:18;:41;8761:17;:61;8753:70;;;::::0;::::1;;8863:1;8840:20;:24;8836:1107;;;8899:12;::::0;::::1;;;;;;;;8885:26;;:10;:26;;;8881:922;;;8932:19;8954:21;8932:43;;9012:20;8998:11;:34;8994:132;;;1076:42;9057:13;;;9094:11;9071:20;:34;9057:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;8994:132;8881:922;;;;9166:5;:13;;;1374:42;9196:20;9166:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;9254:21;9292:1;9278:16;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9254:40;;9323:10;9313:4;9318:1;9313:7;;;;;;;;;;;;;:20;;;;;;;;;::::0;::::1;9362:12;::::0;::::1;;;;;;;;9352:4;9357:1;9352:7;;;;;;;;;;;;;:22;;;;;;;;;::::0;::::1;9411:31;1374:42;9445:46;;;9492:20;9514:4;9445:74;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9411:108;;1374:42;9538:57;;;9596:20;9618:14;9633:1;9618:17;;;;;;;;;;;;;;9637:4;9651;9658:15;9538:136;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;9716:14;9731:1;9716:17;;;;;;;;;;;;;;9693:40;;1076:42;9752:13;;;9766:20;9752:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;8881:922;;;9818:13;9837:14;:19;;9864:20;9896:1;9886:12;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9837:62;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9817:82;;;9922:8;9914:17;;;::::0;::::1;;8836:1107;;2193:1;;;;7724:2226:::0;;;;;:::o;10320:339::-;2082:5;2068:19;;:10;:19;;;2060:28;;;;;;1173:42:::1;10387:20;;:5;:20;;;10383:269;;;10432:10;10424:28;;:51;10453:21;10424:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;10383:269;;;1173:42;10497:20;;:5;:20;;;10493:159;;10534:11;10555:5;10548:23;;;10580:4;10548:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10534:52;;10608:5;10601:22;;;10624:10;10636:3;10601:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10493:159;;10383:269;10320:339:::0;:::o;4412:734::-;2173:8;2159:22;;:10;:22;;;2151:31;;;;;;4544:23:::1;4578:4;4544:39;;4596:23;4636:1;4622:16;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4596:42;;4661:20;4649:6;4656:1;4649:9;;;;;;;;;;;;;:32;;;;;;;;;::::0;::::1;4692:24;4733:1;4719:16;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4692:43;;4759:14;4746:7;4754:1;4746:10;;;;;;;;;;;;;:27;;;::::0;::::1;4784:22;4823:1;4809:16;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4784:41;;4847:1;4836:5;4842:1;4836:8;;;;;;;;;;;;;:12;;;::::0;::::1;4859:18;4888:4;4859:34;;4904:19;4938:12;:22;;;4975:15;5005:6;5026:7;5048:5;5068:10;5093:7;5115:12;4938:200;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2193:1;;;;;;4412:734:::0;;;:::o;9958:311::-;10067:12;2082:5;2068:19;;:10;:19;;;2060:28;;;;;;10115:1:::1;10100:17;;:3;:17;;;;10092:26;;;::::0;::::1;;10130:13;10145:20;10177:3;10169:17;;10194:6;10202:5;;10169:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10129:79;;;;10227:8;10219:17;;;::::0;::::1;;10254:7;10247:14;;;;9958:311:::0;;;;;;:::o;5795:984::-;2173:8;2159:22;;:10;:22;;;2151:31;;;;;;5927:12:::1;5978::::0;::::1;;;;;;;;;;5954:36;;:20;:36;;;:68;;;;902:42;5994:28;;:20;:28;;;5954:68;5950:365;;;6082:42;6067:58;;5950:365;;;1274:42;6165;;;6208:20;6238:12;::::0;::::1;;;;;;;;6165:87;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6158:94;;6291:1;6275:18;;:4;:18;;;;6267:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;5950:365;6325:14;6357:4;6342:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6325:46;;6382:14;6414:4;6399:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6382:46;;6439:15;6481:6;6457:30;;:20;:30;;;:51;;6507:1;6457:51;;;6490:14;6457:51;6439:69;;6519:15;6561:6;6537:30;;:20;:30;;;:51;;6587:1;6537:51;;;6570:14;6537:51;6519:69;;6611:17;6642:20;6664:14;6680:7;6631:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6611:77;;6716:4;6701:25;;;6727:10;6739;6759:4;6766;6701:70;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2193:1;;;;;;5795:984:::0;;;:::o;5156:583::-;5420:4;5442:20;5473:12;5442:44;;5519:12;5505:26;;:10;:26;;;5497:35;;;;;;5543:16;5562:27;5577:8;;5586:1;5577:11;;;;;;;;;;;;;5562:7;;5570:1;5562:10;;;;;;;;;;;;;:14;;:27;;;;:::i;:::-;5543:46;;5600:59;5616:6;;5623:1;5616:9;;;;;;;;;;;;;;;;;;;;:::i;:::-;5627:7;;5635:1;5627:10;;;;;;;;;;;;;5639:6;;5600:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5647:11;5600:15;:59::i;:::-;1076:42;5670:12;;;5683;5697:11;5670:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5727:4;5720:11;;;;5156:583;;;;;;;;;;;:::o;952:81::-;;;;;;;;;;;;:::o;472:42::-;;;:::o;2404:1957::-;2542:28;2572:25;2599:24;2638:7;2627:50;;;;;;;;;;;;:::i;:::-;2541:136;;;;;;2715:9;:16;2696:8;:15;:35;2688:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2768:12;2790:10;2768:33;;2812:26;2841:5;:15;;;2865:4;2841:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2812:59;;2882:5;:14;;;2897:8;2906:1;2897:11;;;;;;;;;;;;;;2910:20;2882:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2942:11;2956:8;:15;2942:29;;2987:9;2982:172;3006:3;3002:1;:7;2982:172;;;3032:13;3079:8;3088:1;3079:11;;;;;;;;;;;;;;:16;;3096:9;3106:1;3096:12;;;;;;;;;;;;;;3079:30;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3031:78;;;3132:8;3124:17;;;;;;2982:172;3011:3;;;;;2982:172;;;;3164:25;3192:5;:15;;;3216:4;3192:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3164:58;;3305:10;3282:20;3261:18;:41;:54;3241:17;:74;3233:83;;;;;;3327:15;3378:20;3365:10;3345:17;:30;:53;3327:71;;3438:1;3415:20;:24;3411:943;;;3474:12;;;;;;;;;;3460:26;;:10;:26;;;3456:758;;;1076:42;3507:13;;;3544:7;3521:20;:30;3507:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3456:758;;;3593:5;:13;;;1374:42;3623:20;3593:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3665:21;3703:1;3689:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3665:40;;3734:10;3724:4;3729:1;3724:7;;;;;;;;;;;;;:20;;;;;;;;;;;3773:12;;;;;;;;;;3763:4;3768:1;3763:7;;;;;;;;;;;;;:22;;;;;;;;;;;3822:31;1374:42;3856:46;;;3903:20;3925:4;3856:74;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3822:108;;1374:42;3949:57;;;4007:20;4029:14;4044:1;4029:17;;;;;;;;;;;;;;4048:4;4062;4069:15;3949:136;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4127:14;4142:1;4127:17;;;;;;;;;;;;;;4104:40;;1076:42;4163:13;;;4177:20;4163:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3456:758;;;4229:13;4248:14;:19;;4275:20;4307:1;4297:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4248:62;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4228:82;;;4333:8;4325:17;;;;;;3411:943;;2404:1957;;;;;;;;;;;;:::o;365:167:2:-;423:7;439:9;455:1;451;:5;439:17;;476:1;471;:6;;463:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;525:1;518:8;;;365:167;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;142:134::-;;226:6;220:13;211:22;;238:33;265:5;238:33;:::i;:::-;205:71;;;;:::o;283:146::-;;371:6;358:20;349:29;;383:41;418:5;383:41;:::i;:::-;343:86;;;;:::o;454:352::-;;;584:3;577:4;569:6;565:17;561:27;551:2;;602:1;599;592:12;551:2;635:6;622:20;612:30;;662:18;654:6;651:30;648:2;;;694:1;691;684:12;648:2;728:4;720:6;716:17;704:29;;779:3;771:4;763:6;759:17;749:8;745:32;742:41;739:2;;;796:1;793;786:12;739:2;544:262;;;;;:::o;832:707::-;;949:3;942:4;934:6;930:17;926:27;916:2;;967:1;964;957:12;916:2;1004:6;991:20;1026:80;1041:64;1098:6;1041:64;:::i;:::-;1026:80;:::i;:::-;1017:89;;1123:5;1148:6;1141:5;1134:21;1178:4;1170:6;1166:17;1156:27;;1200:4;1195:3;1191:14;1184:21;;1253:6;1300:3;1292:4;1284:6;1280:17;1275:3;1271:27;1268:36;1265:2;;;1317:1;1314;1307:12;1265:2;1342:1;1327:206;1352:6;1349:1;1346:13;1327:206;;;1410:3;1432:37;1465:3;1453:10;1432:37;:::i;:::-;1427:3;1420:50;1493:4;1488:3;1484:14;1477:21;;1521:4;1516:3;1512:14;1505:21;;1384:149;1374:1;1371;1367:9;1362:14;;1327:206;;;1331:14;909:630;;;;;;;:::o;1565:722::-;;1693:3;1686:4;1678:6;1674:17;1670:27;1660:2;;1711:1;1708;1701:12;1660:2;1741:6;1735:13;1763:80;1778:64;1835:6;1778:64;:::i;:::-;1763:80;:::i;:::-;1754:89;;1860:5;1885:6;1878:5;1871:21;1915:4;1907:6;1903:17;1893:27;;1937:4;1932:3;1928:14;1921:21;;1990:6;2037:3;2029:4;2021:6;2017:17;2012:3;2008:27;2005:36;2002:2;;;2054:1;2051;2044:12;2002:2;2079:1;2064:217;2089:6;2086:1;2083:13;2064:217;;;2147:3;2169:48;2213:3;2201:10;2169:48;:::i;:::-;2164:3;2157:61;2241:4;2236:3;2232:14;2225:21;;2269:4;2264:3;2260:14;2253:21;;2121:160;2111:1;2108;2104:9;2099:14;;2064:217;;;2068:14;1653:634;;;;;;;:::o;2311:705::-;;2437:3;2430:4;2422:6;2418:17;2414:27;2404:2;;2455:1;2452;2445:12;2404:2;2492:6;2479:20;2514:89;2529:73;2595:6;2529:73;:::i;:::-;2514:89;:::i;:::-;2505:98;;2620:5;2645:6;2638:5;2631:21;2675:4;2667:6;2663:17;2653:27;;2697:4;2692:3;2688:14;2681:21;;2750:6;2783:1;2768:242;2793:6;2790:1;2787:13;2768:242;;;2876:3;2863:17;2855:6;2851:30;2900:46;2942:3;2930:10;2900:46;:::i;:::-;2895:3;2888:59;2970:4;2965:3;2961:14;2954:21;;2998:4;2993:3;2989:14;2982:21;;2825:185;2815:1;2812;2808:9;2803:14;;2768:242;;;2772:14;2397:619;;;;;;;:::o;3040:713::-;;3177:3;3170:4;3162:6;3158:17;3154:27;3144:2;;3195:1;3192;3185:12;3144:2;3225:6;3219:13;3247:89;3262:73;3328:6;3262:73;:::i;:::-;3247:89;:::i;:::-;3238:98;;3353:5;3378:6;3371:5;3364:21;3408:4;3400:6;3396:17;3386:27;;3430:4;3425:3;3421:14;3414:21;;3483:6;3516:1;3501:246;3526:6;3523:1;3520:13;3501:246;;;3602:3;3596:10;3588:6;3584:23;3626:57;3679:3;3667:10;3626:57;:::i;:::-;3621:3;3614:70;3707:4;3702:3;3698:14;3691:21;;3735:4;3730:3;3726:14;3719:21;;3558:189;3548:1;3545;3541:9;3536:14;;3501:246;;;3505:14;3137:616;;;;;;;:::o;3779:352::-;;;3909:3;3902:4;3894:6;3890:17;3886:27;3876:2;;3927:1;3924;3917:12;3876:2;3960:6;3947:20;3937:30;;3987:18;3979:6;3976:30;3973:2;;;4019:1;4016;4009:12;3973:2;4053:4;4045:6;4041:17;4029:29;;4104:3;4096:4;4088:6;4084:17;4074:8;4070:32;4067:41;4064:2;;;4121:1;4118;4111:12;4064:2;3869:262;;;;;:::o;4157:722::-;;4285:3;4278:4;4270:6;4266:17;4262:27;4252:2;;4303:1;4300;4293:12;4252:2;4333:6;4327:13;4355:80;4370:64;4427:6;4370:64;:::i;:::-;4355:80;:::i;:::-;4346:89;;4452:5;4477:6;4470:5;4463:21;4507:4;4499:6;4495:17;4485:27;;4529:4;4524:3;4520:14;4513:21;;4582:6;4629:3;4621:4;4613:6;4609:17;4604:3;4600:27;4597:36;4594:2;;;4646:1;4643;4636:12;4594:2;4671:1;4656:217;4681:6;4678:1;4675:13;4656:217;;;4739:3;4761:48;4805:3;4793:10;4761:48;:::i;:::-;4756:3;4749:61;4833:4;4828:3;4824:14;4817:21;;4861:4;4856:3;4852:14;4845:21;;4713:160;4703:1;4700;4696:9;4691:14;;4656:217;;;4660:14;4245:634;;;;;;;:::o;4887:128::-;;4968:6;4962:13;4953:22;;4980:30;5004:5;4980:30;:::i;:::-;4947:68;;;;:::o;5036:336::-;;;5150:3;5143:4;5135:6;5131:17;5127:27;5117:2;;5168:1;5165;5158:12;5117:2;5201:6;5188:20;5178:30;;5228:18;5220:6;5217:30;5214:2;;;5260:1;5257;5250:12;5214:2;5294:4;5286:6;5282:17;5270:29;;5345:3;5337:4;5329:6;5325:17;5315:8;5311:32;5308:41;5305:2;;;5362:1;5359;5352:12;5305:2;5110:262;;;;;:::o;5381:440::-;;5482:3;5475:4;5467:6;5463:17;5459:27;5449:2;;5500:1;5497;5490:12;5449:2;5537:6;5524:20;5559:64;5574:48;5615:6;5574:48;:::i;:::-;5559:64;:::i;:::-;5550:73;;5643:6;5636:5;5629:21;5679:4;5671:6;5667:17;5712:4;5705:5;5701:16;5747:3;5738:6;5733:3;5729:16;5726:25;5723:2;;;5764:1;5761;5754:12;5723:2;5774:41;5808:6;5803:3;5798;5774:41;:::i;:::-;5442:379;;;;;;;:::o;5830:442::-;;5942:3;5935:4;5927:6;5923:17;5919:27;5909:2;;5960:1;5957;5950:12;5909:2;5990:6;5984:13;6012:64;6027:48;6068:6;6027:48;:::i;:::-;6012:64;:::i;:::-;6003:73;;6096:6;6089:5;6082:21;6132:4;6124:6;6120:17;6165:4;6158:5;6154:16;6200:3;6191:6;6186:3;6182:16;6179:25;6176:2;;;6217:1;6214;6207:12;6176:2;6227:39;6259:6;6254:3;6249;6227:39;:::i;:::-;5902:370;;;;;;;:::o;6280:130::-;;6360:6;6347:20;6338:29;;6372:33;6399:5;6372:33;:::i;:::-;6332:78;;;;:::o;6417:134::-;;6501:6;6495:13;6486:22;;6513:33;6540:5;6513:33;:::i;:::-;6480:71;;;;:::o;6558:241::-;;6662:2;6650:9;6641:7;6637:23;6633:32;6630:2;;;6678:1;6675;6668:12;6630:2;6713:1;6730:53;6775:7;6766:6;6755:9;6751:22;6730:53;:::i;:::-;6720:63;;6692:97;6624:175;;;;:::o;6806:263::-;;6921:2;6909:9;6900:7;6896:23;6892:32;6889:2;;;6937:1;6934;6927:12;6889:2;6972:1;6989:64;7045:7;7036:6;7025:9;7021:22;6989:64;:::i;:::-;6979:74;;6951:108;6883:186;;;;:::o;7076:631::-;;;;;7241:2;7229:9;7220:7;7216:23;7212:32;7209:2;;;7257:1;7254;7247:12;7209:2;7292:1;7309:61;7362:7;7353:6;7342:9;7338:22;7309:61;:::i;:::-;7299:71;;7271:105;7407:2;7425:53;7470:7;7461:6;7450:9;7446:22;7425:53;:::i;:::-;7415:63;;7386:98;7543:2;7532:9;7528:18;7515:32;7567:18;7559:6;7556:30;7553:2;;;7599:1;7596;7589:12;7553:2;7627:64;7683:7;7674:6;7663:9;7659:22;7627:64;:::i;:::-;7609:82;;;;7494:203;7203:504;;;;;;;:::o;7714:611::-;;;;7869:2;7857:9;7848:7;7844:23;7840:32;7837:2;;;7885:1;7882;7875:12;7837:2;7920:1;7937:61;7990:7;7981:6;7970:9;7966:22;7937:61;:::i;:::-;7927:71;;7899:105;8035:2;8053:53;8098:7;8089:6;8078:9;8074:22;8053:53;:::i;:::-;8043:63;;8014:98;8171:2;8160:9;8156:18;8143:32;8195:18;8187:6;8184:30;8181:2;;;8227:1;8224;8217:12;8181:2;8247:62;8301:7;8292:6;8281:9;8277:22;8247:62;:::i;:::-;8237:72;;8122:193;7831:494;;;;;:::o;8332:595::-;;;;8479:2;8467:9;8458:7;8454:23;8450:32;8447:2;;;8495:1;8492;8485:12;8447:2;8530:1;8547:53;8592:7;8583:6;8572:9;8568:22;8547:53;:::i;:::-;8537:63;;8509:97;8637:2;8655:53;8700:7;8691:6;8680:9;8676:22;8655:53;:::i;:::-;8645:63;;8616:98;8773:2;8762:9;8758:18;8745:32;8797:18;8789:6;8786:30;8783:2;;;8829:1;8826;8819:12;8783:2;8849:62;8903:7;8894:6;8883:9;8879:22;8849:62;:::i;:::-;8839:72;;8724:193;8441:486;;;;;:::o;8934:1033::-;;;;;;9165:3;9153:9;9144:7;9140:23;9136:33;9133:2;;;9182:1;9179;9172:12;9133:2;9217:1;9234:53;9279:7;9270:6;9259:9;9255:22;9234:53;:::i;:::-;9224:63;;9196:97;9324:2;9342:53;9387:7;9378:6;9367:9;9363:22;9342:53;:::i;:::-;9332:63;;9303:98;9432:2;9450:53;9495:7;9486:6;9475:9;9471:22;9450:53;:::i;:::-;9440:63;;9411:98;9568:2;9557:9;9553:18;9540:32;9592:18;9584:6;9581:30;9578:2;;;9624:1;9621;9614:12;9578:2;9644:78;9714:7;9705:6;9694:9;9690:22;9644:78;:::i;:::-;9634:88;;9519:209;9787:3;9776:9;9772:19;9759:33;9812:18;9804:6;9801:30;9798:2;;;9844:1;9841;9834:12;9798:2;9864:87;9943:7;9934:6;9923:9;9919:22;9864:87;:::i;:::-;9854:97;;9738:219;9127:840;;;;;;;;:::o;9974:741::-;;;;;;10148:3;10136:9;10127:7;10123:23;10119:33;10116:2;;;10165:1;10162;10155:12;10116:2;10200:1;10217:53;10262:7;10253:6;10242:9;10238:22;10217:53;:::i;:::-;10207:63;;10179:97;10307:2;10325:53;10370:7;10361:6;10350:9;10346:22;10325:53;:::i;:::-;10315:63;;10286:98;10415:2;10433:53;10478:7;10469:6;10458:9;10454:22;10433:53;:::i;:::-;10423:63;;10394:98;10551:2;10540:9;10536:18;10523:32;10575:18;10567:6;10564:30;10561:2;;;10607:1;10604;10597:12;10561:2;10635:64;10691:7;10682:6;10671:9;10667:22;10635:64;:::i;:::-;10617:82;;;;10502:203;10110:605;;;;;;;;:::o;10722:1335::-;;;;;;;;;;11018:3;11006:9;10997:7;10993:23;10989:33;10986:2;;;11035:1;11032;11025:12;10986:2;11098:1;11087:9;11083:17;11070:31;11121:18;11113:6;11110:30;11107:2;;;11153:1;11150;11143:12;11107:2;11181:80;11253:7;11244:6;11233:9;11229:22;11181:80;:::i;:::-;11163:98;;;;11049:218;11326:2;11315:9;11311:18;11298:32;11350:18;11342:6;11339:30;11336:2;;;11382:1;11379;11372:12;11336:2;11410:80;11482:7;11473:6;11462:9;11458:22;11410:80;:::i;:::-;11392:98;;;;11277:219;11555:2;11544:9;11540:18;11527:32;11579:18;11571:6;11568:30;11565:2;;;11611:1;11608;11601:12;11565:2;11639:80;11711:7;11702:6;11691:9;11687:22;11639:80;:::i;:::-;11621:98;;;;11506:219;11756:2;11774:53;11819:7;11810:6;11799:9;11795:22;11774:53;:::i;:::-;11764:63;;11735:98;11892:3;11881:9;11877:19;11864:33;11917:18;11909:6;11906:30;11903:2;;;11949:1;11946;11939:12;11903:2;11977:64;12033:7;12024:6;12013:9;12009:22;11977:64;:::i;:::-;11959:82;;;;11843:204;10980:1077;;;;;;;;;;;:::o;12064:392::-;;12204:2;12192:9;12183:7;12179:23;12175:32;12172:2;;;12220:1;12217;12210:12;12172:2;12276:1;12265:9;12261:17;12255:24;12299:18;12291:6;12288:30;12285:2;;;12331:1;12328;12321:12;12285:2;12351:89;12432:7;12423:6;12412:9;12408:22;12351:89;:::i;:::-;12341:99;;12234:212;12166:290;;;;:::o;12463:257::-;;12575:2;12563:9;12554:7;12550:23;12546:32;12543:2;;;12591:1;12588;12581:12;12543:2;12626:1;12643:61;12696:7;12687:6;12676:9;12672:22;12643:61;:::i;:::-;12633:71;;12605:105;12537:183;;;;:::o;12727:263::-;;12842:2;12830:9;12821:7;12817:23;12813:32;12810:2;;;12858:1;12855;12848:12;12810:2;12893:1;12910:64;12966:7;12957:6;12946:9;12942:22;12910:64;:::i;:::-;12900:74;;12872:108;12804:186;;;;:::o;12997:811::-;;;;13205:2;13193:9;13184:7;13180:23;13176:32;13173:2;;;13221:1;13218;13211:12;13173:2;13256:1;13273:64;13329:7;13320:6;13309:9;13305:22;13273:64;:::i;:::-;13263:74;;13235:108;13395:2;13384:9;13380:18;13374:25;13419:18;13411:6;13408:30;13405:2;;;13451:1;13448;13441:12;13405:2;13471:89;13552:7;13543:6;13532:9;13528:22;13471:89;:::i;:::-;13461:99;;13353:213;13618:2;13607:9;13603:18;13597:25;13642:18;13634:6;13631:30;13628:2;;;13674:1;13671;13664:12;13628:2;13694:98;13784:7;13775:6;13764:9;13760:22;13694:98;:::i;:::-;13684:108;;13576:222;13167:641;;;;;:::o;13816:173::-;;13903:46;13945:3;13937:6;13903:46;:::i;:::-;13978:4;13973:3;13969:14;13955:28;;13896:93;;;;:::o;13998:173::-;;14085:46;14127:3;14119:6;14085:46;:::i;:::-;14160:4;14155:3;14151:14;14137:28;;14078:93;;;;:::o;14179:142::-;14270:45;14309:5;14270:45;:::i;:::-;14265:3;14258:58;14252:69;;:::o;14328:103::-;14401:24;14419:5;14401:24;:::i;:::-;14396:3;14389:37;14383:48;;:::o;14438:113::-;14521:24;14539:5;14521:24;:::i;:::-;14516:3;14509:37;14503:48;;:::o;14589:690::-;;14734:54;14782:5;14734:54;:::i;:::-;14801:86;14880:6;14875:3;14801:86;:::i;:::-;14794:93;;14908:56;14958:5;14908:56;:::i;:::-;14984:7;15012:1;14997:260;15022:6;15019:1;15016:13;14997:260;;;15089:6;15083:13;15110:63;15169:3;15154:13;15110:63;:::i;:::-;15103:70;;15190:60;15243:6;15190:60;:::i;:::-;15180:70;;15054:203;15044:1;15041;15037:9;15032:14;;14997:260;;;15001:14;15270:3;15263:10;;14713:566;;;;;;;:::o;15318:690::-;;15463:54;15511:5;15463:54;:::i;:::-;15530:86;15609:6;15604:3;15530:86;:::i;:::-;15523:93;;15637:56;15687:5;15637:56;:::i;:::-;15713:7;15741:1;15726:260;15751:6;15748:1;15745:13;15726:260;;;15818:6;15812:13;15839:63;15898:3;15883:13;15839:63;:::i;:::-;15832:70;;15919:60;15972:6;15919:60;:::i;:::-;15909:70;;15783:203;15773:1;15770;15766:9;15761:14;;15726:260;;;15730:14;15999:3;15992:10;;15442:566;;;;;;;:::o;16016:104::-;16093:21;16108:5;16093:21;:::i;:::-;16088:3;16081:34;16075:45;;:::o;16150:310::-;;16282:88;16363:6;16358:3;16282:88;:::i;:::-;16275:95;;16382:43;16418:6;16413:3;16406:5;16382:43;:::i;:::-;16447:6;16442:3;16438:16;16431:23;;16268:192;;;;;:::o;16468:343::-;;16578:38;16610:5;16578:38;:::i;:::-;16628:70;16691:6;16686:3;16628:70;:::i;:::-;16621:77;;16703:52;16748:6;16743:3;16736:4;16729:5;16725:16;16703:52;:::i;:::-;16776:29;16798:6;16776:29;:::i;:::-;16771:3;16767:39;16760:46;;16558:253;;;;;:::o;16818:356::-;;16946:38;16978:5;16946:38;:::i;:::-;16996:88;17077:6;17072:3;16996:88;:::i;:::-;16989:95;;17089:52;17134:6;17129:3;17122:4;17115:5;17111:16;17089:52;:::i;:::-;17162:6;17157:3;17153:16;17146:23;;16926:248;;;;;:::o;17181:202::-;17302:75;17371:5;17302:75;:::i;:::-;17297:3;17290:88;17284:99;;:::o;17390:168::-;17494:58;17546:5;17494:58;:::i;:::-;17489:3;17482:71;17476:82;;:::o;17566:327::-;;17726:67;17790:2;17785:3;17726:67;:::i;:::-;17719:74;;17826:29;17822:1;17817:3;17813:11;17806:50;17884:2;17879:3;17875:12;17868:19;;17712:181;;;:::o;17902:321::-;;18062:67;18126:2;18121:3;18062:67;:::i;:::-;18055:74;;18162:23;18158:1;18153:3;18149:11;18142:44;18214:2;18209:3;18205:12;18198:19;;18048:175;;;:::o;18232:304::-;;18392:66;18456:1;18451:3;18392:66;:::i;:::-;18385:73;;18491:7;18487:1;18482:3;18478:11;18471:28;18527:2;18522:3;18518:12;18511:19;;18378:158;;;:::o;18545:306::-;;18705:66;18769:1;18764:3;18705:66;:::i;:::-;18698:73;;18804:9;18800:1;18795:3;18791:11;18784:30;18842:2;18837:3;18833:12;18826:19;;18691:160;;;:::o;18859:110::-;18940:23;18957:5;18940:23;:::i;:::-;18935:3;18928:36;18922:47;;:::o;18976:103::-;19049:24;19067:5;19049:24;:::i;:::-;19044:3;19037:37;19031:48;;:::o;19086:113::-;19169:24;19187:5;19169:24;:::i;:::-;19164:3;19157:37;19151:48;;:::o;19206:291::-;;19369:103;19468:3;19459:6;19451;19369:103;:::i;:::-;19362:110;;19489:3;19482:10;;19350:147;;;;;:::o;19504:271::-;;19657:93;19746:3;19737:6;19657:93;:::i;:::-;19650:100;;19767:3;19760:10;;19638:137;;;;:::o;19782:222::-;;19909:2;19898:9;19894:18;19886:26;;19923:71;19991:1;19980:9;19976:17;19967:6;19923:71;:::i;:::-;19880:124;;;;:::o;20011:238::-;;20146:2;20135:9;20131:18;20123:26;;20160:79;20236:1;20225:9;20221:17;20212:6;20160:79;:::i;:::-;20117:132;;;;:::o;20256:349::-;;20419:2;20408:9;20404:18;20396:26;;20433:79;20509:1;20498:9;20494:17;20485:6;20433:79;:::i;:::-;20523:72;20591:2;20580:9;20576:18;20567:6;20523:72;:::i;:::-;20390:215;;;;;:::o;20612:333::-;;20767:2;20756:9;20752:18;20744:26;;20781:71;20849:1;20838:9;20834:17;20825:6;20781:71;:::i;:::-;20863:72;20931:2;20920:9;20916:18;20907:6;20863:72;:::i;:::-;20738:207;;;;;:::o;20952:1416::-;;21413:3;21402:9;21398:19;21390:27;;21428:71;21496:1;21485:9;21481:17;21472:6;21428:71;:::i;:::-;21547:9;21541:4;21537:20;21532:2;21521:9;21517:18;21510:48;21572:108;21675:4;21666:6;21572:108;:::i;:::-;21564:116;;21728:9;21722:4;21718:20;21713:2;21702:9;21698:18;21691:48;21753:108;21856:4;21847:6;21753:108;:::i;:::-;21745:116;;21909:9;21903:4;21899:20;21894:2;21883:9;21879:18;21872:48;21934:108;22037:4;22028:6;21934:108;:::i;:::-;21926:116;;22053:73;22121:3;22110:9;22106:19;22097:6;22053:73;:::i;:::-;22175:9;22169:4;22165:20;22159:3;22148:9;22144:19;22137:49;22200:76;22271:4;22262:6;22200:76;:::i;:::-;22192:84;;22287:71;22353:3;22342:9;22338:19;22329:6;22287:71;:::i;:::-;21384:984;;;;;;;;;;:::o;22375:333::-;;22530:2;22519:9;22515:18;22507:26;;22544:71;22612:1;22601:9;22597:17;22588:6;22544:71;:::i;:::-;22626:72;22694:2;22683:9;22679:18;22670:6;22626:72;:::i;:::-;22501:207;;;;;:::o;22715:528::-;;22916:2;22905:9;22901:18;22893:26;;22930:71;22998:1;22987:9;22983:17;22974:6;22930:71;:::i;:::-;23012:72;23080:2;23069:9;23065:18;23056:6;23012:72;:::i;:::-;23132:9;23126:4;23122:20;23117:2;23106:9;23102:18;23095:48;23157:76;23228:4;23219:6;23157:76;:::i;:::-;23149:84;;22887:356;;;;;;:::o;23250:210::-;;23371:2;23360:9;23356:18;23348:26;;23385:65;23447:1;23436:9;23432:17;23423:6;23385:65;:::i;:::-;23342:118;;;;:::o;23467:306::-;;23612:2;23601:9;23597:18;23589:26;;23662:9;23656:4;23652:20;23648:1;23637:9;23633:17;23626:47;23687:76;23758:4;23749:6;23687:76;:::i;:::-;23679:84;;23583:190;;;;:::o;23780:298::-;;23945:2;23934:9;23930:18;23922:26;;23959:109;24065:1;24054:9;24050:17;24041:6;23959:109;:::i;:::-;23916:162;;;;:::o;24085:264::-;;24233:2;24222:9;24218:18;24210:26;;24247:92;24336:1;24325:9;24321:17;24312:6;24247:92;:::i;:::-;24204:145;;;;:::o;24356:416::-;;24556:2;24545:9;24541:18;24533:26;;24606:9;24600:4;24596:20;24592:1;24581:9;24577:17;24570:47;24631:131;24757:4;24631:131;:::i;:::-;24623:139;;24527:245;;;:::o;24779:416::-;;24979:2;24968:9;24964:18;24956:26;;25029:9;25023:4;25019:20;25015:1;25004:9;25000:17;24993:47;25054:131;25180:4;25054:131;:::i;:::-;25046:139;;24950:245;;;:::o;25202:416::-;;25402:2;25391:9;25387:18;25379:26;;25452:9;25446:4;25442:20;25438:1;25427:9;25423:17;25416:47;25477:131;25603:4;25477:131;:::i;:::-;25469:139;;25373:245;;;:::o;25625:416::-;;25825:2;25814:9;25810:18;25802:26;;25875:9;25869:4;25865:20;25861:1;25850:9;25846:17;25839:47;25900:131;26026:4;25900:131;:::i;:::-;25892:139;;25796:245;;;:::o;26048:222::-;;26175:2;26164:9;26160:18;26152:26;;26189:71;26257:1;26246:9;26242:17;26233:6;26189:71;:::i;:::-;26146:124;;;;:::o;26277:481::-;;26482:2;26471:9;26467:18;26459:26;;26496:71;26564:1;26553:9;26549:17;26540:6;26496:71;:::i;:::-;26615:9;26609:4;26605:20;26600:2;26589:9;26585:18;26578:48;26640:108;26743:4;26734:6;26640:108;:::i;:::-;26632:116;;26453:305;;;;;:::o;26765:656::-;;27002:3;26991:9;26987:19;26979:27;;27017:71;27085:1;27074:9;27070:17;27061:6;27017:71;:::i;:::-;27099:72;27167:2;27156:9;27152:18;27143:6;27099:72;:::i;:::-;27182:80;27258:2;27247:9;27243:18;27234:6;27182:80;:::i;:::-;27310:9;27304:4;27300:20;27295:2;27284:9;27280:18;27273:48;27335:76;27406:4;27397:6;27335:76;:::i;:::-;27327:84;;26973:448;;;;;;;:::o;27428:832::-;;27725:3;27714:9;27710:19;27702:27;;27740:71;27808:1;27797:9;27793:17;27784:6;27740:71;:::i;:::-;27822:72;27890:2;27879:9;27875:18;27866:6;27822:72;:::i;:::-;27942:9;27936:4;27932:20;27927:2;27916:9;27912:18;27905:48;27967:108;28070:4;28061:6;27967:108;:::i;:::-;27959:116;;28086:80;28162:2;28151:9;28147:18;28138:6;28086:80;:::i;:::-;28177:73;28245:3;28234:9;28230:19;28221:6;28177:73;:::i;:::-;27696:564;;;;;;;;:::o;28267:256::-;;28329:2;28323:9;28313:19;;28367:4;28359:6;28355:17;28466:6;28454:10;28451:22;28430:18;28418:10;28415:34;28412:62;28409:2;;;28487:1;28484;28477:12;28409:2;28507:10;28503:2;28496:22;28307:216;;;;:::o;28530:304::-;;28689:18;28681:6;28678:30;28675:2;;;28721:1;28718;28711:12;28675:2;28756:4;28748:6;28744:17;28736:25;;28819:4;28813;28809:15;28801:23;;28612:222;;;:::o;28841:313::-;;29009:18;29001:6;28998:30;28995:2;;;29041:1;29038;29031:12;28995:2;29076:4;29068:6;29064:17;29056:25;;29139:4;29133;29129:15;29121:23;;28932:222;;;:::o;29161:304::-;;29320:18;29312:6;29309:30;29306:2;;;29352:1;29349;29342:12;29306:2;29387:4;29379:6;29375:17;29367:25;;29450:4;29444;29440:15;29432:23;;29243:222;;;:::o;29472:321::-;;29615:18;29607:6;29604:30;29601:2;;;29647:1;29644;29637:12;29601:2;29714:4;29710:9;29703:4;29695:6;29691:17;29687:33;29679:41;;29778:4;29772;29768:15;29760:23;;29538:255;;;:::o;29800:151::-;;29886:3;29878:11;;29924:4;29919:3;29915:14;29907:22;;29872:79;;;:::o;29958:151::-;;30044:3;30036:11;;30082:4;30077:3;30073:14;30065:22;;30030:79;;;:::o;30116:137::-;;30225:5;30219:12;30209:22;;30190:63;;;:::o;30260:137::-;;30369:5;30363:12;30353:22;;30334:63;;;:::o;30404:121::-;;30497:5;30491:12;30481:22;;30462:63;;;:::o;30532:108::-;;30630:4;30625:3;30621:14;30613:22;;30607:33;;;:::o;30647:108::-;;30745:4;30740:3;30736:14;30728:22;;30722:33;;;:::o;30763:178::-;;30893:6;30888:3;30881:19;30930:4;30925:3;30921:14;30906:29;;30874:67;;;;:::o;30950:178::-;;31080:6;31075:3;31068:19;31117:4;31112:3;31108:14;31093:29;;31061:67;;;;:::o;31137:162::-;;31251:6;31246:3;31239:19;31288:4;31283:3;31279:14;31264:29;;31232:67;;;;:::o;31308:144::-;;31443:3;31428:18;;31421:31;;;;:::o;31461:163::-;;31576:6;31571:3;31564:19;31613:4;31608:3;31604:14;31589:29;;31557:67;;;;:::o;31632:91::-;;31694:24;31712:5;31694:24;:::i;:::-;31683:35;;31677:46;;;:::o;31730:99::-;;31800:24;31818:5;31800:24;:::i;:::-;31789:35;;31783:46;;;:::o;31836:85::-;;31909:5;31902:13;31895:21;31884:32;;31878:43;;;:::o;31928:84::-;;32000:6;31993:5;31989:18;31978:29;;31972:40;;;:::o;32019:121::-;;32092:42;32085:5;32081:54;32070:65;;32064:76;;;:::o;32147:72::-;;32209:5;32198:16;;32192:27;;;:::o;32226:129::-;;32313:37;32344:5;32313:37;:::i;:::-;32300:50;;32294:61;;;:::o;32362:197::-;;32479:75;32548:5;32479:75;:::i;:::-;32466:88;;32460:99;;;:::o;32566:146::-;;32683:24;32701:5;32683:24;:::i;:::-;32670:37;;32664:48;;;:::o;32719:163::-;;32819:58;32871:5;32819:58;:::i;:::-;32806:71;;32800:82;;;:::o;32889:129::-;;32989:24;33007:5;32989:24;:::i;:::-;32976:37;;32970:48;;;:::o;33025:121::-;;33104:37;33135:5;33104:37;:::i;:::-;33091:50;;33085:61;;;:::o;33153:108::-;;33232:24;33250:5;33232:24;:::i;:::-;33219:37;;33213:48;;;:::o;33269:145::-;33350:6;33345:3;33340;33327:30;33406:1;33397:6;33392:3;33388:16;33381:27;33320:94;;;:::o;33423:268::-;33488:1;33495:101;33509:6;33506:1;33503:13;33495:101;;;33585:1;33580:3;33576:11;33570:18;33566:1;33561:3;33557:11;33550:39;33531:2;33528:1;33524:10;33519:15;;33495:101;;;33611:6;33608:1;33605:13;33602:2;;;33676:1;33667:6;33662:3;33658:16;33651:27;33602:2;33472:219;;;;:::o;33699:97::-;;33787:2;33783:7;33778:2;33771:5;33767:14;33763:28;33753:38;;33747:49;;;:::o;33804:117::-;33873:24;33891:5;33873:24;:::i;:::-;33866:5;33863:35;33853:2;;33912:1;33909;33902:12;33853:2;33847:74;:::o;33928:133::-;34005:32;34031:5;34005:32;:::i;:::-;33998:5;33995:43;33985:2;;34052:1;34049;34042:12;33985:2;33979:82;:::o;34068:111::-;34134:21;34149:5;34134:21;:::i;:::-;34127:5;34124:32;34114:2;;34170:1;34167;34160:12;34114:2;34108:71;:::o;34186:117::-;34255:24;34273:5;34255:24;:::i;:::-;34248:5;34245:35;34235:2;;34294:1;34291;34284:12;34235:2;34229:74;:::o

Swarm Source

ipfs://f0830208164834d52ed727de76fc698c48bef5c8626c601feb42b8e53da174d6
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading