Contract 0x16de59092dAE5CcF4A1E6439D611fd0653f0Bd01

 
Ad
Ad
Txn Hash Method
Block
From
To
Value
0x12e3d711a10b664ab5676720a820f9a828efc0a557a10ab1b95624e90720c85dWithdraw(pending)2021-06-20 1:44:302 days 19 hrs ago0xa2128aa63329dc99032ea7066b2ff1d5e5c2ba99 IN yearn: yDAI Token0 Ether(Pending)(Pending)
0xdcc18b7eba27e244e55a193dd57c74d803de33accaa90fddf0e91d1969765193Approve126857902021-06-22 19:07:221 hr 41 mins ago0x9ce2f61cd0c873eb7d6a2917d1df1c14728f42d6 IN  yearn: yDAI Token0 Ether0.00117572525
0xfcd0d1bd17f3dbd81cea800946b030323d918e626510d9aa095407818a46c41cDeposit126853062021-06-22 17:16:033 hrs 33 mins ago0x2effd1f676c4830c5b9c726d5a77c50fe02210c6 IN  yearn: yDAI Token0 Ether0.00943694444
0xe93524d07ccbc64a355a08d3913913cbdb30ded7b87071fdc0bd2106e3c169c0Withdraw126827932021-06-22 7:47:2613 hrs 1 min ago0x909ba166bee2a5d1f8c263e5e0b4c06b137939ed IN  yearn: yDAI Token0 Ether0.00316174515
0xfc24741c4ccb6230bc467d6bb97b4b99f6b20d6bd5b060530d989677616c2920Approve126821812021-06-22 5:32:1015 hrs 17 mins ago0xf3df39bb5d9876e1c89d1a99b0f1e81d9b469f40 IN  yearn: yDAI Token0 Ether0.00023857616
0x78913e09b5161ef2d998b58ba3ec004be51da8da8838c4cc3188e5f1302194daDeposit126803132021-06-21 22:31:4522 hrs 17 mins ago0xd70fd4d070c042eee6588118943367a1be8fc265 IN  yearn: yDAI Token0 Ether0.01629279671
0xf19cb75a53e01af68471d4d434755aa5680251fef9f67aef9975efdb09912532Withdraw126796532021-06-21 19:58:181 day 50 mins ago0x289795e6177d2170ba43ced4032a585d0677c6b5 IN  yearn: yDAI Token0 Ether0.00695623533
0x067a006a5c800676a5a3166a15810ac3aba7c4eff1bf4059bdc725f0e292b2fdWithdraw126784342021-06-21 15:29:271 day 5 hrs ago0xa3c36dc622bdbed4b2a82fa0bb379a815d058670 IN  yearn: yDAI Token0 Ether0.01299001557
0xb8159816b445cd657b647bac3fce0ebd37a6d7aef91a9d97ae9827aa29c36948Approve126779472021-06-21 13:40:451 day 7 hrs ago0xde6135b1cdc2e12a6a63da98f62da660bf649c39 IN  yearn: yDAI Token0 Ether0.0023652550
0x7f3cf492c4ecdde37fc1df10994f6d661076e4824800690f587007dc03748c4cWithdraw126755332021-06-21 4:27:491 day 16 hrs ago0x13f97a98fddbf4b47fee8750cb6c0c9c3ca48a1f IN  yearn: yDAI Token0 Ether0.00617430329
0x92659f1e746a3b2c08b4c8460807a687f53a9b9abc65946c2716aa075091822aDeposit126745722021-06-21 0:46:461 day 20 hrs ago0x08b267c975b688b1b0d45ec5588cb759cbd95d26 IN  yearn: yDAI Token0 Ether0.00212410
0x12f2b98e3a836341b53ae8d2c3b848817508513e74f3bb82f2395518ea91e7daDeposit126744332021-06-21 0:15:171 day 20 hrs ago0xdfc798c8143aaf7655bbf840eebf8bae008dbbb6 IN  yearn: yDAI Token0 Ether0.0012621845.5
0x3fd8d3a48f0625bb6cba04d5bf9dc8dc6d545daa650adc52e0b0872f379d7cb8Withdraw126739222021-06-20 22:31:331 day 22 hrs ago0x735640298e8d91475847d2eff45b3c87ca8d0362 IN  yearn: yDAI Token0 Ether0.0025295412
0xddd32dcff124e11942aa6edd3e4c2c6fde4806bc22218a034a426adfd3e09206Deposit126724412021-06-20 17:09:412 days 3 hrs ago0x73d05bf6bb6dc5125ea715caff1005e4c1794c0f IN  yearn: yDAI Token0 Ether0.0022948810
0xbc06eb8907da9586a0566455d24105474f325775d32db3dd357b17190a26fe8eWithdraw126712912021-06-20 12:40:382 days 8 hrs ago0x4d309673e7ed5f6025b8515274b4914035f8610e IN  yearn: yDAI Token0 Ether0.00255488412
0x667d648d3fab0a2ceb3c423feaef634a9587e36dcff524b253c8957100b22beeWithdraw126709752021-06-20 11:26:202 days 9 hrs ago0xeb2284644fd133b58f7302c5b95d677c4e0ad977 IN  yearn: yDAI Token0 Ether0.0021078310
0xda2d89109db942ece906accb5a31d6ba376e78c0c4cf3fd691b3f564f5996d36Deposit126700452021-06-20 8:00:562 days 12 hrs ago0x08b267c975b688b1b0d45ec5588cb759cbd95d26 IN  yearn: yDAI Token0 Ether0.00229510
0xab05fd785e326f8416d1074778a4867c3806d6e07d5a561bf2dd803b963fbff6Deposit126672812021-06-19 21:45:502 days 23 hrs ago0x0b0806ee651e7b05fc383d1b1bed3525148e9e87 IN  yearn: yDAI Token0 Ether0.00665515229
0x91f43704c24f900e8bb8efe8dd8d55bf95389fa0617e8bbd4b240a6221c87c4dApprove126667882021-06-19 19:52:363 days 56 mins ago0x229fed4f4192ba3aba690e37088bb4a68881df3d IN  yearn: yDAI Token0 Ether0.0006797728514.37
0x9576d18bfdc185d0a2e18a3be80a5e19bcd6346781f18d7ee523a34ca23f6e82Withdraw126663702021-06-19 18:18:173 days 2 hrs ago0x5cf265a1eda0f2cfe6b0fd504a85cf8690b3f530 IN  yearn: yDAI Token0 Ether0.00276779113
0x422707a3075f9f4a0a8937f80a202855d6f54a9c2ef9d61b43a42cd4b32e8d3eDeposit126661172021-06-19 17:24:433 days 3 hrs ago0x75e6b842368959fbd0fa4242fdc9aa5e945c61db IN  yearn: yDAI Token0 Ether0.00390129617
0x68aa3c2a3b798ba144946fd2d849f50ca17e0edd9ff77e4c0c6c864e9e024aafDeposit126660062021-06-19 16:58:023 days 3 hrs ago0x0737ea8c4358ce0ea04d46aaf362939f2be3d6ec IN  yearn: yDAI Token0 Ether0.0017168
0x940309be385134b2889ec5966a1f488cf6f44eaffcbe9c40b66ab5aa3f31fff3Deposit126651992021-06-19 13:56:203 days 6 hrs ago0x94a8608e667242b40a808ad25bdb385e3abceb68 IN  yearn: yDAI Token0 Ether0.00278834413
0xc995bb687025ee2269efac4f2a1ee50b5031c4bd1b62d7bdfd191a3907d4ae67Approve126625812021-06-19 4:05:133 days 16 hrs ago0x87d572443cf08b321967325bb9972d85ceaa78c2 IN  yearn: yDAI Token0 Ether0.00051745105211.000001123
0xc842ecbb37d4935eb78ab4963150d41f2def4aa9770920484bf6793ed346bf0bWithdraw126600452021-06-18 18:27:464 days 2 hrs ago0x16668854dd35b25d3b219db372cb256eb9898b98 IN  yearn: yDAI Token0 Ether0.00316192515
[ Download CSV Export 

OVERVIEW

iearn.finance yield bearing tokens

View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
yDAI

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-02-12
*/

pragma solidity ^0.5.0;
pragma experimental ABIEncoderV2;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract Context {
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 _totalSupply;
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
    }
}

contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }
    function name() public view returns (string memory) {
        return _name;
    }
    function symbol() public view returns (string memory) {
        return _symbol;
    }
    function decimals() public view returns (uint8) {
        return _decimals;
    }
}

contract ReentrancyGuard {
    uint256 private _guardCounter;

    constructor () internal {
        _guardCounter = 1;
    }

    modifier nonReentrant() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call");
    }
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;

        return c;
    }
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

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 safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }
    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");
        }
    }
}

interface Compound {
    function mint ( uint256 mintAmount ) external returns ( uint256 );
    function redeem(uint256 redeemTokens) external returns (uint256);
    function exchangeRateStored() external view returns (uint);
}

interface Fulcrum {
    function mint(address receiver, uint256 amount) external payable returns (uint256 mintAmount);
    function burn(address receiver, uint256 burnAmount) external returns (uint256 loanAmountPaid);
    function assetBalanceOf(address _owner) external view returns (uint256 balance);
}

interface ILendingPoolAddressesProvider {
    function getLendingPool() external view returns (address);
}

interface Aave {
    function deposit(address _reserve, uint256 _amount, uint16 _referralCode) external;
}

interface AToken {
    function redeem(uint256 amount) external;
}

interface IIEarnManager {
    function recommend(address _token) external view returns (
      string memory choice,
      uint256 capr,
      uint256 iapr,
      uint256 aapr,
      uint256 dapr
    );
}

contract Structs {
    struct Val {
        uint256 value;
    }

    enum ActionType {
        Deposit,   // supply tokens
        Withdraw  // borrow tokens
    }

    enum AssetDenomination {
        Wei // the amount is denominated in wei
    }

    enum AssetReference {
        Delta // the amount is given as a delta from the current value
    }

    struct AssetAmount {
        bool sign; // true if positive
        AssetDenomination denomination;
        AssetReference ref;
        uint256 value;
    }

    struct ActionArgs {
        ActionType actionType;
        uint256 accountId;
        AssetAmount amount;
        uint256 primaryMarketId;
        uint256 secondaryMarketId;
        address otherAddress;
        uint256 otherAccountId;
        bytes data;
    }

    struct Info {
        address owner;  // The address that owns the account
        uint256 number; // A nonce that allows a single address to control many accounts
    }

    struct Wei {
        bool sign; // true if positive
        uint256 value;
    }
}

contract DyDx is Structs {
    function getAccountWei(Info memory account, uint256 marketId) public view returns (Wei memory);
    function operate(Info[] memory, ActionArgs[] memory) public;
}

interface LendingPoolAddressesProvider {
    function getLendingPool() external view returns (address);
    function getLendingPoolCore() external view returns (address);
}

contract yDAI is ERC20, ERC20Detailed, ReentrancyGuard, Structs {
  using SafeERC20 for IERC20;
  using Address for address;
  using SafeMath for uint256;

  uint256 public pool;
  address public token;
  address public compound;
  address public fulcrum;
  address public aave;
  address public aaveToken;
  address public dydx;
  uint256 public dToken;
  address public apr;

  enum Lender {
      NONE,
      DYDX,
      COMPOUND,
      AAVE,
      FULCRUM
  }

  Lender public provider = Lender.NONE;

  constructor () public ERC20Detailed("iearn DAI", "yDAI", 18) {
    token = address(0x6B175474E89094C44Da98b954EedeAC495271d0F);
    apr = address(0xdD6d648C991f7d47454354f4Ef326b04025a48A8);
    dydx = address(0x1E0447b19BB6EcFdAe1e4AE1694b0C3659614e4e);
    aave = address(0x24a42fD28C976A61Df5D00D0599C34c4f90748c8);
    fulcrum = address(0x493C57C4763932315A328269E1ADaD09653B9081);
    aaveToken = address(0xfC1E690f61EFd961294b3e1Ce3313fBD8aa4f85d);
    compound = address(0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643);
    dToken = 3;
    approveToken();
  }

  // Quick swap low gas method for pool swaps
  function deposit(uint256 _amount)
      external
      nonReentrant
  {
      require(_amount > 0, "deposit must be greater than 0");
      pool = _calcPoolValueInToken();

      IERC20(token).safeTransferFrom(msg.sender, address(this), _amount);

      // Calculate pool shares
      uint256 shares = 0;
      if (pool == 0) {
        shares = _amount;
        pool = _amount;
      } else {
        shares = (_amount.mul(_totalSupply)).div(pool);
      }
      pool = _calcPoolValueInToken();
      _mint(msg.sender, shares);
  }

  // No rebalance implementation for lower fees and faster swaps
  function withdraw(uint256 _shares)
      external
      nonReentrant
  {
      require(_shares > 0, "withdraw must be greater than 0");

      uint256 ibalance = balanceOf(msg.sender);
      require(_shares <= ibalance, "insufficient balance");

      // Could have over value from cTokens
      pool = _calcPoolValueInToken();
      // Calc to redeem before updating balances
      uint256 r = (pool.mul(_shares)).div(_totalSupply);


      _balances[msg.sender] = _balances[msg.sender].sub(_shares, "redeem amount exceeds balance");
      _totalSupply = _totalSupply.sub(_shares);

      emit Transfer(msg.sender, address(0), _shares);

      // Check balance
      uint256 b = IERC20(token).balanceOf(address(this));
      if (b < r) {
        _withdrawSome(r.sub(b));
      }

      IERC20(token).transfer(msg.sender, r);
      pool = _calcPoolValueInToken();
  }

  function() external payable {

  }

  function recommend() public view returns (Lender) {
    (,uint256 capr,uint256 iapr,uint256 aapr,uint256 dapr) = IIEarnManager(apr).recommend(token);
    uint256 max = 0;
    if (capr > max) {
      max = capr;
    }
    if (iapr > max) {
      max = iapr;
    }
    if (aapr > max) {
      max = aapr;
    }
    if (dapr > max) {
      max = dapr;
    }

    Lender newProvider = Lender.NONE;
    if (max == capr) {
      newProvider = Lender.COMPOUND;
    } else if (max == iapr) {
      newProvider = Lender.FULCRUM;
    } else if (max == aapr) {
      newProvider = Lender.AAVE;
    } else if (max == dapr) {
      newProvider = Lender.DYDX;
    }
    return newProvider;
  }

  function supplyDydx(uint256 amount) public returns(uint) {
      Info[] memory infos = new Info[](1);
      infos[0] = Info(address(this), 0);

      AssetAmount memory amt = AssetAmount(true, AssetDenomination.Wei, AssetReference.Delta, amount);
      ActionArgs memory act;
      act.actionType = ActionType.Deposit;
      act.accountId = 0;
      act.amount = amt;
      act.primaryMarketId = dToken;
      act.otherAddress = address(this);

      ActionArgs[] memory args = new ActionArgs[](1);
      args[0] = act;

      DyDx(dydx).operate(infos, args);
  }

  function _withdrawDydx(uint256 amount) internal {
      Info[] memory infos = new Info[](1);
      infos[0] = Info(address(this), 0);

      AssetAmount memory amt = AssetAmount(false, AssetDenomination.Wei, AssetReference.Delta, amount);
      ActionArgs memory act;
      act.actionType = ActionType.Withdraw;
      act.accountId = 0;
      act.amount = amt;
      act.primaryMarketId = dToken;
      act.otherAddress = address(this);

      ActionArgs[] memory args = new ActionArgs[](1);
      args[0] = act;

      DyDx(dydx).operate(infos, args);
  }

  function getAave() public view returns (address) {
    return LendingPoolAddressesProvider(aave).getLendingPool();
  }
  function getAaveCore() public view returns (address) {
    return LendingPoolAddressesProvider(aave).getLendingPoolCore();
  }

  function approveToken() public {
      IERC20(token).safeApprove(compound, uint(-1)); //also add to constructor
      IERC20(token).safeApprove(dydx, uint(-1));
      IERC20(token).safeApprove(getAaveCore(), uint(-1));
      IERC20(token).safeApprove(fulcrum, uint(-1));
  }

  function balance() public view returns (uint256) {
    return IERC20(token).balanceOf(address(this));
  }

  function balanceDydx() public view returns (uint256) {
      Wei memory bal = DyDx(dydx).getAccountWei(Info(address(this), 0), dToken);
      return bal.value;
  }
  function balanceCompound() public view returns (uint256) {
      return IERC20(compound).balanceOf(address(this));
  }
  function balanceCompoundInToken() public view returns (uint256) {
    // Mantisa 1e18 to decimals
    uint256 b = balanceCompound();
    if (b > 0) {
      b = b.mul(Compound(compound).exchangeRateStored()).div(1e18);
    }
    return b;
  }
  function balanceFulcrumInToken() public view returns (uint256) {
    uint256 b = balanceFulcrum();
    if (b > 0) {
      b = Fulcrum(fulcrum).assetBalanceOf(address(this));
    }
    return b;
  }
  function balanceFulcrum() public view returns (uint256) {
    return IERC20(fulcrum).balanceOf(address(this));
  }
  function balanceAave() public view returns (uint256) {
    return IERC20(aaveToken).balanceOf(address(this));
  }

  function _balance() internal view returns (uint256) {
    return IERC20(token).balanceOf(address(this));
  }

  function _balanceDydx() internal view returns (uint256) {
      Wei memory bal = DyDx(dydx).getAccountWei(Info(address(this), 0), dToken);
      return bal.value;
  }
  function _balanceCompound() internal view returns (uint256) {
      return IERC20(compound).balanceOf(address(this));
  }
  function _balanceCompoundInToken() internal view returns (uint256) {
    // Mantisa 1e18 to decimals
    uint256 b = balanceCompound();
    if (b > 0) {
      b = b.mul(Compound(compound).exchangeRateStored()).div(1e18);
    }
    return b;
  }
  function _balanceFulcrumInToken() internal view returns (uint256) {
    uint256 b = balanceFulcrum();
    if (b > 0) {
      b = Fulcrum(fulcrum).assetBalanceOf(address(this));
    }
    return b;
  }
  function _balanceFulcrum() internal view returns (uint256) {
    return IERC20(fulcrum).balanceOf(address(this));
  }
  function _balanceAave() internal view returns (uint256) {
    return IERC20(aaveToken).balanceOf(address(this));
  }

  function _withdrawAll() internal {
    uint256 amount = _balanceCompound();
    if (amount > 0) {
      _withdrawCompound(amount);
    }
    amount = _balanceDydx();
    if (amount > 0) {
      _withdrawDydx(amount);
    }
    amount = _balanceFulcrum();
    if (amount > 0) {
      _withdrawFulcrum(amount);
    }
    amount = _balanceAave();
    if (amount > 0) {
      _withdrawAave(amount);
    }
  }

  function _withdrawSomeCompound(uint256 _amount) internal {
    uint256 b = balanceCompound();
    uint256 bT = balanceCompoundInToken();
    require(bT >= _amount, "insufficient funds");
    // can have unintentional rounding errors
    uint256 amount = (b.mul(_amount)).div(bT).add(1);
    _withdrawCompound(amount);
  }

  // 1999999614570950845
  function _withdrawSomeFulcrum(uint256 _amount) internal {
    // Balance of fulcrum tokens, 1 iDAI = 1.00x DAI
    uint256 b = balanceFulcrum(); // 1970469086655766652
    // Balance of token in fulcrum
    uint256 bT = balanceFulcrumInToken(); // 2000000803224344406
    require(bT >= _amount, "insufficient funds");
    // can have unintentional rounding errors
    uint256 amount = (b.mul(_amount)).div(bT).add(1);
    _withdrawFulcrum(amount);
  }

  function _withdrawSome(uint256 _amount) internal {
    if (provider == Lender.COMPOUND) {
      _withdrawSomeCompound(_amount);
    }
    if (provider == Lender.AAVE) {
      require(balanceAave() >= _amount, "insufficient funds");
      _withdrawAave(_amount);
    }
    if (provider == Lender.DYDX) {
      require(balanceDydx() >= _amount, "insufficient funds");
      _withdrawDydx(_amount);
    }
    if (provider == Lender.FULCRUM) {
      _withdrawSomeFulcrum(_amount);
    }
  }

  function rebalance() public {
    Lender newProvider = recommend();

    if (newProvider != provider) {
      _withdrawAll();
    }

    if (balance() > 0) {
      if (newProvider == Lender.DYDX) {
        supplyDydx(balance());
      } else if (newProvider == Lender.FULCRUM) {
        supplyFulcrum(balance());
      } else if (newProvider == Lender.COMPOUND) {
        supplyCompound(balance());
      } else if (newProvider == Lender.AAVE) {
        supplyAave(balance());
      }
    }

    provider = newProvider;
  }

  // Internal only rebalance for better gas in redeem
  function _rebalance(Lender newProvider) internal {
    if (_balance() > 0) {
      if (newProvider == Lender.DYDX) {
        supplyDydx(_balance());
      } else if (newProvider == Lender.FULCRUM) {
        supplyFulcrum(_balance());
      } else if (newProvider == Lender.COMPOUND) {
        supplyCompound(_balance());
      } else if (newProvider == Lender.AAVE) {
        supplyAave(_balance());
      }
    }
    provider = newProvider;
  }

  function supplyAave(uint amount) public {
      Aave(getAave()).deposit(token, amount, 0);
  }
  function supplyFulcrum(uint amount) public {
      require(Fulcrum(fulcrum).mint(address(this), amount) > 0, "FULCRUM: supply failed");
  }
  function supplyCompound(uint amount) public {
      require(Compound(compound).mint(amount) == 0, "COMPOUND: supply failed");
  }
  function _withdrawAave(uint amount) internal {
      AToken(aaveToken).redeem(amount);
  }
  function _withdrawFulcrum(uint amount) internal {
      require(Fulcrum(fulcrum).burn(address(this), amount) > 0, "FULCRUM: withdraw failed");
  }
  function _withdrawCompound(uint amount) internal {
      require(Compound(compound).redeem(amount) == 0, "COMPOUND: withdraw failed");
  }

  function invest(uint256 _amount)
      external
      nonReentrant
  {
      require(_amount > 0, "deposit must be greater than 0");
      pool = calcPoolValueInToken();

      IERC20(token).safeTransferFrom(msg.sender, address(this), _amount);

      rebalance();

      // Calculate pool shares
      uint256 shares = 0;
      if (pool == 0) {
        shares = _amount;
        pool = _amount;
      } else {
        shares = (_amount.mul(_totalSupply)).div(pool);
      }
      pool = calcPoolValueInToken();
      _mint(msg.sender, shares);
  }

  function _calcPoolValueInToken() internal view returns (uint) {
    return _balanceCompoundInToken()
      .add(_balanceFulcrumInToken())
      .add(_balanceDydx())
      .add(_balanceAave())
      .add(_balance());
  }

  function calcPoolValueInToken() public view returns (uint) {
    return balanceCompoundInToken()
      .add(balanceFulcrumInToken())
      .add(balanceDydx())
      .add(balanceAave())
      .add(balance());
  }

  function getPricePerFullShare() public view returns (uint) {
    uint _pool = calcPoolValueInToken();
    return _pool.mul(1e18).div(_totalSupply);
  }

  // Redeem any invested tokens from the pool
  function redeem(uint256 _shares)
      external
      nonReentrant
  {
      require(_shares > 0, "withdraw must be greater than 0");

      uint256 ibalance = balanceOf(msg.sender);
      require(_shares <= ibalance, "insufficient balance");

      // Could have over value from cTokens
      pool = calcPoolValueInToken();
      // Calc to redeem before updating balances
      uint256 r = (pool.mul(_shares)).div(_totalSupply);


      _balances[msg.sender] = _balances[msg.sender].sub(_shares, "redeem amount exceeds balance");
      _totalSupply = _totalSupply.sub(_shares);

      emit Transfer(msg.sender, address(0), _shares);

      // Check ETH balance
      uint256 b = IERC20(token).balanceOf(address(this));
      Lender newProvider = provider;
      if (b < r) {
        newProvider = recommend();
        if (newProvider != provider) {
          _withdrawAll();
        } else {
          _withdrawSome(r.sub(b));
        }
      }

      IERC20(token).safeTransfer(msg.sender, r);

      if (newProvider != provider) {
        _rebalance(newProvider);
      }
      pool = calcPoolValueInToken();
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"aave","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"aaveToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"approveToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"apr","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceAave","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceCompound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceCompoundInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceDydx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceFulcrum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceFulcrumInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"calcPoolValueInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"compound","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dydx","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fulcrum","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAave","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAaveCore","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"invest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"provider","outputs":[{"internalType":"enum yDAI.Lender","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"rebalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"recommend","outputs":[{"internalType":"enum yDAI.Lender","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"redeem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyAave","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyCompound","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyDydx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyFulcrum","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526000600f60146101000a81548160ff021916908360048111156200002457fe5b02179055503480156200003657600080fd5b506040518060400160405280600981526020017f696561726e2044414900000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f794441490000000000000000000000000000000000000000000000000000000081525060128260039080519060200190620000bd929190620009c6565b508160049080519060200190620000d6929190620009c6565b5080600560006101000a81548160ff021916908360ff1602179055505050506001600681905550736b175474e89094c44da98b954eedeac495271d0f600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073dd6d648c991f7d47454354f4ef326b04025a48a8600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550731e0447b19bb6ecfdae1e4ae1694b0c3659614e4e600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507324a42fd28c976a61df5d00d0599c34c4f90748c8600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073493c57c4763932315a328269e1adad09653b9081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073fc1e690f61efd961294b3e1ce3313fbd8aa4f85d600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550735d3a536e4d6dbd6114cc1ead35777bab948e3643600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600e81905550620003686200036e60201b60201c565b62000edb565b62000404600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16620005b560201b6200369e179092919060201c565b6200049a600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16620005b560201b6200369e179092919060201c565b6200051d620004ae6200074060201b60201c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16620005b560201b6200369e179092919060201c565b620005b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16620005b560201b6200369e179092919060201c565b565b600081148062000655575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401620005ff92919062000d04565b60206040518083038186803b1580156200061857600080fd5b505afa1580156200062d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000653919081019062000b12565b145b62000697576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200068e9062000da2565b60405180910390fd5b6200073b838473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3905060e01b8484604051602401620006d292919062000d31565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050620007eb60201b60201c565b505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015620007ab57600080fd5b505afa158015620007c0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620007e6919081019062000aba565b905090565b620008178273ffffffffffffffffffffffffffffffffffffffff166200097a60201b620046f81760201c565b62000859576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008509062000dc4565b60405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff168360405162000884919062000ceb565b6000604051808303816000865af19150503d8060008114620008c3576040519150601f19603f3d011682016040523d82523d6000602084013e620008c8565b606091505b50915091508162000910576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009079062000d5e565b60405180910390fd5b60008151111562000974578080602001905162000931919081019062000ae6565b62000973576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200096a9062000d80565b60405180910390fd5b5b50505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b8214158015620009bd5750808214155b92505050919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000a0957805160ff191683800117855562000a3a565b8280016001018555821562000a3a579182015b8281111562000a3957825182559160200191906001019062000a1c565b5b50905062000a49919062000a4d565b5090565b62000a7291905b8082111562000a6e57600081600090555060010162000a54565b5090565b90565b60008151905062000a868162000e8d565b92915050565b60008151905062000a9d8162000ea7565b92915050565b60008151905062000ab48162000ec1565b92915050565b60006020828403121562000acd57600080fd5b600062000add8482850162000a75565b91505092915050565b60006020828403121562000af957600080fd5b600062000b098482850162000a8c565b91505092915050565b60006020828403121562000b2557600080fd5b600062000b358482850162000aa3565b91505092915050565b62000b498162000e0d565b82525050565b600062000b5c8262000de6565b62000b68818562000df1565b935062000b7a81856020860162000e57565b80840191505092915050565b600062000b9560208362000dfc565b91507f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646000830152602082019050919050565b600062000bd7602a8362000dfc565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b600062000c3f60368362000dfc565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b600062000ca7601f8362000dfc565b91507f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006000830152602082019050919050565b62000ce58162000e4d565b82525050565b600062000cf9828462000b4f565b915081905092915050565b600060408201905062000d1b600083018562000b3e565b62000d2a602083018462000b3e565b9392505050565b600060408201905062000d48600083018562000b3e565b62000d57602083018462000cda565b9392505050565b6000602082019050818103600083015262000d798162000b86565b9050919050565b6000602082019050818103600083015262000d9b8162000bc8565b9050919050565b6000602082019050818103600083015262000dbd8162000c30565b9050919050565b6000602082019050818103600083015262000ddf8162000c98565b9050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600062000e1a8262000e2d565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000e7757808201518184015260208101905062000e5a565b8381111562000e87576000848401525b50505050565b62000e988162000e0d565b811462000ea457600080fd5b50565b62000eb28162000e21565b811462000ebe57600080fd5b50565b62000ecc8162000e4d565b811462000ed857600080fd5b50565b615e7c8062000eeb6000396000f3fe60806040526004361061025c5760003560e01c80637d7c2a1c11610144578063b6b55f25116100b6578063e849d6591161007a578063e849d659146108f1578063f5a41dea1461091a578063f69e204614610945578063f7c1ec7714610970578063f82ce27d1461099b578063fc0c546a146109c65761025c565b8063b6b55f251461080c578063cf8ca42614610835578063d9d7858a14610860578063db006a751461088b578063dd62ed3e146108b45761025c565b806399b71d5c1161010857806399b71d5c146106fa578063a160176d14610711578063a457c2d71461073c578063a728797114610779578063a9059cbb146107a4578063b69ef8a8146107e15761025c565b80637d7c2a1c146106395780638124955c14610650578063819faf7b146106795780638e4ec6ef146106a457806395d89b41146106cf5761025c565b80632e1a7d4d116101dd57806358782c21116101a157806358782c211461052757806361c1ec551461055257806365aab7491461057d57806370a08231146105a65780637137ef99146105e357806377c7b8fc1461060e5761025c565b80632e1a7d4d14610440578063313ce56714610469578063395093511461049457806339c0a7e1146104d157806357ded9c9146104fc5761025c565b80630eb2a267116102245780630eb2a2671461035957806316f0115b1461038457806318160ddd146103af57806323b872dd146103da5780632afcf480146104175761025c565b806306636c1c1461025e57806306a3fe591461029b57806306fdde03146102c6578063085d4883146102f1578063095ea7b31461031c575b005b34801561026a57600080fd5b5061028560048036036102809190810190614be6565b6109f1565b6040516102929190615a7b565b60405180910390f35b3480156102a757600080fd5b506102b0610c2f565b6040516102bd9190615624565b60405180910390f35b3480156102d257600080fd5b506102db610c55565b6040516102e891906157b0565b60405180910390f35b3480156102fd57600080fd5b50610306610cf7565b6040516103139190615795565b60405180910390f35b34801561032857600080fd5b50610343600480360361033e9190810190614ac9565b610d0a565b604051610350919061577a565b60405180910390f35b34801561036557600080fd5b5061036e610d28565b60405161037b9190615a7b565b60405180910390f35b34801561039057600080fd5b50610399610dda565b6040516103a69190615a7b565b60405180910390f35b3480156103bb57600080fd5b506103c4610de0565b6040516103d19190615a7b565b60405180910390f35b3480156103e657600080fd5b5061040160048036036103fc9190810190614a7a565b610dea565b60405161040e919061577a565b60405180910390f35b34801561042357600080fd5b5061043e60048036036104399190810190614be6565b610ec3565b005b34801561044c57600080fd5b5061046760048036036104629190810190614be6565b61102f565b005b34801561047557600080fd5b5061047e61143c565b60405161048b9190615a96565b60405180910390f35b3480156104a057600080fd5b506104bb60048036036104b69190810190614ac9565b611453565b6040516104c8919061577a565b60405180910390f35b3480156104dd57600080fd5b506104e6611506565b6040516104f39190615a7b565b60405180910390f35b34801561050857600080fd5b506105116115f6565b60405161051e9190615624565b60405180910390f35b34801561053357600080fd5b5061053c61161c565b6040516105499190615624565b60405180910390f35b34801561055e57600080fd5b50610567611642565b6040516105749190615a7b565b60405180910390f35b34801561058957600080fd5b506105a4600480360361059f9190810190614be6565b6116f4565b005b3480156105b257600080fd5b506105cd60048036036105c891908101906149ec565b611790565b6040516105da9190615a7b565b60405180910390f35b3480156105ef57600080fd5b506105f86117d8565b6040516106059190615a7b565b60405180910390f35b34801561061a57600080fd5b5061062361184b565b6040516106309190615a7b565b60405180910390f35b34801561064557600080fd5b5061064e61188d565b005b34801561065c57600080fd5b5061067760048036036106729190810190614be6565b6119d4565b005b34801561068557600080fd5b5061068e611ac8565b60405161069b9190615624565b60405180910390f35b3480156106b057600080fd5b506106b9611aee565b6040516106c69190615624565b60405180910390f35b3480156106db57600080fd5b506106e4611b14565b6040516106f191906157b0565b60405180910390f35b34801561070657600080fd5b5061070f611bb6565b005b34801561071d57600080fd5b50610726611dd9565b6040516107339190615795565b60405180910390f35b34801561074857600080fd5b50610763600480360361075e9190810190614ac9565b611f45565b604051610770919061577a565b60405180910390f35b34801561078557600080fd5b5061078e612012565b60405161079b9190615a7b565b60405180910390f35b3480156107b057600080fd5b506107cb60048036036107c69190810190614ac9565b6120fe565b6040516107d8919061577a565b60405180910390f35b3480156107ed57600080fd5b506107f661211c565b6040516108039190615a7b565b60405180910390f35b34801561081857600080fd5b50610833600480360361082e9190810190614be6565b6121ce565b005b34801561084157600080fd5b5061084a612332565b6040516108579190615a7b565b60405180910390f35b34801561086c57600080fd5b506108756123e4565b6040516108829190615a7b565b60405180910390f35b34801561089757600080fd5b506108b260048036036108ad9190810190614be6565b6123ea565b005b3480156108c057600080fd5b506108db60048036036108d69190810190614a3e565b612823565b6040516108e89190615a7b565b60405180910390f35b3480156108fd57600080fd5b5061091860048036036109139190810190614be6565b6128aa565b005b34801561092657600080fd5b5061092f61299c565b60405161093c9190615a7b565b60405180910390f35b34801561095157600080fd5b5061095a612a67565b6040516109679190615624565b60405180910390f35b34801561097c57600080fd5b50610985612a8d565b6040516109929190615624565b60405180910390f35b3480156109a757600080fd5b506109b0612b34565b6040516109bd9190615624565b60405180910390f35b3480156109d257600080fd5b506109db612bdb565b6040516109e89190615624565b60405180910390f35b600060606001604051908082528060200260200182016040528015610a3057816020015b610a1d614743565b815260200190600190039081610a155790505b50905060405180604001604052803073ffffffffffffffffffffffffffffffffffffffff168152602001600081525081600081518110610a6c57fe5b6020026020010181905250610a7f614773565b6040518060800160405280600115158152602001600080811115610a9f57fe5b8152602001600080811115610ab057fe5b8152602001858152509050610ac36147b1565b600081600001906001811115610ad557fe5b90816001811115610ae257fe5b815250506000816020018181525050818160400181905250600e54816060018181525050308160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060606001604051908082528060200260200182016040528015610b7b57816020015b610b6861481d565b815260200190600190039081610b605790505b5090508181600081518110610b8c57fe5b6020026020010181905250600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67a6a4585836040518363ffffffff1660e01b8152600401610bf4929190615743565b600060405180830381600087803b158015610c0e57600080fd5b505af1158015610c22573d6000803e3d6000fd5b5050505050505050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ced5780601f10610cc257610100808354040283529160200191610ced565b820191906000526020600020905b815481529060010190602001808311610cd057829003601f168201915b5050505050905090565b600f60149054906101000a900460ff1681565b6000610d1e610d17612c01565b8484612c09565b6001905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d85919061563f565b60206040518083038186803b158015610d9d57600080fd5b505afa158015610db1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610dd59190810190614c0f565b905090565b60075481565b6000600254905090565b6000610df7848484612dd4565b610eb884610e03612c01565b610eb385604051806060016040528060288152602001615ded60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e69612c01565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461305e9092919063ffffffff16565b612c09565b600190509392505050565b60016006600082825401925050819055506000600654905060008211610f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1590615972565b60405180910390fd5b610f266117d8565b600781905550610f7b333084600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166130b9909392919063ffffffff16565b610f8361188d565b600080905060006007541415610fa25782905082600781905550610fce565b610fcb600754610fbd6002548661315b90919063ffffffff16565b6131cb90919063ffffffff16565b90505b610fd66117d8565b600781905550610fe63382613215565b50600654811461102b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611022906159d2565b60405180910390fd5b5050565b6001600660008282540192505081905550600060065490506000821161108a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611081906158f2565b60405180910390fd5b600061109533611790565b9050808311156110da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d1906158d2565b60405180910390fd5b6110e261339d565b60078190555060006111136002546111058660075461315b90919063ffffffff16565b6131cb90919063ffffffff16565b905061119d846040518060400160405280601d81526020017f72656465656d20616d6f756e7420657863656564732062616c616e63650000008152506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461305e9092919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506111f48460025461341090919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516112589190615a7b565b60405180910390a36000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112bd919061563f565b60206040518083038186803b1580156112d557600080fd5b505afa1580156112e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061130d9190810190614c0f565b9050818110156113335761133261132d828461341090919063ffffffff16565b61345a565b5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b815260040161139092919061565a565b602060405180830381600087803b1580156113aa57600080fd5b505af11580156113be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113e29190810190614b05565b506113eb61339d565b6007819055505050506006548114611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f906159d2565b60405180910390fd5b5050565b6000600560009054906101000a900460ff16905090565b60006114fc611460612c01565b846114f78560016000611471612c01565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135d090919063ffffffff16565b612c09565b6001905092915050565b6000611510614889565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c190c2ec60405180604001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600e546040518363ffffffff1660e01b815260040161159a929190615a52565b604080518083038186803b1580156115b157600080fd5b505afa1580156115c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115e99190810190614bbd565b9050806020015191505090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161169f919061563f565b60206040518083038186803b1580156116b757600080fd5b505afa1580156116cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116ef9190810190614c0f565b905090565b6116fc612a8d565b73ffffffffffffffffffffffffffffffffffffffff1663d2d0e066600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360006040518463ffffffff1660e01b815260040161175b9392919061570c565b600060405180830381600087803b15801561177557600080fd5b505af1158015611789573d6000803e3d6000fd5b5050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006118466117e561211c565b6118386117f0612332565b61182a6117fb611506565b61181c61180661299c565b61180e612012565b6135d090919063ffffffff16565b6135d090919063ffffffff16565b6135d090919063ffffffff16565b6135d090919063ffffffff16565b905090565b6000806118566117d8565b9050611887600254611879670de0b6b3a76400008461315b90919063ffffffff16565b6131cb90919063ffffffff16565b91505090565b6000611897611dd9565b9050600f60149054906101000a900460ff1660048111156118b457fe5b8160048111156118c057fe5b146118ce576118cd613625565b5b60006118d861211c565b11156119ae57600160048111156118eb57fe5b8160048111156118f757fe5b14156119135761190d61190861211c565b6109f1565b506119ad565b60048081111561191f57fe5b81600481111561192b57fe5b14156119465761194161193c61211c565b6119d4565b6119ac565b6002600481111561195357fe5b81600481111561195f57fe5b141561197a5761197561197061211c565b6128aa565b6119ab565b6003600481111561198757fe5b81600481111561199357fe5b14156119aa576119a96119a461211c565b6116f4565b5b5b5b5b5b80600f60146101000a81548160ff021916908360048111156119cc57fe5b021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930846040518363ffffffff1660e01b8152600401611a3392919061565a565b602060405180830381600087803b158015611a4d57600080fd5b505af1158015611a61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a859190810190614c0f565b11611ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abc90615992565b60405180910390fd5b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611bac5780601f10611b8157610100808354040283529160200191611bac565b820191906000526020600020905b815481529060010190602001808311611b8f57829003601f168201915b5050505050905090565b611c45600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661369e9092919063ffffffff16565b611cd4600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661369e9092919063ffffffff16565b611d48611cdf612b34565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661369e9092919063ffffffff16565b611dd7600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661369e9092919063ffffffff16565b565b6000806000806000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d88be3c0600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611e5e9190615624565b60006040518083038186803b158015611e7657600080fd5b505afa158015611e8a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250611eb39190810190614b2e565b945094509450945050600080905080851115611ecd578490505b80841115611ed9578390505b80831115611ee5578290505b80821115611ef1578190505b600080905085821415611f075760029050611f39565b84821415611f185760049050611f38565b83821415611f295760039050611f37565b82821415611f3657600190505b5b5b5b80965050505050505090565b6000612008611f52612c01565b8461200385604051806060016040528060258152602001615e156025913960016000611f7c612c01565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461305e9092919063ffffffff16565b612c09565b6001905092915050565b60008061201d611642565b905060008111156120f7576120f4670de0b6b3a76400006120e6600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561209f57600080fd5b505afa1580156120b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506120d79190810190614c0f565b8461315b90919063ffffffff16565b6131cb90919063ffffffff16565b90505b8091505090565b600061211261210b612c01565b8484612dd4565b6001905092915050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612179919061563f565b60206040518083038186803b15801561219157600080fd5b505afa1580156121a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121c99190810190614c0f565b905090565b60016006600082825401925050819055506000600654905060008211612229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222090615972565b60405180910390fd5b61223161339d565b600781905550612286333084600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166130b9909392919063ffffffff16565b6000809050600060075414156122a557829050826007819055506122d1565b6122ce6007546122c06002548661315b90919063ffffffff16565b6131cb90919063ffffffff16565b90505b6122d961339d565b6007819055506122e93382613215565b50600654811461232e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612325906159d2565b60405180910390fd5b5050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161238f919061563f565b60206040518083038186803b1580156123a757600080fd5b505afa1580156123bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123df9190810190614c0f565b905090565b600e5481565b60016006600082825401925050819055506000600654905060008211612445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243c906158f2565b60405180910390fd5b600061245033611790565b905080831115612495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248c906158d2565b60405180910390fd5b61249d6117d8565b60078190555060006124ce6002546124c08660075461315b90919063ffffffff16565b6131cb90919063ffffffff16565b9050612558846040518060400160405280601d81526020017f72656465656d20616d6f756e7420657863656564732062616c616e63650000008152506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461305e9092919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506125af8460025461341090919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516126139190615a7b565b60405180910390a36000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612678919061563f565b60206040518083038186803b15801561269057600080fd5b505afa1580156126a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126c89190810190614c0f565b90506000600f60149054906101000a900460ff16905082821015612746576126ee611dd9565b9050600f60149054906101000a900460ff16600481111561270b57fe5b81600481111561271757fe5b1461272957612724613625565b612745565b61274461273f838561341090919063ffffffff16565b61345a565b5b5b6127933384600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138159092919063ffffffff16565b600f60149054906101000a900460ff1660048111156127ae57fe5b8160048111156127ba57fe5b146127c9576127c8816138b4565b5b6127d16117d8565b60078190555050505050600654811461281f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612816906159d2565b60405180910390fd5b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b81526004016129079190615a7b565b602060405180830381600087803b15801561292157600080fd5b505af1158015612935573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129599190810190614c0f565b14612999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299090615832565b60405180910390fd5b50565b6000806129a7610d28565b90506000811115612a6057600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306b3efd6306040518263ffffffff1660e01b8152600401612a0d919061563f565b60206040518083038186803b158015612a2557600080fd5b505afa158015612a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612a5d9190810190614c0f565b90505b8091505090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612af757600080fd5b505afa158015612b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612b2f9190810190614a15565b905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015612b9e57600080fd5b505afa158015612bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612bd69190810190614a15565b905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7090615952565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce090615812565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612dc79190615a7b565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3b90615912565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eab906157d2565b60405180910390fd5b612f1f81604051806060016040528060268152602001615dc7602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461305e9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612fb2816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135d090919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516130519190615a7b565b60405180910390a3505050565b60008383111582906130a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309d91906157b0565b60405180910390fd5b5060008385039050809150509392505050565b613155848573ffffffffffffffffffffffffffffffffffffffff166323b872dd905060e01b8585856040516024016130f3939291906156ac565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506139ba565b50505050565b60008083141561316e57600090506131c5565b600082840290508284828161317f57fe5b04146131c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b790615892565b60405180910390fd5b809150505b92915050565b600061320d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613b2c565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327c90615a32565b60405180910390fd5b61329a816002546135d090919063ffffffff16565b6002819055506132f1816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135d090919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516133919190615a7b565b60405180910390a35050565b600061340b6133aa613b8d565b6133fd6133b5613c3f565b6133ef6133c0613cf1565b6133e16133cb613de1565b6133d3613eac565b6135d090919063ffffffff16565b6135d090919063ffffffff16565b6135d090919063ffffffff16565b6135d090919063ffffffff16565b905090565b600061345283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061305e565b905092915050565b6002600481111561346757fe5b600f60149054906101000a900460ff16600481111561348257fe5b14156134925761349181613f98565b5b6003600481111561349f57fe5b600f60149054906101000a900460ff1660048111156134ba57fe5b141561351457806134c9612332565b101561350a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350190615932565b60405180910390fd5b6135138161403e565b5b6001600481111561352157fe5b600f60149054906101000a900460ff16600481111561353c57fe5b1415613596578061354b611506565b101561358c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161358390615932565b60405180910390fd5b613595816140ce565b5b6004808111156135a257fe5b600f60149054906101000a900460ff1660048111156135bd57fe5b14156135cd576135cc81614308565b5b50565b60008082840190508381101561361b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361290615852565b60405180910390fd5b8091505092915050565b600061362f6143ae565b905060008111156136445761364381614460565b5b61364c613cf1565b9050600081111561366157613660816140ce565b5b613669614552565b9050600081111561367e5761367d81614604565b5b613686613c3f565b9050600081111561369b5761369a8161403e565b5b50565b6000811480613737575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b81526004016136e5929190615683565b60206040518083038186803b1580156136fd57600080fd5b505afa158015613711573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506137359190810190614c0f565b145b613776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376d906159f2565b60405180910390fd5b613810838473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3905060e01b84846040516024016137ae9291906156e3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506139ba565b505050565b6138af838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb905060e01b848460405160240161384d9291906156e3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506139ba565b505050565b60006138be613b8d565b111561399457600160048111156138d157fe5b8160048111156138dd57fe5b14156138f9576138f36138ee613b8d565b6109f1565b50613993565b60048081111561390557fe5b81600481111561391157fe5b141561392c57613927613922613b8d565b6119d4565b613992565b6002600481111561393957fe5b81600481111561394557fe5b14156139605761395b613956613b8d565b6128aa565b613991565b6003600481111561396d57fe5b81600481111561397957fe5b14156139905761398f61398a613b8d565b6116f4565b5b5b5b5b5b80600f60146101000a81548160ff021916908360048111156139b257fe5b021790555050565b6139d98273ffffffffffffffffffffffffffffffffffffffff166146f8565b613a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0f90615a12565b60405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051613a41919061560d565b6000604051808303816000865af19150503d8060008114613a7e576040519150601f19603f3d011682016040523d82523d6000602084013e613a83565b606091505b509150915081613ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613abf90615872565b60405180910390fd5b600081511115613b265780806020019051613ae69190810190614b05565b613b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1c906159b2565b60405180910390fd5b5b50505050565b60008083118290613b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b6a91906157b0565b60405180910390fd5b506000838581613b7f57fe5b049050809150509392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613bea919061563f565b60206040518083038186803b158015613c0257600080fd5b505afa158015613c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613c3a9190810190614c0f565b905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613c9c919061563f565b60206040518083038186803b158015613cb457600080fd5b505afa158015613cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613cec9190810190614c0f565b905090565b6000613cfb614889565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c190c2ec60405180604001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600e546040518363ffffffff1660e01b8152600401613d85929190615a52565b604080518083038186803b158015613d9c57600080fd5b505afa158015613db0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613dd49190810190614bbd565b9050806020015191505090565b600080613dec610d28565b90506000811115613ea557600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306b3efd6306040518263ffffffff1660e01b8152600401613e52919061563f565b60206040518083038186803b158015613e6a57600080fd5b505afa158015613e7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613ea29190810190614c0f565b90505b8091505090565b600080613eb7611642565b90506000811115613f9157613f8e670de0b6b3a7640000613f80600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b158015613f3957600080fd5b505afa158015613f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613f719190810190614c0f565b8461315b90919063ffffffff16565b6131cb90919063ffffffff16565b90505b8091505090565b6000613fa2611642565b90506000613fae612012565b905082811015613ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fea90615932565b60405180910390fd5b600061402d600161401f84614011888861315b90919063ffffffff16565b6131cb90919063ffffffff16565b6135d090919063ffffffff16565b905061403881614460565b50505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75826040518263ffffffff1660e01b81526004016140999190615a7b565b600060405180830381600087803b1580156140b357600080fd5b505af11580156140c7573d6000803e3d6000fd5b5050505050565b6060600160405190808252806020026020018201604052801561410b57816020015b6140f8614743565b8152602001906001900390816140f05790505b50905060405180604001604052803073ffffffffffffffffffffffffffffffffffffffff16815260200160008152508160008151811061414757fe5b602002602001018190525061415a614773565b604051806080016040528060001515815260200160008081111561417a57fe5b815260200160008081111561418b57fe5b815260200184815250905061419e6147b1565b6001816000019060018111156141b057fe5b908160018111156141bd57fe5b815250506000816020018181525050818160400181905250600e54816060018181525050308160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506060600160405190808252806020026020018201604052801561425657816020015b61424361481d565b81526020019060019003908161423b5790505b509050818160008151811061426757fe5b6020026020010181905250600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67a6a4585836040518363ffffffff1660e01b81526004016142cf929190615743565b600060405180830381600087803b1580156142e957600080fd5b505af11580156142fd573d6000803e3d6000fd5b505050505050505050565b6000614312610d28565b9050600061431e61299c565b905082811015614363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161435a90615932565b60405180910390fd5b600061439d600161438f84614381888861315b90919063ffffffff16565b6131cb90919063ffffffff16565b6135d090919063ffffffff16565b90506143a881614604565b50505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161440b919061563f565b60206040518083038186803b15801561442357600080fd5b505afa158015614437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061445b9190810190614c0f565b905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75836040518263ffffffff1660e01b81526004016144bd9190615a7b565b602060405180830381600087803b1580156144d757600080fd5b505af11580156144eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061450f9190810190614c0f565b1461454f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614546906157f2565b60405180910390fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016145af919061563f565b60206040518083038186803b1580156145c757600080fd5b505afa1580156145db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506145ff9190810190614c0f565b905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac30846040518363ffffffff1660e01b815260040161466392919061565a565b602060405180830381600087803b15801561467d57600080fd5b505af1158015614691573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506146b59190810190614c0f565b116146f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016146ec906158b2565b60405180910390fd5b50565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b821415801561473a5750808214155b92505050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b604051806080016040528060001515815260200160008081111561479357fe5b81526020016000808111156147a457fe5b8152602001600081525090565b604051806101000160405280600060018111156147ca57fe5b8152602001600081526020016147de6148a5565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b6040518061010001604052806000600181111561483657fe5b81526020016000815260200161484a6148a5565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b6040518060400160405280600015158152602001600081525090565b60405180608001604052806000151581526020016000808111156148c557fe5b81526020016000808111156148d657fe5b8152602001600081525090565b6000813590506148f281615d81565b92915050565b60008151905061490781615d81565b92915050565b60008151905061491c81615d98565b92915050565b600082601f83011261493357600080fd5b815161494661494182615ade565b615ab1565b9150808252602083016020830185838301111561496257600080fd5b61496d838284615d09565b50505092915050565b60006040828403121561498857600080fd5b6149926040615ab1565b905060006149a28482850161490d565b60008301525060206149b6848285016149d7565b60208301525092915050565b6000813590506149d181615daf565b92915050565b6000815190506149e681615daf565b92915050565b6000602082840312156149fe57600080fd5b6000614a0c848285016148e3565b91505092915050565b600060208284031215614a2757600080fd5b6000614a35848285016148f8565b91505092915050565b60008060408385031215614a5157600080fd5b6000614a5f858286016148e3565b9250506020614a70858286016148e3565b9150509250929050565b600080600060608486031215614a8f57600080fd5b6000614a9d868287016148e3565b9350506020614aae868287016148e3565b9250506040614abf868287016149c2565b9150509250925092565b60008060408385031215614adc57600080fd5b6000614aea858286016148e3565b9250506020614afb858286016149c2565b9150509250929050565b600060208284031215614b1757600080fd5b6000614b258482850161490d565b91505092915050565b600080600080600060a08688031215614b4657600080fd5b600086015167ffffffffffffffff811115614b6057600080fd5b614b6c88828901614922565b9550506020614b7d888289016149d7565b9450506040614b8e888289016149d7565b9350506060614b9f888289016149d7565b9250506080614bb0888289016149d7565b9150509295509295909350565b600060408284031215614bcf57600080fd5b6000614bdd84828501614976565b91505092915050565b600060208284031215614bf857600080fd5b6000614c06848285016149c2565b91505092915050565b600060208284031215614c2157600080fd5b6000614c2f848285016149d7565b91505092915050565b6000614c44838361547a565b905092915050565b6000614c588383615582565b60408301905092915050565b614c6d81615c79565b82525050565b614c7c81615bca565b82525050565b614c8b81615bca565b82525050565b6000614c9c82615b2a565b614ca68185615b7b565b935083602082028501614cb885615b0a565b8060005b85811015614cf45784840389528151614cd58582614c38565b9450614ce083615b61565b925060208a01995050600181019050614cbc565b50829750879550505050505092915050565b6000614d1182615b35565b614d1b8185615b8c565b9350614d2683615b1a565b8060005b83811015614d57578151614d3e8882614c4c565b9750614d4983615b6e565b925050600181019050614d2a565b5085935050505092915050565b614d6d81615bdc565b82525050565b614d7c81615bdc565b82525050565b6000614d8d82615b4b565b614d978185615bae565b9350614da7818560208601615d09565b80840191505092915050565b6000614dbe82615b40565b614dc88185615b9d565b9350614dd8818560208601615d09565b614de181615d3c565b840191505092915050565b614df581615c8b565b82525050565b614e0481615c9d565b82525050565b614e1381615caf565b82525050565b614e2281615cc1565b82525050565b614e3181615cd3565b82525050565b6000614e4282615b56565b614e4c8185615bb9565b9350614e5c818560208601615d09565b614e6581615d3c565b840191505092915050565b6000614e7d602383615bb9565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ee3601983615bb9565b91507f434f4d504f554e443a207769746864726177206661696c6564000000000000006000830152602082019050919050565b6000614f23602283615bb9565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614f89601783615bb9565b91507f434f4d504f554e443a20737570706c79206661696c65640000000000000000006000830152602082019050919050565b6000614fc9601b83615bb9565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000615009602083615bb9565b91507f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646000830152602082019050919050565b6000615049602183615bb9565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006150af601883615bb9565b91507f46554c4352554d3a207769746864726177206661696c656400000000000000006000830152602082019050919050565b60006150ef601483615bb9565b91507f696e73756666696369656e742062616c616e63650000000000000000000000006000830152602082019050919050565b600061512f601f83615bb9565b91507f7769746864726177206d7573742062652067726561746572207468616e2030006000830152602082019050919050565b600061516f602583615bb9565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006151d5601283615bb9565b91507f696e73756666696369656e742066756e647300000000000000000000000000006000830152602082019050919050565b6000615215602483615bb9565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061527b601e83615bb9565b91507f6465706f736974206d7573742062652067726561746572207468616e203000006000830152602082019050919050565b60006152bb601683615bb9565b91507f46554c4352554d3a20737570706c79206661696c6564000000000000000000006000830152602082019050919050565b60006152fb602a83615bb9565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b6000615361601f83615bb9565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b60006153a1603683615bb9565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b6000615407601f83615bb9565b91507f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006000830152602082019050919050565b6000615447601f83615bb9565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b6000610160830160008301516154936000860182614dec565b5060208301516154a660208601826155e0565b5060408301516154b9604086018261552d565b5060608301516154cc60c08601826155e0565b5060808301516154df60e08601826155e0565b5060a08301516154f3610100860182614c73565b5060c08301516155076101208601826155e0565b5060e08301518482036101408601526155208282614db3565b9150508091505092915050565b6080820160008201516155436000850182614d64565b5060208201516155566020850182614dfb565b5060408201516155696040850182614e0a565b50606082015161557c60608501826155e0565b50505050565b6040820160008201516155986000850182614c73565b5060208201516155ab60208501826155e0565b50505050565b6040820160008201516155c76000850182614c73565b5060208201516155da60208501826155e0565b50505050565b6155e981615c62565b82525050565b6155f881615c62565b82525050565b61560781615c6c565b82525050565b60006156198284614d82565b915081905092915050565b60006020820190506156396000830184614c82565b92915050565b60006020820190506156546000830184614c64565b92915050565b600060408201905061566f6000830185614c64565b61567c60208301846155ef565b9392505050565b60006040820190506156986000830185614c82565b6156a56020830184614c82565b9392505050565b60006060820190506156c16000830186614c82565b6156ce6020830185614c82565b6156db60408301846155ef565b949350505050565b60006040820190506156f86000830185614c82565b61570560208301846155ef565b9392505050565b60006060820190506157216000830186614c82565b61572e60208301856155ef565b61573b6040830184614e28565b949350505050565b6000604082019050818103600083015261575d8185614d06565b905081810360208301526157718184614c91565b90509392505050565b600060208201905061578f6000830184614d73565b92915050565b60006020820190506157aa6000830184614e19565b92915050565b600060208201905081810360008301526157ca8184614e37565b905092915050565b600060208201905081810360008301526157eb81614e70565b9050919050565b6000602082019050818103600083015261580b81614ed6565b9050919050565b6000602082019050818103600083015261582b81614f16565b9050919050565b6000602082019050818103600083015261584b81614f7c565b9050919050565b6000602082019050818103600083015261586b81614fbc565b9050919050565b6000602082019050818103600083015261588b81614ffc565b9050919050565b600060208201905081810360008301526158ab8161503c565b9050919050565b600060208201905081810360008301526158cb816150a2565b9050919050565b600060208201905081810360008301526158eb816150e2565b9050919050565b6000602082019050818103600083015261590b81615122565b9050919050565b6000602082019050818103600083015261592b81615162565b9050919050565b6000602082019050818103600083015261594b816151c8565b9050919050565b6000602082019050818103600083015261596b81615208565b9050919050565b6000602082019050818103600083015261598b8161526e565b9050919050565b600060208201905081810360008301526159ab816152ae565b9050919050565b600060208201905081810360008301526159cb816152ee565b9050919050565b600060208201905081810360008301526159eb81615354565b9050919050565b60006020820190508181036000830152615a0b81615394565b9050919050565b60006020820190508181036000830152615a2b816153fa565b9050919050565b60006020820190508181036000830152615a4b8161543a565b9050919050565b6000606082019050615a6760008301856155b1565b615a7460408301846155ef565b9392505050565b6000602082019050615a9060008301846155ef565b92915050565b6000602082019050615aab60008301846155fe565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615ad457600080fd5b8060405250919050565b600067ffffffffffffffff821115615af557600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000615bd582615c42565b9050919050565b60008115159050919050565b6000819050615bf682615d4d565b919050565b6000819050615c0982615d5a565b919050565b6000819050615c1c82615d67565b919050565b6000819050615c2f82615d74565b919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615c8482615ce5565b9050919050565b6000615c9682615be8565b9050919050565b6000615ca882615bfb565b9050919050565b6000615cba82615c0e565b9050919050565b6000615ccc82615c21565b9050919050565b6000615cde82615c34565b9050919050565b6000615cf082615cf7565b9050919050565b6000615d0282615c42565b9050919050565b60005b83811015615d27578082015181840152602081019050615d0c565b83811115615d36576000848401525b50505050565b6000601f19601f8301169050919050565b60028110615d5757fe5b50565b60018110615d6457fe5b50565b60018110615d7157fe5b50565b60058110615d7e57fe5b50565b615d8a81615bca565b8114615d9557600080fd5b50565b615da181615bdc565b8114615dac57600080fd5b50565b615db881615c62565b8114615dc357600080fd5b5056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa365627a7a72315820d401e43c62e5682aff9be62ba45744db2748390830bf9e6df55b9762794576c26c6578706572696d656e74616cf564736f6c634300050c0040

Deployed ByteCode Sourcemap

12576:13371:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16011:579;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16011:579:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;12867:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12867:24:0;;;:::i;:::-;;;;;;;;;;;;;;;;4915:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4915:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;13066:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13066:36:0;;;:::i;:::-;;;;;;;;;;;;;;;;1935:152;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1935:152:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;18583:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18583:116:0;;;:::i;:::-;;;;;;;;;;;;;;;;12739:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12739:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;1418:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1418:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;2093:304;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2093:304:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23554:569;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23554:569:0;;;;;;;;;;;;;;;;:::i;:::-;;14356:895;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14356:895:0;;;;;;;;;;;;;;;;:::i;:::-;;5097:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5097:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;2403:210;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2403:210:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;17830:166;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17830:166:0;;;:::i;:::-;;;;;;;;;;;;;;;;12946:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12946:18:0;;;:::i;:::-;;;;;;;;;;;;;;;;12816:22;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12816:22:0;;;:::i;:::-;;;;;;;;;;;;;;;;18000:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18000:120:0;;;:::i;:::-;;;;;;;;;;;;;;;;22780:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22780:96:0;;;;;;;;;;;;;;;;:::i;:::-;;1515:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1515:110:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;24360:217;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24360:217:0;;;:::i;:::-;;;;;;;;;;;;;;;;24583:154;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24583:154:0;;;:::i;:::-;;;;;;;;;;;;;;;;21712:543;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21712:543:0;;;:::i;:::-;;22880:141;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22880:141:0;;;;;;;;;;;;;;;;:::i;:::-;;12843:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12843:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;12896;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12896:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;5004:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5004:87:0;;;:::i;:::-;;;;;;;;;;;;;;;;17432:279;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17432:279:0;;;:::i;:::-;;15299:706;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15299:706:0;;;:::i;:::-;;;;;;;;;;;;;;;;2619:261;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2619:261:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;18124:248;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18124:248:0;;;:::i;:::-;;;;;;;;;;;;;;;;1631:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1631:158:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;17717:107;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17717:107:0;;;:::i;:::-;;;;;;;;;;;;;;;;13734:550;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13734:550:0;;;;;;;;;;;;;;;;:::i;:::-;;18703:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18703:115:0;;;:::i;:::-;;;;;;;;;;;;;;;;12920:21;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12920:21:0;;;:::i;:::-;;;;;;;;;;;;;;;;24790:1154;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24790:1154:0;;;;;;;;;;;;;;;;:::i;:::-;;1795:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1795:134:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23025:131;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23025:131:0;;;;;;;;;;;;;;;;:::i;:::-;;18376:203;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18376:203:0;;;:::i;:::-;;;;;;;;;;;;;;;;12788:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12788:23:0;;;:::i;:::-;;;;;;;;;;;;;;;;17174:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17174:120:0;;;:::i;:::-;;;;;;;;;;;;;;;;17298:128;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17298:128:0;;;:::i;:::-;;;;;;;;;;;;;;;;12763:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12763:20:0;;;:::i;:::-;;;;;;;;;;;;;;;;16011:579;16062:4;16077:19;16110:1;16099:13;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;16077:35;;16132:22;;;;;;;;16145:4;16132:22;;;;;;16152:1;16132:22;;;16121:5;16127:1;16121:8;;;;;;;;;;;;;:33;;;;16165:22;;:::i;:::-;16190:70;;;;;;;;16202:4;16190:70;;;;;;16208:21;16190:70;;;;;;;;;;;;16231:20;16190:70;;;;;;;;;;;;16253:6;16190:70;;;16165:95;;16269:21;;:::i;:::-;16316:18;16299:3;:14;;:35;;;;;;;;;;;;;;;;;;;;;;;16359:1;16343:3;:13;;:17;;;;;16382:3;16369;:10;;:16;;;;16416:6;;16394:3;:19;;:28;;;;;16458:4;16431:3;:16;;:32;;;;;;;;;;;16474:24;16518:1;16501:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;16474:46;;16539:3;16529:4;16534:1;16529:7;;;;;;;;;;;;;:13;;;;16558:4;;;;;;;;;;;16553:18;;;16572:5;16579:4;16553:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16553:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16553:31:0;;;;16011:579;;;;;;;:::o;12867:24::-;;;;;;;;;;;;;:::o;4915:83::-;4952:13;4985:5;4978:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4915:83;:::o;13066:36::-;;;;;;;;;;;;;:::o;1935:152::-;2001:4;2018:39;2027:12;:10;:12::i;:::-;2041:7;2050:6;2018:8;:39::i;:::-;2075:4;2068:11;;1935:152;;;;:::o;18583:116::-;18630:7;18660;;;;;;;;;;;18653:25;;;18687:4;18653:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18653:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18653:40:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18653:40:0;;;;;;;;;18646:47;;18583:116;:::o;12739:19::-;;;;:::o;1418:91::-;1462:7;1489:12;;1482:19;;1418:91;:::o;2093:304::-;2182:4;2199:36;2209:6;2217:9;2228:6;2199:9;:36::i;:::-;2246:121;2255:6;2263:12;:10;:12::i;:::-;2277:89;2315:6;2277:89;;;;;;;;;;;;;;;;;:11;:19;2289:6;2277:19;;;;;;;;;;;;;;;:33;2297:12;:10;:12::i;:::-;2277:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;2246:8;:121::i;:::-;2385:4;2378:11;;2093:304;;;;;:::o;23554:569::-;5377:1;5360:13;;:18;;;;;;;;;;;5389:20;5412:13;;5389:36;;23653:1;23643:7;:11;23635:54;;;;;;;;;;;;;;;;;;;;;;23705:22;:20;:22::i;:::-;23698:4;:29;;;;23738:66;23769:10;23789:4;23796:7;23745:5;;;;;;;;;;;23738:30;;;;:66;;;;;;:::i;:::-;23815:11;:9;:11::i;:::-;23869:14;23886:1;23869:18;;23908:1;23900:4;;:9;23896:150;;;23931:7;23922:16;;23956:7;23949:4;:14;;;;23896:150;;;23999:37;24031:4;;24000:25;24012:12;;24000:7;:11;;:25;;;;:::i;:::-;23999:31;;:37;;;;:::i;:::-;23990:46;;23896:150;24061:22;:20;:22::i;:::-;24054:4;:29;;;;24092:25;24098:10;24110:6;24092:5;:25::i;:::-;5436:1;5472:13;;5456:12;:29;5448:73;;;;;;;;;;;;;;;;;;;;;;23554:569;;:::o;14356:895::-;5377:1;5360:13;;:18;;;;;;;;;;;5389:20;5412:13;;5389:36;;14457:1;14447:7;:11;14439:55;;;;;;;;;;;;;;;;;;;;;;14505:16;14524:21;14534:10;14524:9;:21::i;:::-;14505:40;;14573:8;14562:7;:19;;14554:52;;;;;;;;;;;;;;;;;;;;;;14669:23;:21;:23::i;:::-;14662:4;:30;;;;14751:9;14763:37;14787:12;;14764:17;14773:7;14764:4;;:8;;:17;;;;:::i;:::-;14763:23;;:37;;;;:::i;:::-;14751:49;;14837:67;14863:7;14837:67;;;;;;;;;;;;;;;;;:9;:21;14847:10;14837:21;;;;;;;;;;;;;;;;:25;;:67;;;;;:::i;:::-;14813:9;:21;14823:10;14813:21;;;;;;;;;;;;;;;:91;;;;14928:25;14945:7;14928:12;;:16;;:25;;;;:::i;:::-;14913:12;:40;;;;14998:1;14969:41;;14978:10;14969:41;;;15002:7;14969:41;;;;;;;;;;;;;;;15045:9;15064:5;;;;;;;;;;;15057:23;;;15089:4;15057:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15057:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15057:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15057:38:0;;;;;;;;;15045:50;;15112:1;15108;:5;15104:55;;;15126:23;15140:8;15146:1;15140;:5;;:8;;;;:::i;:::-;15126:13;:23::i;:::-;15104:55;15176:5;;;;;;;;;;;15169:22;;;15192:10;15204:1;15169:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15169:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15169:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15169:37:0;;;;;;;;;;15222:23;:21;:23::i;:::-;15215:4;:30;;;;5436:1;;;5472:13;;5456:12;:29;5448:73;;;;;;;;;;;;;;;;;;;;;;14356:895;;:::o;5097:83::-;5138:5;5163:9;;;;;;;;;;;5156:16;;5097:83;:::o;2403:210::-;2483:4;2500:83;2509:12;:10;:12::i;:::-;2523:7;2532:50;2571:10;2532:11;:25;2544:12;:10;:12::i;:::-;2532:25;;;;;;;;;;;;;;;:34;2558:7;2532:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;2500:8;:83::i;:::-;2601:4;2594:11;;2403:210;;;;:::o;17830:166::-;17874:7;17892:14;;:::i;:::-;17914:4;;;;;;;;;;;17909:24;;;17934:22;;;;;;;;17947:4;17934:22;;;;;;17954:1;17934:22;;;17958:6;;17909:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17909:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17909:56:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17909:56:0;;;;;;;;;17892:73;;17981:3;:9;;;17974:16;;;17830:166;:::o;12946:18::-;;;;;;;;;;;;;:::o;12816:22::-;;;;;;;;;;;;;:::o;18000:120::-;18048:7;18080:8;;;;;;;;;;;18073:26;;;18108:4;18073:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18073:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18073:41:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18073:41:0;;;;;;;;;18066:48;;18000:120;:::o;22780:96::-;22834:9;:7;:9::i;:::-;22829:23;;;22853:5;;;;;;;;;;;22860:6;22868:1;22829:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22829:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22829:41:0;;;;22780:96;:::o;1515:110::-;1572:7;1599:9;:18;1609:7;1599:18;;;;;;;;;;;;;;;;1592:25;;1515:110;;;:::o;24360:217::-;24413:4;24433:138;24561:9;:7;:9::i;:::-;24433:115;24534:13;:11;:13::i;:::-;24433:88;24507:13;:11;:13::i;:::-;24433:61;24470:23;:21;:23::i;:::-;24433:24;:22;:24::i;:::-;:36;;:61;;;;:::i;:::-;:73;;:88;;;;:::i;:::-;:100;;:115;;;;:::i;:::-;:127;;:138;;;;:::i;:::-;24426:145;;24360:217;:::o;24583:154::-;24636:4;24649:10;24662:22;:20;:22::i;:::-;24649:35;;24698:33;24718:12;;24698:15;24708:4;24698:5;:9;;:15;;;;:::i;:::-;:19;;:33;;;;:::i;:::-;24691:40;;;24583:154;:::o;21712:543::-;21747:18;21768:11;:9;:11::i;:::-;21747:32;;21807:8;;;;;;;;;;;21792:23;;;;;;;;:11;:23;;;;;;;;;21788:60;;21826:14;:12;:14::i;:::-;21788:60;21872:1;21860:9;:7;:9::i;:::-;:13;21856:363;;;21903:11;21888:26;;;;;;;;:11;:26;;;;;;;;;21884:328;;;21927:21;21938:9;:7;:9::i;:::-;21927:10;:21::i;:::-;;21884:328;;;21983:14;21968:29;;;;;;;;:11;:29;;;;;;;;;21964:248;;;22010:24;22024:9;:7;:9::i;:::-;22010:13;:24::i;:::-;21964:248;;;22069:15;22054:30;;;;;;;;:11;:30;;;;;;;;;22050:162;;;22097:25;22112:9;:7;:9::i;:::-;22097:14;:25::i;:::-;22050:162;;;22157:11;22142:26;;;;;;;;:11;:26;;;;;;;;;22138:74;;;22181:21;22192:9;:7;:9::i;:::-;22181:10;:21::i;:::-;22138:74;22050:162;21964:248;21884:328;21856:363;22238:11;22227:8;;:22;;;;;;;;;;;;;;;;;;;;;;;;21712:543;:::o;22880:141::-;22987:1;22948:7;;;;;;;;;;;22940:21;;;22970:4;22977:6;22940:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22940:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22940:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;22940:44:0;;;;;;;;;:48;22932:83;;;;;;;;;;;;;;;;;;;;;;22880:141;:::o;12843:19::-;;;;;;;;;;;;;:::o;12896:::-;;;;;;;;;;;;;:::o;5004:87::-;5043:13;5076:7;5069:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5004:87;:::o;17432:279::-;17472:45;17498:8;;;;;;;;;;;17513:2;17479:5;;;;;;;;;;;17472:25;;;;:45;;;;;:::i;:::-;17552:41;17578:4;;;;;;;;;;;17589:2;17559:5;;;;;;;;;;;17552:25;;;;:41;;;;;:::i;:::-;17602:50;17628:13;:11;:13::i;:::-;17648:2;17609:5;;;;;;;;;;;17602:25;;;;:50;;;;;:::i;:::-;17661:44;17687:7;;;;;;;;;;;17701:2;17668:5;;;;;;;;;;;17661:25;;;;:44;;;;;:::i;:::-;17432:279::o;15299:706::-;15341:6;15358:12;15371;15384;15397;15427:3;;;;;;;;;;;15413:28;;;15442:5;;;;;;;;;;;15413:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15413:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15413:35:0;;;;;;39:16:-1;36:1;17:17;2:54;15413:35:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15413:35:0;;;;;;;;;15356:92;;;;;;;;;15455:11;15469:1;15455:15;;15488:3;15481:4;:10;15477:43;;;15508:4;15502:10;;15477:43;15537:3;15530:4;:10;15526:43;;;15557:4;15551:10;;15526:43;15586:3;15579:4;:10;15575:43;;;15606:4;15600:10;;15575:43;15635:3;15628:4;:10;15624:43;;;15655:4;15649:10;;15624:43;15675:18;15696:11;15675:32;;15725:4;15718:3;:11;15714:261;;;15754:15;15740:29;;15714:261;;;15794:4;15787:3;:11;15783:192;;;15823:14;15809:28;;15783:192;;;15862:4;15855:3;:11;15851:124;;;15891:11;15877:25;;15851:124;;;15927:4;15920:3;:11;15916:59;;;15956:11;15942:25;;15916:59;15851:124;15783:192;15714:261;15988:11;15981:18;;;;;;;;15299:706;:::o;2619:261::-;2704:4;2721:129;2730:12;:10;:12::i;:::-;2744:7;2753:96;2792:15;2753:96;;;;;;;;;;;;;;;;;:11;:25;2765:12;:10;:12::i;:::-;2753:25;;;;;;;;;;;;;;;:34;2779:7;2753:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;2721:8;:129::i;:::-;2868:4;2861:11;;2619:261;;;;:::o;18124:248::-;18179:7;18228:9;18240:17;:15;:17::i;:::-;18228:29;;18272:1;18268;:5;18264:88;;;18288:56;18339:4;18288:46;18303:8;;;;;;;;;;;18294:37;;;:39;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18294:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18294:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18294:39:0;;;;;;;;;18288:1;:5;;:46;;;;:::i;:::-;:50;;:56;;;;:::i;:::-;18284:60;;18264:88;18365:1;18358:8;;;18124:248;:::o;1631:158::-;1700:4;1717:42;1727:12;:10;:12::i;:::-;1741:9;1752:6;1717:9;:42::i;:::-;1777:4;1770:11;;1631:158;;;;:::o;17717:107::-;17757:7;17787:5;;;;;;;;;;;17780:23;;;17812:4;17780:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17780:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17780:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17780:38:0;;;;;;;;;17773:45;;17717:107;:::o;13734:550::-;5377:1;5360:13;;:18;;;;;;;;;;;5389:20;5412:13;;5389:36;;13834:1;13824:7;:11;13816:54;;;;;;;;;;;;;;;;;;;;;;13886:23;:21;:23::i;:::-;13879:4;:30;;;;13920:66;13951:10;13971:4;13978:7;13927:5;;;;;;;;;;;13920:30;;;;:66;;;;;;:::i;:::-;14029:14;14046:1;14029:18;;14068:1;14060:4;;:9;14056:150;;;14091:7;14082:16;;14116:7;14109:4;:14;;;;14056:150;;;14159:37;14191:4;;14160:25;14172:12;;14160:7;:11;;:25;;;;:::i;:::-;14159:31;;:37;;;;:::i;:::-;14150:46;;14056:150;14221:23;:21;:23::i;:::-;14214:4;:30;;;;14253:25;14259:10;14271:6;14253:5;:25::i;:::-;5436:1;5472:13;;5456:12;:29;5448:73;;;;;;;;;;;;;;;;;;;;;;13734:550;;:::o;18703:115::-;18747:7;18777:9;;;;;;;;;;;18770:27;;;18806:4;18770:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18770:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18770:42:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18770:42:0;;;;;;;;;18763:49;;18703:115;:::o;12920:21::-;;;;:::o;24790:1154::-;5377:1;5360:13;;:18;;;;;;;;;;;5389:20;5412:13;;5389:36;;24889:1;24879:7;:11;24871:55;;;;;;;;;;;;;;;;;;;;;;24937:16;24956:21;24966:10;24956:9;:21::i;:::-;24937:40;;25005:8;24994:7;:19;;24986:52;;;;;;;;;;;;;;;;;;;;;;25101:22;:20;:22::i;:::-;25094:4;:29;;;;25182:9;25194:37;25218:12;;25195:17;25204:7;25195:4;;:8;;:17;;;;:::i;:::-;25194:23;;:37;;;;:::i;:::-;25182:49;;25268:67;25294:7;25268:67;;;;;;;;;;;;;;;;;:9;:21;25278:10;25268:21;;;;;;;;;;;;;;;;:25;;:67;;;;;:::i;:::-;25244:9;:21;25254:10;25244:21;;;;;;;;;;;;;;;:91;;;;25359:25;25376:7;25359:12;;:16;;:25;;;;:::i;:::-;25344:12;:40;;;;25429:1;25400:41;;25409:10;25400:41;;;25433:7;25400:41;;;;;;;;;;;;;;;25480:9;25499:5;;;;;;;;;;;25492:23;;;25524:4;25492:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25492:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25492:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;25492:38:0;;;;;;;;;25480:50;;25539:18;25560:8;;;;;;;;;;;25539:29;;25585:1;25581;:5;25577:189;;;25613:11;:9;:11::i;:::-;25599:25;;25654:8;;;;;;;;;;;25639:23;;;;;;;;:11;:23;;;;;;;;;25635:122;;25677:14;:12;:14::i;:::-;25635:122;;;25722:23;25736:8;25742:1;25736;:5;;:8;;;;:::i;:::-;25722:13;:23::i;:::-;25635:122;25577:189;25776:41;25803:10;25815:1;25783:5;;;;;;;;;;;25776:26;;;;:41;;;;;:::i;:::-;25847:8;;;;;;;;;;;25832:23;;;;;;;;:11;:23;;;;;;;;;25828:73;;25868:23;25879:11;25868:10;:23::i;:::-;25828:73;25916:22;:20;:22::i;:::-;25909:4;:29;;;;5436:1;;;;5472:13;;5456:12;:29;5448:73;;;;;;;;;;;;;;;;;;;;;;24790:1154;;:::o;1795:134::-;1867:7;1894:11;:18;1906:5;1894:18;;;;;;;;;;;;;;;:27;1913:7;1894:27;;;;;;;;;;;;;;;;1887:34;;1795:134;;;;:::o;23025:131::-;23121:1;23095:8;;;;;;;;;;;23086:23;;;23110:6;23086:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23086:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23086:31:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23086:31:0;;;;;;;;;:36;23078:72;;;;;;;;;;;;;;;;;;;;;;23025:131;:::o;18376:203::-;18430:7;18446:9;18458:16;:14;:16::i;:::-;18446:28;;18489:1;18485;:5;18481:78;;;18513:7;;;;;;;;;;;18505:31;;;18545:4;18505:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18505:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18505:46:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18505:46:0;;;;;;;;;18501:50;;18481:78;18572:1;18565:8;;;18376:203;:::o;12788:23::-;;;;;;;;;;;;;:::o;17174:120::-;17214:7;17266:4;;;;;;;;;;;17237:49;;;:51;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17237:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17237:51:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17237:51:0;;;;;;;;;17230:58;;17174:120;:::o;17298:128::-;17342:7;17394:4;;;;;;;;;;;17365:53;;;:55;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17365:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17365:55:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17365:55:0;;;;;;;;;17358:62;;17298:128;:::o;12763:20::-;;;;;;;;;;;;;:::o;852:98::-;897:15;932:10;925:17;;852:98;:::o;4031:338::-;4142:1;4125:19;;:5;:19;;;;4117:68;;;;;;;;;;;;;;;;;;;;;;4223:1;4204:21;;:7;:21;;;;4196:68;;;;;;;;;;;;;;;;;;;;;;4307:6;4277:11;:18;4289:5;4277:18;;;;;;;;;;;;;;;:27;4296:7;4277:27;;;;;;;;;;;;;;;:36;;;;4345:7;4329:32;;4338:5;4329:32;;;4354:6;4329:32;;;;;;;;;;;;;;;4031:338;;;:::o;2886:471::-;3002:1;2984:20;;:6;:20;;;;2976:70;;;;;;;;;;;;;;;;;;;;;;3086:1;3065:23;;:9;:23;;;;3057:71;;;;;;;;;;;;;;;;;;;;;;3161;3183:6;3161:71;;;;;;;;;;;;;;;;;:9;:17;3171:6;3161:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;3141:9;:17;3151:6;3141:17;;;;;;;;;;;;;;;:91;;;;3266:32;3291:6;3266:9;:20;3276:9;3266:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;3243:9;:20;3253:9;3243:20;;;;;;;;;;;;;;;:55;;;;3331:9;3314:35;;3323:6;3314:35;;;3342:6;3314:35;;;;;;;;;;;;;;;2886:471;;;:::o;5889:192::-;5975:7;6008:1;6003;:6;;6011:12;5995:29;;;;;;;;;;;;;;;;;;;;;;;;;6035:9;6051:1;6047;:5;6035:17;;6072:1;6065:8;;;5889:192;;;;;:::o;8244:204::-;8345:95;8364:5;8394;:18;;;:27;;;;8423:4;8429:2;8433:5;8371:68;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;8371:68:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;8371:68:0;8345:18;:95::i;:::-;8244:204;;;;:::o;6087:250::-;6145:7;6174:1;6169;:6;6165:47;;;6199:1;6192:8;;;;6165:47;6224:9;6240:1;6236;:5;6224:17;;6269:1;6264;6260;:5;;;;;;:10;6252:56;;;;;;;;;;;;;;;;;;;;;;6328:1;6321:8;;;6087:250;;;;;:::o;6343:132::-;6401:7;6428:39;6432:1;6435;6428:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6421:46;;6343:132;;;;:::o;3363:308::-;3458:1;3439:21;;:7;:21;;;;3431:65;;;;;;;;;;;;;;;;;;;;;;3524:24;3541:6;3524:12;;:16;;:24;;;;:::i;:::-;3509:12;:39;;;;3580:30;3603:6;3580:9;:18;3590:7;3580:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;3559:9;:18;3569:7;3559:18;;;;;;;;;;;;;;;:51;;;;3647:7;3626:37;;3643:1;3626:37;;;3656:6;3626:37;;;;;;;;;;;;;;;3363:308;;:::o;24129:225::-;24185:4;24205:143;24337:10;:8;:10::i;:::-;24205:119;24309:14;:12;:14::i;:::-;24205:91;24281:14;:12;:14::i;:::-;24205:63;24243:24;:22;:24::i;:::-;24205:25;:23;:25::i;:::-;:37;;:63;;;;:::i;:::-;:75;;:91;;;;:::i;:::-;:103;;:119;;;;:::i;:::-;:131;;:143;;;;:::i;:::-;24198:150;;24129:225;:::o;5747:136::-;5805:7;5832:43;5836:1;5839;5832:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5825:50;;5747:136;;;;:::o;21205:501::-;21277:15;21265:27;;;;;;;;:8;;;;;;;;;;;:27;;;;;;;;;21261:80;;;21303:30;21325:7;21303:21;:30::i;:::-;21261:80;21363:11;21351:23;;;;;;;;:8;;;;;;;;;;;:23;;;;;;;;;21347:132;;;21410:7;21393:13;:11;:13::i;:::-;:24;;21385:55;;;;;;;;;;;;;;;;;;;;;;21449:22;21463:7;21449:13;:22::i;:::-;21347:132;21501:11;21489:23;;;;;;;;:8;;;;;;;;;;;:23;;;;;;;;;21485:132;;;21548:7;21531:13;:11;:13::i;:::-;:24;;21523:55;;;;;;;;;;;;;;;;;;;;;;21587:22;21601:7;21587:13;:22::i;:::-;21485:132;21639:14;21627:26;;;;;;;;:8;;;;;;;;;;;:26;;;;;;;;;21623:78;;;21664:29;21685:7;21664:20;:29::i;:::-;21623:78;21205:501;:::o;5560:181::-;5618:7;5638:9;5654:1;5650;:5;5638:17;;5679:1;5674;:6;;5666:46;;;;;;;;;;;;;;;;;;;;;;5732:1;5725:8;;;5560:181;;;;:::o;19952:421::-;19992:14;20009:18;:16;:18::i;:::-;19992:35;;20047:1;20038:6;:10;20034:58;;;20059:25;20077:6;20059:17;:25::i;:::-;20034:58;20107:14;:12;:14::i;:::-;20098:23;;20141:1;20132:6;:10;20128:54;;;20153:21;20167:6;20153:13;:21::i;:::-;20128:54;20197:17;:15;:17::i;:::-;20188:26;;20234:1;20225:6;:10;20221:57;;;20246:24;20263:6;20246:16;:24::i;:::-;20221:57;20293:14;:12;:14::i;:::-;20284:23;;20327:1;20318:6;:10;20314:54;;;20339:21;20353:6;20339:13;:21::i;:::-;20314:54;19952:421;:::o;8456:347::-;8561:1;8552:5;:10;8551:62;;;;8611:1;8568:5;:15;;;8592:4;8599:7;8568:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8568:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8568:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;8568:39:0;;;;;;;;;:44;8551:62;8543:152;;;;;;;;;;;;;;;;;;;;;;8706:89;8725:5;8755;:13;;;:22;;;;8779:7;8788:5;8732:62;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;8732:62:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;8732:62:0;8706:18;:89::i;:::-;8456:347;;;:::o;8060:176::-;8143:85;8162:5;8192;:14;;;:23;;;;8217:2;8221:5;8169:58;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;8169:58:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;8169:58:0;8143:18;:85::i;:::-;8060:176;;;:::o;22316:458::-;22389:1;22376:10;:8;:10::i;:::-;:14;22372:368;;;22420:11;22405:26;;;;;;;;:11;:26;;;;;;;;;22401:332;;;22444:22;22455:10;:8;:10::i;:::-;22444;:22::i;:::-;;22401:332;;;22501:14;22486:29;;;;;;;;:11;:29;;;;;;;;;22482:251;;;22528:25;22542:10;:8;:10::i;:::-;22528:13;:25::i;:::-;22482:251;;;22588:15;22573:30;;;;;;;;:11;:30;;;;;;;;;22569:164;;;22616:26;22631:10;:8;:10::i;:::-;22616:14;:26::i;:::-;22569:164;;;22677:11;22662:26;;;;;;;;:11;:26;;;;;;;;;22658:75;;;22701:22;22712:10;:8;:10::i;:::-;22701;:22::i;:::-;22658:75;22569:164;22482:251;22401:332;22372:368;22757:11;22746:8;;:22;;;;;;;;;;;;;;;;;;;;;;;;22316:458;:::o;9440:598::-;9528:27;9536:5;9528:25;;;:27::i;:::-;9520:71;;;;;;;;;;;;;;;;;;;;;;9665:12;9679:23;9714:5;9706:19;;9726:4;9706:25;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;9664:67:0;;;;9750:7;9742:52;;;;;;;;;;;;;;;;;;;;;;9831:1;9811:10;:17;:21;9807:224;;;9953:10;9942:30;;;;;;;;;;;;;;9934:85;;;;;;;;;;;;;;;;;;;;;;9807:224;9440:598;;;;:::o;6481:258::-;6567:7;6666:1;6662;:5;6669:12;6654:28;;;;;;;;;;;;;;;;;;;;;;;;;6693:9;6709:1;6705;:5;;;;;;6693:17;;6730:1;6723:8;;;6481:258;;;;;:::o;18824:110::-;18867:7;18897:5;;;;;;;;;;;18890:23;;;18922:4;18890:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18890:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18890:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18890:38:0;;;;;;;;;18883:45;;18824:110;:::o;19828:118::-;19875:7;19905:9;;;;;;;;;;;19898:27;;;19934:4;19898:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19898:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19898:42:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19898:42:0;;;;;;;;;19891:49;;19828:118;:::o;18940:169::-;18987:7;19005:14;;:::i;:::-;19027:4;;;;;;;;;;;19022:24;;;19047:22;;;;;;;;19060:4;19047:22;;;;;;19067:1;19047:22;;;19071:6;;19022:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19022:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19022:56:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19022:56:0;;;;;;;;;19005:73;;19094:3;:9;;;19087:16;;;18940:169;:::o;19495:206::-;19552:7;19568:9;19580:16;:14;:16::i;:::-;19568:28;;19611:1;19607;:5;19603:78;;;19635:7;;;;;;;;;;;19627:31;;;19667:4;19627:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19627:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19627:46:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19627:46:0;;;;;;;;;19623:50;;19603:78;19694:1;19687:8;;;19495:206;:::o;19240:251::-;19298:7;19347:9;19359:17;:15;:17::i;:::-;19347:29;;19391:1;19387;:5;19383:88;;;19407:56;19458:4;19407:46;19422:8;;;;;;;;;;;19413:37;;;:39;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19413:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19413:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19413:39:0;;;;;;;;;19407:1;:5;;:46;;;;:::i;:::-;:50;;:56;;;;:::i;:::-;19403:60;;19383:88;19484:1;19477:8;;;19240:251;:::o;20379:328::-;20443:9;20455:17;:15;:17::i;:::-;20443:29;;20479:10;20492:24;:22;:24::i;:::-;20479:37;;20537:7;20531:2;:13;;20523:44;;;;;;;;;;;;;;;;;;;;;;20621:14;20638:31;20667:1;20638:24;20659:2;20639:14;20645:7;20639:1;:5;;:14;;;;:::i;:::-;20638:20;;:24;;;;:::i;:::-;:28;;:31;;;;:::i;:::-;20621:48;;20676:25;20694:6;20676:17;:25::i;:::-;20379:328;;;;:::o;23160:92::-;23221:9;;;;;;;;;;;23214:24;;;23239:6;23214:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23214:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23214:32:0;;;;23160:92;:::o;16596:572::-;16653:19;16686:1;16675:13;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;16653:35;;16708:22;;;;;;;;16721:4;16708:22;;;;;;16728:1;16708:22;;;16697:5;16703:1;16697:8;;;;;;;;;;;;;:33;;;;16741:22;;:::i;:::-;16766:71;;;;;;;;16778:5;16766:71;;;;;;16785:21;16766:71;;;;;;;;;;;;16808:20;16766:71;;;;;;;;;;;;16830:6;16766:71;;;16741:96;;16846:21;;:::i;:::-;16893:19;16876:3;:14;;:36;;;;;;;;;;;;;;;;;;;;;;;16937:1;16921:3;:13;;:17;;;;;16960:3;16947;:10;;:16;;;;16994:6;;16972:3;:19;;:28;;;;;17036:4;17009:3;:16;;:32;;;;;;;;;;;17052:24;17096:1;17079:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;17052:46;;17117:3;17107:4;17112:1;17107:7;;;;;;;;;;;;;:13;;;;17136:4;;;;;;;;;;;17131:18;;;17150:5;17157:4;17131:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17131:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17131:31:0;;;;16596:572;;;;;:::o;20739:460::-;20856:9;20868:16;:14;:16::i;:::-;20856:28;;20950:10;20963:23;:21;:23::i;:::-;20950:36;;21030:7;21024:2;:13;;21016:44;;;;;;;;;;;;;;;;;;;;;;21114:14;21131:31;21160:1;21131:24;21152:2;21132:14;21138:7;21132:1;:5;;:14;;;;:::i;:::-;21131:20;;:24;;;;:::i;:::-;:28;;:31;;;;:::i;:::-;21114:48;;21169:24;21186:6;21169:16;:24::i;:::-;20739:460;;;;:::o;19113:123::-;19164:7;19196:8;;;;;;;;;;;19189:26;;;19224:4;19189:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19189:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19189:41:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19189:41:0;;;;;;;;;19182:48;;19113:123;:::o;23408:140::-;23511:1;23483:8;;;;;;;;;;;23474:25;;;23500:6;23474:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23474:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23474:33:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23474:33:0;;;;;;;;;:38;23466:76;;;;;;;;;;;;;;;;;;;;;;23408:140;:::o;19705:119::-;19755:7;19785;;;;;;;;;;;19778:25;;;19812:4;19778:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19778:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19778:40:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19778:40:0;;;;;;;;;19771:47;;19705:119;:::o;23256:148::-;23368:1;23329:7;;;;;;;;;;;23321:21;;;23351:4;23358:6;23321:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23321:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23321:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23321:44:0;;;;;;;;;:48;23313:85;;;;;;;;;;;;;;;;;;;;;;23256:148;:::o;7077:374::-;7137:4;7154:16;7181:19;7203:66;7181:88;;;;7372:7;7360:20;7348:32;;7412:3;7400:15;;:8;:15;;:42;;;;;7431:11;7419:8;:23;;7400:42;7392:51;;;;7077:374;;;:::o;12576:13371::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;142:134;;226:6;220:13;211:22;;238:33;265:5;238:33;;;205:71;;;;;283:128;;364:6;358:13;349:22;;376:30;400:5;376:30;;;343:68;;;;;419:444;;532:3;525:4;517:6;513:17;509:27;499:2;;550:1;547;540:12;499:2;580:6;574:13;602:65;617:49;659:6;617:49;;;602:65;;;593:74;;687:6;680:5;673:21;723:4;715:6;711:17;756:4;749:5;745:16;791:3;782:6;777:3;773:16;770:25;767:2;;;808:1;805;798:12;767:2;818:39;850:6;845:3;840;818:39;;;492:371;;;;;;;;896:493;;1017:4;1005:9;1000:3;996:19;992:30;989:2;;;1035:1;1032;1025:12;989:2;1053:20;1068:4;1053:20;;;1044:29;;1123:1;1154:57;1207:3;1198:6;1187:9;1183:22;1154:57;;;1148:3;1141:5;1137:15;1130:82;1083:140;1274:2;1307:60;1363:3;1354:6;1343:9;1339:22;1307:60;;;1300:4;1293:5;1289:16;1282:86;1233:146;983:406;;;;;1396:130;;1476:6;1463:20;1454:29;;1488:33;1515:5;1488:33;;;1448:78;;;;;1533:134;;1617:6;1611:13;1602:22;;1629:33;1656:5;1629:33;;;1596:71;;;;;1674:241;;1778:2;1766:9;1757:7;1753:23;1749:32;1746:2;;;1794:1;1791;1784:12;1746:2;1829:1;1846:53;1891:7;1882:6;1871:9;1867:22;1846:53;;;1836:63;;1808:97;1740:175;;;;;1922:263;;2037:2;2025:9;2016:7;2012:23;2008:32;2005:2;;;2053:1;2050;2043:12;2005:2;2088:1;2105:64;2161:7;2152:6;2141:9;2137:22;2105:64;;;2095:74;;2067:108;1999:186;;;;;2192:366;;;2313:2;2301:9;2292:7;2288:23;2284:32;2281:2;;;2329:1;2326;2319:12;2281:2;2364:1;2381:53;2426:7;2417:6;2406:9;2402:22;2381:53;;;2371:63;;2343:97;2471:2;2489:53;2534:7;2525:6;2514:9;2510:22;2489:53;;;2479:63;;2450:98;2275:283;;;;;;2565:491;;;;2703:2;2691:9;2682:7;2678:23;2674:32;2671:2;;;2719:1;2716;2709:12;2671:2;2754:1;2771:53;2816:7;2807:6;2796:9;2792:22;2771:53;;;2761:63;;2733:97;2861:2;2879:53;2924:7;2915:6;2904:9;2900:22;2879:53;;;2869:63;;2840:98;2969:2;2987:53;3032:7;3023:6;3012:9;3008:22;2987:53;;;2977:63;;2948:98;2665:391;;;;;;3063:366;;;3184:2;3172:9;3163:7;3159:23;3155:32;3152:2;;;3200:1;3197;3190:12;3152:2;3235:1;3252:53;3297:7;3288:6;3277:9;3273:22;3252:53;;;3242:63;;3214:97;3342:2;3360:53;3405:7;3396:6;3385:9;3381:22;3360:53;;;3350:63;;3321:98;3146:283;;;;;;3436:257;;3548:2;3536:9;3527:7;3523:23;3519:32;3516:2;;;3564:1;3561;3554:12;3516:2;3599:1;3616:61;3669:7;3660:6;3649:9;3645:22;3616:61;;;3606:71;;3578:105;3510:183;;;;;3700:908;;;;;;3893:3;3881:9;3872:7;3868:23;3864:33;3861:2;;;3910:1;3907;3900:12;3861:2;3966:1;3955:9;3951:17;3945:24;3989:18;3981:6;3978:30;3975:2;;;4021:1;4018;4011:12;3975:2;4041:74;4107:7;4098:6;4087:9;4083:22;4041:74;;;4031:84;;3924:197;4152:2;4170:64;4226:7;4217:6;4206:9;4202:22;4170:64;;;4160:74;;4131:109;4271:2;4289:64;4345:7;4336:6;4325:9;4321:22;4289:64;;;4279:74;;4250:109;4390:2;4408:64;4464:7;4455:6;4444:9;4440:22;4408:64;;;4398:74;;4369:109;4509:3;4528:64;4584:7;4575:6;4564:9;4560:22;4528:64;;;4518:74;;4488:110;3855:753;;;;;;;;;4615:305;;4751:2;4739:9;4730:7;4726:23;4722:32;4719:2;;;4767:1;4764;4757:12;4719:2;4802:1;4819:85;4896:7;4887:6;4876:9;4872:22;4819:85;;;4809:95;;4781:129;4713:207;;;;;4927:241;;5031:2;5019:9;5010:7;5006:23;5002:32;4999:2;;;5047:1;5044;5037:12;4999:2;5082:1;5099:53;5144:7;5135:6;5124:9;5120:22;5099:53;;;5089:63;;5061:97;4993:175;;;;;5175:263;;5290:2;5278:9;5269:7;5265:23;5261:32;5258:2;;;5306:1;5303;5296:12;5258:2;5341:1;5358:64;5414:7;5405:6;5394:9;5390:22;5358:64;;;5348:74;;5320:108;5252:186;;;;;5446:253;;5595:98;5689:3;5681:6;5595:98;;;5581:112;;5574:125;;;;;5708:249;;5831:86;5913:3;5905:6;5831:86;;;5946:4;5941:3;5937:14;5923:28;;5824:133;;;;;5965:142;6056:45;6095:5;6056:45;;;6051:3;6044:58;6038:69;;;6114:103;6187:24;6205:5;6187:24;;;6182:3;6175:37;6169:48;;;6224:113;6307:24;6325:5;6307:24;;;6302:3;6295:37;6289:48;;;6411:1040;;6604:78;6676:5;6604:78;;;6695:110;6798:6;6793:3;6695:110;;;6688:117;;6828:3;6870:4;6862:6;6858:17;6853:3;6849:27;6897:80;6971:5;6897:80;;;6997:7;7025:1;7010:402;7035:6;7032:1;7029:13;7010:402;;;7097:9;7091:4;7087:20;7082:3;7075:33;7142:6;7136:13;7164:112;7271:4;7256:13;7164:112;;;7156:120;;7293:84;7370:6;7293:84;;;7283:94;;7400:4;7395:3;7391:14;7384:21;;7067:345;7057:1;7054;7050:9;7045:14;;7010:402;;;7014:14;7425:4;7418:11;;7442:3;7435:10;;6583:868;;;;;;;;;;7514:834;;7695:72;7761:5;7695:72;;;7780:104;7877:6;7872:3;7780:104;;;7773:111;;7905:74;7973:5;7905:74;;;7999:7;8027:1;8012:314;8037:6;8034:1;8031:13;8012:314;;;8104:6;8098:13;8125:99;8220:3;8205:13;8125:99;;;8118:106;;8241:78;8312:6;8241:78;;;8231:88;;8069:257;8059:1;8056;8052:9;8047:14;;8012:314;;;8016:14;8339:3;8332:10;;7674:674;;;;;;;;8356:94;8423:21;8438:5;8423:21;;;8418:3;8411:34;8405:45;;;8457:104;8534:21;8549:5;8534:21;;;8529:3;8522:34;8516:45;;;8568:356;;8696:38;8728:5;8696:38;;;8746:88;8827:6;8822:3;8746:88;;;8739:95;;8839:52;8884:6;8879:3;8872:4;8865:5;8861:16;8839:52;;;8912:6;8907:3;8903:16;8896:23;;8676:248;;;;;;8931:315;;9027:34;9055:5;9027:34;;;9073:60;9126:6;9121:3;9073:60;;;9066:67;;9138:52;9183:6;9178:3;9171:4;9164:5;9160:16;9138:52;;;9211:29;9233:6;9211:29;;;9206:3;9202:39;9195:46;;9007:239;;;;;;9253:142;9339:50;9383:5;9339:50;;;9334:3;9327:63;9321:74;;;9402:156;9495:57;9546:5;9495:57;;;9490:3;9483:70;9477:81;;;9565:150;9655:54;9703:5;9655:54;;;9650:3;9643:67;9637:78;;;9722:144;9814:46;9854:5;9814:46;;;9809:3;9802:59;9796:70;;;9873:140;9963:44;10001:5;9963:44;;;9958:3;9951:57;9945:68;;;10020:347;;10132:39;10165:5;10132:39;;;10183:71;10247:6;10242:3;10183:71;;;10176:78;;10259:52;10304:6;10299:3;10292:4;10285:5;10281:16;10259:52;;;10332:29;10354:6;10332:29;;;10327:3;10323:39;10316:46;;10112:255;;;;;;10375:465;;10535:67;10599:2;10594:3;10535:67;;;10528:74;;10635:66;10631:1;10626:3;10622:11;10615:87;10736:66;10731:2;10726:3;10722:12;10715:88;10831:2;10826:3;10822:12;10815:19;;10521:319;;;;10849:364;;11009:67;11073:2;11068:3;11009:67;;;11002:74;;11109:66;11105:1;11100:3;11096:11;11089:87;11204:2;11199:3;11195:12;11188:19;;10995:218;;;;11222:465;;11382:67;11446:2;11441:3;11382:67;;;11375:74;;11482:66;11478:1;11473:3;11469:11;11462:87;11583:66;11578:2;11573:3;11569:12;11562:88;11678:2;11673:3;11669:12;11662:19;;11368:319;;;;11696:364;;11856:67;11920:2;11915:3;11856:67;;;11849:74;;11956:66;11952:1;11947:3;11943:11;11936:87;12051:2;12046:3;12042:12;12035:19;;11842:218;;;;12069:364;;12229:67;12293:2;12288:3;12229:67;;;12222:74;;12329:66;12325:1;12320:3;12316:11;12309:87;12424:2;12419:3;12415:12;12408:19;;12215:218;;;;12442:364;;12602:67;12666:2;12661:3;12602:67;;;12595:74;;12702:66;12698:1;12693:3;12689:11;12682:87;12797:2;12792:3;12788:12;12781:19;;12588:218;;;;12815:465;;12975:67;13039:2;13034:3;12975:67;;;12968:74;;13075:66;13071:1;13066:3;13062:11;13055:87;13176:66;13171:2;13166:3;13162:12;13155:88;13271:2;13266:3;13262:12;13255:19;;12961:319;;;;13289:364;;13449:67;13513:2;13508:3;13449:67;;;13442:74;;13549:66;13545:1;13540:3;13536:11;13529:87;13644:2;13639:3;13635:12;13628:19;;13435:218;;;;13662:364;;13822:67;13886:2;13881:3;13822:67;;;13815:74;;13922:66;13918:1;13913:3;13909:11;13902:87;14017:2;14012:3;14008:12;14001:19;;13808:218;;;;14035:364;;14195:67;14259:2;14254:3;14195:67;;;14188:74;;14295:66;14291:1;14286:3;14282:11;14275:87;14390:2;14385:3;14381:12;14374:19;;14181:218;;;;14408:465;;14568:67;14632:2;14627:3;14568:67;;;14561:74;;14668:66;14664:1;14659:3;14655:11;14648:87;14769:66;14764:2;14759:3;14755:12;14748:88;14864:2;14859:3;14855:12;14848:19;;14554:319;;;;14882:364;;15042:67;15106:2;15101:3;15042:67;;;15035:74;;15142:66;15138:1;15133:3;15129:11;15122:87;15237:2;15232:3;15228:12;15221:19;;15028:218;;;;15255:465;;15415:67;15479:2;15474:3;15415:67;;;15408:74;;15515:66;15511:1;15506:3;15502:11;15495:87;15616:66;15611:2;15606:3;15602:12;15595:88;15711:2;15706:3;15702:12;15695:19;;15401:319;;;;15729:364;;15889:67;15953:2;15948:3;15889:67;;;15882:74;;15989:66;15985:1;15980:3;15976:11;15969:87;16084:2;16079:3;16075:12;16068:19;;15875:218;;;;16102:364;;16262:67;16326:2;16321:3;16262:67;;;16255:74;;16362:66;16358:1;16353:3;16349:11;16342:87;16457:2;16452:3;16448:12;16441:19;;16248:218;;;;16475:465;;16635:67;16699:2;16694:3;16635:67;;;16628:74;;16735:66;16731:1;16726:3;16722:11;16715:87;16836:66;16831:2;16826:3;16822:12;16815:88;16931:2;16926:3;16922:12;16915:19;;16621:319;;;;16949:364;;17109:67;17173:2;17168:3;17109:67;;;17102:74;;17209:66;17205:1;17200:3;17196:11;17189:87;17304:2;17299:3;17295:12;17288:19;;17095:218;;;;17322:465;;17482:67;17546:2;17541:3;17482:67;;;17475:74;;17582:66;17578:1;17573:3;17569:11;17562:87;17683:66;17678:2;17673:3;17669:12;17662:88;17778:2;17773:3;17769:12;17762:19;;17468:319;;;;17796:364;;17956:67;18020:2;18015:3;17956:67;;;17949:74;;18056:66;18052:1;18047:3;18043:11;18036:87;18151:2;18146:3;18142:12;18135:19;;17942:218;;;;18169:364;;18329:67;18393:2;18388:3;18329:67;;;18322:74;;18429:66;18425:1;18420:3;18416:11;18409:87;18524:2;18519:3;18515:12;18508:19;;18315:218;;;;18602:1605;;18745:5;18740:3;18736:15;18835:3;18828:5;18824:15;18818:22;18846:75;18916:3;18911;18907:13;18893:12;18846:75;;;18766:161;19005:4;18998:5;18994:16;18988:23;19017:63;19074:4;19069:3;19065:14;19051:12;19017:63;;;18937:149;19161:4;19154:5;19150:16;19144:23;19173:117;19284:4;19279:3;19275:14;19261:12;19173:117;;;19096:200;19380:4;19373:5;19369:16;19363:23;19392:63;19449:4;19444:3;19440:14;19426:12;19392:63;;;19306:155;19547:4;19540:5;19536:16;19530:23;19559:63;19616:4;19611:3;19607:14;19593:12;19559:63;;;19471:157;19709:4;19702:5;19698:16;19692:23;19721:64;19778:5;19773:3;19769:15;19755:12;19721:64;;;19638:153;19874:4;19867:5;19863:16;19857:23;19886:64;19943:5;19938:3;19934:15;19920:12;19886:64;;;19801:155;20029:4;20022:5;20018:16;20012:23;20082:3;20076:4;20072:14;20064:5;20059:3;20055:15;20048:39;20102:67;20164:4;20150:12;20102:67;;;20094:75;;19966:215;20198:4;20191:11;;18718:1489;;;;;;20277:815;20414:4;20409:3;20405:14;20497:3;20490:5;20486:15;20480:22;20508:56;20559:3;20554;20550:13;20536:12;20508:56;;;20434:136;20651:4;20644:5;20640:16;20634:23;20663:83;20740:4;20735:3;20731:14;20717:12;20663:83;;;20580:172;20824:4;20817:5;20813:16;20807:23;20836:80;20910:4;20905:3;20901:14;20887:12;20836:80;;;20762:160;20996:4;20989:5;20985:16;20979:23;21008:63;21065:4;21060:3;21056:14;21042:12;21008:63;;;20932:145;20387:705;;;;21148:457;21271:4;21266:3;21262:14;21355:3;21348:5;21344:15;21338:22;21366:62;21423:3;21418;21414:13;21400:12;21366:62;;;21291:143;21509:4;21502:5;21498:16;21492:23;21521:63;21578:4;21573:3;21569:14;21555:12;21521:63;;;21444:146;21244:361;;;;21661:467;21794:4;21789:3;21785:14;21878:3;21871:5;21867:15;21861:22;21889:62;21946:3;21941;21937:13;21923:12;21889:62;;;21814:143;22032:4;22025:5;22021:16;22015:23;22044:63;22101:4;22096:3;22092:14;22078:12;22044:63;;;21967:146;21767:361;;;;22135:103;22208:24;22226:5;22208:24;;;22203:3;22196:37;22190:48;;;22245:113;22328:24;22346:5;22328:24;;;22323:3;22316:37;22310:48;;;22365:107;22444:22;22460:5;22444:22;;;22439:3;22432:35;22426:46;;;22479:262;;22623:93;22712:3;22703:6;22623:93;;;22616:100;;22733:3;22726:10;;22604:137;;;;;22748:213;;22866:2;22855:9;22851:18;22843:26;;22880:71;22948:1;22937:9;22933:17;22924:6;22880:71;;;22837:124;;;;;22968:229;;23094:2;23083:9;23079:18;23071:26;;23108:79;23184:1;23173:9;23169:17;23160:6;23108:79;;;23065:132;;;;;23204:340;;23358:2;23347:9;23343:18;23335:26;;23372:79;23448:1;23437:9;23433:17;23424:6;23372:79;;;23462:72;23530:2;23519:9;23515:18;23506:6;23462:72;;;23329:215;;;;;;23551:324;;23697:2;23686:9;23682:18;23674:26;;23711:71;23779:1;23768:9;23764:17;23755:6;23711:71;;;23793:72;23861:2;23850:9;23846:18;23837:6;23793:72;;;23668:207;;;;;;23882:435;;24056:2;24045:9;24041:18;24033:26;;24070:71;24138:1;24127:9;24123:17;24114:6;24070:71;;;24152:72;24220:2;24209:9;24205:18;24196:6;24152:72;;;24235;24303:2;24292:9;24288:18;24279:6;24235:72;;;24027:290;;;;;;;24324:324;;24470:2;24459:9;24455:18;24447:26;;24484:71;24552:1;24541:9;24537:17;24528:6;24484:71;;;24566:72;24634:2;24623:9;24619:18;24610:6;24566:72;;;24441:207;;;;;;24655:449;;24836:2;24825:9;24821:18;24813:26;;24850:71;24918:1;24907:9;24903:17;24894:6;24850:71;;;24932:72;25000:2;24989:9;24985:18;24976:6;24932:72;;;25015:79;25090:2;25079:9;25075:18;25066:6;25015:79;;;24807:297;;;;;;;25111:788;;25441:2;25430:9;25426:18;25418:26;;25491:9;25485:4;25481:20;25477:1;25466:9;25462:17;25455:47;25516:144;25655:4;25646:6;25516:144;;;25508:152;;25708:9;25702:4;25698:20;25693:2;25682:9;25678:18;25671:48;25733:156;25884:4;25875:6;25733:156;;;25725:164;;25412:487;;;;;;25906:201;;26018:2;26007:9;26003:18;25995:26;;26032:65;26094:1;26083:9;26079:17;26070:6;26032:65;;;25989:118;;;;;26114:231;;26241:2;26230:9;26226:18;26218:26;;26255:80;26332:1;26321:9;26317:17;26308:6;26255:80;;;26212:133;;;;;26352:301;;26490:2;26479:9;26475:18;26467:26;;26540:9;26534:4;26530:20;26526:1;26515:9;26511:17;26504:47;26565:78;26638:4;26629:6;26565:78;;;26557:86;;26461:192;;;;;26660:407;;26851:2;26840:9;26836:18;26828:26;;26901:9;26895:4;26891:20;26887:1;26876:9;26872:17;26865:47;26926:131;27052:4;26926:131;;;26918:139;;26822:245;;;;27074:407;;27265:2;27254:9;27250:18;27242:26;;27315:9;27309:4;27305:20;27301:1;27290:9;27286:17;27279:47;27340:131;27466:4;27340:131;;;27332:139;;27236:245;;;;27488:407;;27679:2;27668:9;27664:18;27656:26;;27729:9;27723:4;27719:20;27715:1;27704:9;27700:17;27693:47;27754:131;27880:4;27754:131;;;27746:139;;27650:245;;;;27902:407;;28093:2;28082:9;28078:18;28070:26;;28143:9;28137:4;28133:20;28129:1;28118:9;28114:17;28107:47;28168:131;28294:4;28168:131;;;28160:139;;28064:245;;;;28316:407;;28507:2;28496:9;28492:18;28484:26;;28557:9;28551:4;28547:20;28543:1;28532:9;28528:17;28521:47;28582:131;28708:4;28582:131;;;28574:139;;28478:245;;;;28730:407;;28921:2;28910:9;28906:18;28898:26;;28971:9;28965:4;28961:20;28957:1;28946:9;28942:17;28935:47;28996:131;29122:4;28996:131;;;28988:139;;28892:245;;;;29144:407;;29335:2;29324:9;29320:18;29312:26;;29385:9;29379:4;29375:20;29371:1;29360:9;29356:17;29349:47;29410:131;29536:4;29410:131;;;29402:139;;29306:245;;;;29558:407;;29749:2;29738:9;29734:18;29726:26;;29799:9;29793:4;29789:20;29785:1;29774:9;29770:17;29763:47;29824:131;29950:4;29824:131;;;29816:139;;29720:245;;;;29972:407;;30163:2;30152:9;30148:18;30140:26;;30213:9;30207:4;30203:20;30199:1;30188:9;30184:17;30177:47;30238:131;30364:4;30238:131;;;30230:139;;30134:245;;;;30386:407;;30577:2;30566:9;30562:18;30554:26;;30627:9;30621:4;30617:20;30613:1;30602:9;30598:17;30591:47;30652:131;30778:4;30652:131;;;30644:139;;30548:245;;;;30800:407;;30991:2;30980:9;30976:18;30968:26;;31041:9;31035:4;31031:20;31027:1;31016:9;31012:17;31005:47;31066:131;31192:4;31066:131;;;31058:139;;30962:245;;;;31214:407;;31405:2;31394:9;31390:18;31382:26;;31455:9;31449:4;31445:20;31441:1;31430:9;31426:17;31419:47;31480:131;31606:4;31480:131;;;31472:139;;31376:245;;;;31628:407;;31819:2;31808:9;31804:18;31796:26;;31869:9;31863:4;31859:20;31855:1;31844:9;31840:17;31833:47;31894:131;32020:4;31894:131;;;31886:139;;31790:245;;;;32042:407;;32233:2;32222:9;32218:18;32210:26;;32283:9;32277:4;32273:20;32269:1;32258:9;32254:17;32247:47;32308:131;32434:4;32308:131;;;32300:139;;32204:245;;;;32456:407;;32647:2;32636:9;32632:18;32624:26;;32697:9;32691:4;32687:20;32683:1;32672:9;32668:17;32661:47;32722:131;32848:4;32722:131;;;32714:139;;32618:245;;;;32870:407;;33061:2;33050:9;33046:18;33038:26;;33111:9;33105:4;33101:20;33097:1;33086:9;33082:17;33075:47;33136:131;33262:4;33136:131;;;33128:139;;33032:245;;;;33284:407;;33475:2;33464:9;33460:18;33452:26;;33525:9;33519:4;33515:20;33511:1;33500:9;33496:17;33489:47;33550:131;33676:4;33550:131;;;33542:139;;33446:245;;;;33698:407;;33889:2;33878:9;33874:18;33866:26;;33939:9;33933:4;33929:20;33925:1;33914:9;33910:17;33903:47;33964:131;34090:4;33964:131;;;33956:139;;33860:245;;;;34112:407;;34303:2;34292:9;34288:18;34280:26;;34353:9;34347:4;34343:20;34339:1;34328:9;34324:17;34317:47;34378:131;34504:4;34378:131;;;34370:139;;34274:245;;;;34526:407;;34717:2;34706:9;34702:18;34694:26;;34767:9;34761:4;34757:20;34753:1;34742:9;34738:17;34731:47;34792:131;34918:4;34792:131;;;34784:139;;34688:245;;;;34940:404;;35126:2;35115:9;35111:18;35103:26;;35140:111;35248:1;35237:9;35233:17;35224:6;35140:111;;;35262:72;35330:2;35319:9;35315:18;35306:6;35262:72;;;35097:247;;;;;;35351:213;;35469:2;35458:9;35454:18;35446:26;;35483:71;35551:1;35540:9;35536:17;35527:6;35483:71;;;35440:124;;;;;35571:205;;35685:2;35674:9;35670:18;35662:26;;35699:67;35763:1;35752:9;35748:17;35739:6;35699:67;;;35656:120;;;;;35783:256;;35845:2;35839:9;35829:19;;35883:4;35875:6;35871:17;35982:6;35970:10;35967:22;35946:18;35934:10;35931:34;35928:62;35925:2;;;36003:1;36000;35993:12;35925:2;36023:10;36019:2;36012:22;35823:216;;;;;36046:322;;36190:18;36182:6;36179:30;36176:2;;;36222:1;36219;36212:12;36176:2;36289:4;36285:9;36278:4;36270:6;36266:17;36262:33;36254:41;;36353:4;36347;36343:15;36335:23;;36113:255;;;;36375:175;;36485:3;36477:11;;36523:4;36518:3;36514:14;36506:22;;36471:79;;;;36557:169;;36661:3;36653:11;;36699:4;36694:3;36690:14;36682:22;;36647:79;;;;36733:161;;36866:5;36860:12;36850:22;;36831:63;;;;36901:155;;37028:5;37022:12;37012:22;;36993:63;;;;37063:117;;37152:5;37146:12;37136:22;;37117:63;;;;37187:121;;37280:5;37274:12;37264:22;;37245:63;;;;37315:122;;37409:5;37403:12;37393:22;;37374:63;;;;37444:132;;37566:4;37561:3;37557:14;37549:22;;37543:33;;;;37583:126;;37699:4;37694:3;37690:14;37682:22;;37676:33;;;;37717:202;;37871:6;37866:3;37859:19;37908:4;37903:3;37899:14;37884:29;;37852:67;;;;;37928:196;;38076:6;38071:3;38064:19;38113:4;38108:3;38104:14;38089:29;;38057:67;;;;;38133:152;;38237:6;38232:3;38225:19;38274:4;38269:3;38265:14;38250:29;;38218:67;;;;;38294:144;;38429:3;38414:18;;38407:31;;;;;38447:163;;38562:6;38557:3;38550:19;38599:4;38594:3;38590:14;38575:29;;38543:67;;;;;38618:91;;38680:24;38698:5;38680:24;;;38669:35;;38663:46;;;;38716:85;;38789:5;38782:13;38775:21;38764:32;;38758:43;;;;38808:136;;38885:5;38874:16;;38891:48;38933:5;38891:48;;;38868:76;;;;38951:150;;39035:5;39024:16;;39041:55;39090:5;39041:55;;;39018:83;;;;39108:144;;39189:5;39178:16;;39195:52;39241:5;39195:52;;;39172:80;;;;39259:128;;39332:5;39321:16;;39338:44;39376:5;39338:44;;;39315:72;;;;39394:84;;39466:6;39459:5;39455:18;39444:29;;39438:40;;;;39485:121;;39558:42;39551:5;39547:54;39536:65;;39530:76;;;;39613:72;;39675:5;39664:16;;39658:27;;;;39692:81;;39763:4;39756:5;39752:16;39741:27;;39735:38;;;;39780:129;;39867:37;39898:5;39867:37;;;39854:50;;39848:61;;;;39916:136;;40008:39;40041:5;40008:39;;;39995:52;;39989:63;;;;40059:150;;40158:46;40198:5;40158:46;;;40145:59;;40139:70;;;;40216:144;;40312:43;40349:5;40312:43;;;40299:56;;40293:67;;;;40367:128;;40455:35;40484:5;40455:35;;;40442:48;;40436:59;;;;40502:114;;40588:23;40605:5;40588:23;;;40575:36;;40569:47;;;;40623:121;;40702:37;40733:5;40702:37;;;40689:50;;40683:61;;;;40751:108;;40830:24;40848:5;40830:24;;;40817:37;;40811:48;;;;40867:268;40932:1;40939:101;40953:6;40950:1;40947:13;40939:101;;;41029:1;41024:3;41020:11;41014:18;41010:1;41005:3;41001:11;40994:39;40975:2;40972:1;40968:10;40963:15;;40939:101;;;41055:6;41052:1;41049:13;41046:2;;;41120:1;41111:6;41106:3;41102:16;41095:27;41046:2;40916:219;;;;;41143:97;;41231:2;41227:7;41222:2;41215:5;41211:14;41207:28;41197:38;;41191:49;;;;41248:106;41332:1;41325:5;41322:12;41312:2;;41338:9;41312:2;41306:48;;41361:113;41452:1;41445:5;41442:12;41432:2;;41458:9;41432:2;41426:48;;41481:110;41569:1;41562:5;41559:12;41549:2;;41575:9;41549:2;41543:48;;41598:102;41678:1;41671:5;41668:12;41658:2;;41684:9;41658:2;41652:48;;41707:117;41776:24;41794:5;41776:24;;;41769:5;41766:35;41756:2;;41815:1;41812;41805:12;41756:2;41750:74;;41831:111;41897:21;41912:5;41897:21;;;41890:5;41887:32;41877:2;;41933:1;41930;41923:12;41877:2;41871:71;;41949:117;42018:24;42036:5;42018:24;;;42011:5;42008:35;41998:2;;42057:1;42054;42047:12;41998:2;41992:74;

Swarm Source

bzzr://d401e43c62e5682aff9be62ba45744db2748390830bf9e6df55b9762794576c2
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.