Contract 0x4ec82ecd19529ff50a467f522029f69459bf071d

 

Contract Overview

Balance:
0 BNB

BNB Value:
$0.00

Token:
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xce84b56a7f11a64cc46382a2933acad9d96081448e2bcd6e06a6eaf6859b9c97Add Liquidity145964762022-01-22 20:03:367 mins ago0x70fe5f0909d851cf857e821ccaeb8c1277e0eb91 IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.000850545
0xbbe3f3cecf51aa26ac43deb7365702509c9a72a50bbb09cb3d6cd4433b8262b2Swap Exact Token...145964052022-01-22 20:00:0311 mins ago0x70fe5f0909d851cf857e821ccaeb8c1277e0eb91 IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.000630625
0x5342a791f2af08cbb6479babb4e114099df08dd68d21c4adfa4f88381352ef0dSwap Exact ETH F...145962162022-01-22 19:50:3620 mins ago0x70fe5f0909d851cf857e821ccaeb8c1277e0eb91 IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0.623527110672232 BNB0.00055103
0xb70d321ed6b6088886e214e66e3a5161d9a179b0d12c192234eb89c0afa29cb0Swap Exact Token...145949042022-01-22 18:44:501 hr 26 mins ago0x782fde07d45a5667444ebbff490c2f15402566c9 IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.000828375
0x946cde017a73fa02c989d523f40a591436db33a4cbe60b11a77ccebca3b78dd4Swap Exact Token...145946322022-01-22 18:31:141 hr 40 mins ago0x0a08fe1b9c7be9b0a6a20d96e80d66727d6a9cee IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.00055547
0x2d2fde0eb30f1a866f3547d980b502172e1365444c69a3d73d2bb993b60841bcSwap Exact Token...145944012022-01-22 18:19:411 hr 51 mins ago0x3957d9976c13ddc8b3a57d3745f79647d06009d4 IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.000877915
0x93c740b95a72dafefbdfcc2ec82302bb926a7b9e1a55a15b94438ec885ceb802Swap Exact Token...145933692022-01-22 17:28:042 hrs 43 mins ago0xd60e5ca57c74b517eb40c4b42ca35213776337d3 IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.00048047
0xa1e097741346f8178259e9beb4830c0cf4e87673d17c72f648d63ce2f73d0271Swap Exact Token...145920772022-01-22 16:23:283 hrs 47 mins ago0x7b00e7b305873cad6bf333152a646ad141e642f6 IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.000753375
0xfc83c81576e75de9debd394cfe3676b76981d4734d80e67f6ce8635b8eef5d25Swap Exact Token...145920052022-01-22 16:19:523 hrs 51 mins ago0x7b00e7b305873cad6bf333152a646ad141e642f6 IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.00048029
0x67728a4900e01b436c63d65462fc2c51e3a118f646aa2771727821f041a54cabSwap Exact Token...145917882022-01-22 16:08:594 hrs 2 mins ago0xa752511b5d1183dbecd7211abf680be8ac880b8e IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.00055311
0x6c50b4a215c39eab9bb261f05a352ff124da9df2c15b337b279656643ca3d315Swap Exact Token...145917762022-01-22 16:08:234 hrs 2 mins ago0xa752511b5d1183dbecd7211abf680be8ac880b8e IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.000753495
0x552c37bb41850ed8b64b5eab5cc3dabd5e6c27aa2925f0bb88bfb07df6448787Swap Exact Token...145912282022-01-22 15:40:484 hrs 30 mins ago0x1e7121228569f2318fa36d8799f7eaee50ac48a0 IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.000787895
0x86c1126239ef6dd4dc86667cd888b48a927280586824f5cb13b97d7921e463e1Remove Liquidity145912202022-01-22 15:40:244 hrs 30 mins ago0x1e7121228569f2318fa36d8799f7eaee50ac48a0 IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.0006537
0x34e9c26578a4e28b44b358cd6f5f896bc04d299b1e93b936fbe9585d0097345eRemove Liquidity145911152022-01-22 15:35:094 hrs 36 mins ago0x1e7121228569f2318fa36d8799f7eaee50ac48a0 IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.00065334
0xd283934be060f7d15d5766728ba83d1be685b6c0d23a2a8d148e80bc8e393c45Swap Exact Token...145904292022-01-22 15:00:425 hrs 10 mins ago0xc98dd13ec8dac10c1e506b91921f49398c99c3db IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.001136065
0xeceef3d2e0ddfb21baffe87e8ae08af912af97c222cc7a1f6b10fad8ddc09f62Swap Exact Token...145902832022-01-22 14:53:245 hrs 17 mins ago0x02afa799f40d5273bf7140db7925b7824d7c8041 IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.00113858
0x433c2c2105cf22289e458868b4e03eb234c5f881534166ac29e802c54ad1efdcSwap Exact Token...145900302022-01-22 14:40:455 hrs 30 mins ago0x9800d40068a4380a7397dc95f8312f2e685a5265 IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.000753375
0x3bd5105b478adaa8ed587f63e8fab32b02ae3d43a957e93429efed3a2fae58b5Swap Exact Token...145900222022-01-22 14:40:215 hrs 30 mins ago0x9800d40068a4380a7397dc95f8312f2e685a5265 IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.00055535
0x636aaaf6ffb917abcf27d298fb1c55543c957d9a8341d47c62b064c9b94178fdRemove Liquidity...145900202022-01-22 14:40:155 hrs 30 mins ago0x45890194007456fea2555063248efb02d56804c3 IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.00077898
0x7cb915eb5c5275c01bc1db4e983a18000155474dd9906f7067e17a16b6ea070dSwap Exact Token...145889682022-01-22 13:47:396 hrs 23 mins ago0x679d96587efcd3dd0c5a0a64e2f426d19a232b0f IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.0005327
0xb0063e3338e3541d4cbcf87817825a13e5f4a49f2708cb872ec2ddda1da40856Swap Exact Token...145889342022-01-22 13:45:576 hrs 25 mins ago0x679d96587efcd3dd0c5a0a64e2f426d19a232b0f IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.000877915
0x551b1022a5d38641833b838f4e98b5bc6ea6de3743b68d4b68a33580f120a6c3Swap Exact Token...145886482022-01-22 13:31:396 hrs 39 mins ago0xec1c84dc6ba778889d64256d1154cab91b636691 IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.000877975
0x7376d3cdfbb9a947ac511cf68e163715558f2364cf4fe49acba7cf21a3b00858Swap Exact ETH F...145886342022-01-22 13:30:576 hrs 40 mins ago0x6a9620d63298df496e00eb26bc608c2dec4daaab IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0.111909419903043 BNB0.00093896
0x1ca983e546922814ef5ed75af5a76edf18cef63e9996d278ffcfb7ceead7e894Swap Exact Token...145882292022-01-22 13:10:427 hrs ago0x4bb9924a842038c08f6b9a12f29e10fc11782dfc IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.00048035
0x10c192da9178c35217f20583438eccc388b573ea50d63f6fafd8635766730e1aSwap Exact Token...145867862022-01-22 11:58:278 hrs 12 mins ago0x7b4bed35ab2a2a9a6c32433d2560b579393c47a1 IN  0x4ec82ecd19529ff50a467f522029f69459bf071d0 BNB0.00048047
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x5342a791f2af08cbb6479babb4e114099df08dd68d21c4adfa4f88381352ef0d145962162022-01-22 19:50:3620 mins ago 0x4ec82ecd19529ff50a467f522029f69459bf071d Binance: WBNB Token0.623527110672232362 BNB
0x2d2fde0eb30f1a866f3547d980b502172e1365444c69a3d73d2bb993b60841bc145944012022-01-22 18:19:411 hr 51 mins ago 0x4ec82ecd19529ff50a467f522029f69459bf071d0x3957d9976c13ddc8b3a57d3745f79647d06009d40.058105977492355426 BNB
0x2d2fde0eb30f1a866f3547d980b502172e1365444c69a3d73d2bb993b60841bc145944012022-01-22 18:19:411 hr 51 mins ago Binance: WBNB Token 0x4ec82ecd19529ff50a467f522029f69459bf071d0.058105977492355426 BNB
0x1d927188dcb9c65616ec2b4f8dac9ad0587e5e1c68d4c54424d89b1057fcc543145923372022-01-22 16:36:283 hrs 34 mins ago 0x4ec82ecd19529ff50a467f522029f69459bf071d 0x00be641ea61e505b95143a36ae883332b2b6c62b0.001796943150169184 BNB
0x1d927188dcb9c65616ec2b4f8dac9ad0587e5e1c68d4c54424d89b1057fcc543145923372022-01-22 16:36:283 hrs 34 mins ago Binance: WBNB Token 0x4ec82ecd19529ff50a467f522029f69459bf071d0.001796943150169184 BNB
0xe0d0f638c3421db264a72bbeeb4b7c18641d2d422986a79a6773fe1631289473145923352022-01-22 16:36:223 hrs 34 mins ago 0x4ec82ecd19529ff50a467f522029f69459bf071d 0xf6c2ee896275acb0916169a9f29e5e153b29e8880.003991135718906872 BNB
0xe0d0f638c3421db264a72bbeeb4b7c18641d2d422986a79a6773fe1631289473145923352022-01-22 16:36:223 hrs 34 mins ago Binance: WBNB Token 0x4ec82ecd19529ff50a467f522029f69459bf071d0.003991135718906872 BNB
0x0308b68a4dcdd487448edbb8d9874aee8982c11647554f08696f1158f681bca3145923332022-01-22 16:36:163 hrs 34 mins ago 0x4ec82ecd19529ff50a467f522029f69459bf071d 0xc5d8e26038d3c53ee35a0236ad37c78fa580d8a10.0001490016771243 BNB
0x0308b68a4dcdd487448edbb8d9874aee8982c11647554f08696f1158f681bca3145923332022-01-22 16:36:163 hrs 34 mins ago Binance: WBNB Token 0x4ec82ecd19529ff50a467f522029f69459bf071d0.0001490016771243 BNB
0xc5c0e70a828935dd99e9681c1ff0813fac442676c7b0d28d596e1ea92a78cb66145923312022-01-22 16:36:103 hrs 35 mins ago 0x4ec82ecd19529ff50a467f522029f69459bf071d 0x16a8d706083b1df072d6577cc495a8f973bd77b80.001814044400863642 BNB
0xc5c0e70a828935dd99e9681c1ff0813fac442676c7b0d28d596e1ea92a78cb66145923312022-01-22 16:36:103 hrs 35 mins ago Binance: WBNB Token 0x4ec82ecd19529ff50a467f522029f69459bf071d0.001814044400863642 BNB
0x2459c32e27cf6ea53e5af4671c5dbe450e475caf87e17a4867ab1f33d73d9d7d145923272022-01-22 16:35:583 hrs 35 mins ago 0x4ec82ecd19529ff50a467f522029f69459bf071d 0x7807534c8c10e028459bdd21352156e1e827254e0.005402852555986579 BNB
0x2459c32e27cf6ea53e5af4671c5dbe450e475caf87e17a4867ab1f33d73d9d7d145923272022-01-22 16:35:583 hrs 35 mins ago Binance: WBNB Token 0x4ec82ecd19529ff50a467f522029f69459bf071d0.005402852555986579 BNB
0x1c3b2d7d13b9c661e2ff1ef51c3a989c4b9fdc82f5c193da428314a4d812937a145923252022-01-22 16:35:523 hrs 35 mins ago 0x4ec82ecd19529ff50a467f522029f69459bf071d 0xa396c7902ea8a24b86b9a07d10435e38781249910.00644785632365672 BNB
0x1c3b2d7d13b9c661e2ff1ef51c3a989c4b9fdc82f5c193da428314a4d812937a145923252022-01-22 16:35:523 hrs 35 mins ago Binance: WBNB Token 0x4ec82ecd19529ff50a467f522029f69459bf071d0.00644785632365672 BNB
0xc280b0313aa3227d0676f7f838f5767bb2899cc15fd62aefaedb37f8b5ba0062145923232022-01-22 16:35:463 hrs 35 mins ago 0x4ec82ecd19529ff50a467f522029f69459bf071d 0x07072cf48f5e523734afcd3e963029f1328514aa0.003486915608524873 BNB
0xc280b0313aa3227d0676f7f838f5767bb2899cc15fd62aefaedb37f8b5ba0062145923232022-01-22 16:35:463 hrs 35 mins ago Binance: WBNB Token 0x4ec82ecd19529ff50a467f522029f69459bf071d0.003486915608524873 BNB
0x7906c3e09085883f427eb1cf656b1b527447417f8a5e4713718a1b7431712284145923212022-01-22 16:35:403 hrs 35 mins ago 0x4ec82ecd19529ff50a467f522029f69459bf071d 0x1f361850bcefbe6f80871419cd9afae2a0e2ea380.001930715266788648 BNB
0x7906c3e09085883f427eb1cf656b1b527447417f8a5e4713718a1b7431712284145923212022-01-22 16:35:403 hrs 35 mins ago Binance: WBNB Token 0x4ec82ecd19529ff50a467f522029f69459bf071d0.001930715266788648 BNB
0xc2277e75cf7e2ac43de313cc9ad370e6501db01db67770953bef05ca98b3e346145923012022-01-22 16:34:403 hrs 36 mins ago 0x4ec82ecd19529ff50a467f522029f69459bf071d 0xd20b814aafadcfbe3f1c955abe1f1f734ed2d8840.001151113695887398 BNB
0xc2277e75cf7e2ac43de313cc9ad370e6501db01db67770953bef05ca98b3e346145923012022-01-22 16:34:403 hrs 36 mins ago Binance: WBNB Token 0x4ec82ecd19529ff50a467f522029f69459bf071d0.001151113695887398 BNB
0x636aaaf6ffb917abcf27d298fb1c55543c957d9a8341d47c62b064c9b94178fd145900202022-01-22 14:40:155 hrs 30 mins ago 0x4ec82ecd19529ff50a467f522029f69459bf071d0x45890194007456fea2555063248efb02d56804c30.606338660830671366 BNB
0x636aaaf6ffb917abcf27d298fb1c55543c957d9a8341d47c62b064c9b94178fd145900202022-01-22 14:40:155 hrs 30 mins ago Binance: WBNB Token 0x4ec82ecd19529ff50a467f522029f69459bf071d0.606338660830671366 BNB
0x7cb915eb5c5275c01bc1db4e983a18000155474dd9906f7067e17a16b6ea070d145889682022-01-22 13:47:396 hrs 23 mins ago 0x4ec82ecd19529ff50a467f522029f69459bf071d0x679d96587efcd3dd0c5a0a64e2f426d19a232b0f0.088163117327326907 BNB
0x7cb915eb5c5275c01bc1db4e983a18000155474dd9906f7067e17a16b6ea070d145889682022-01-22 13:47:396 hrs 23 mins ago Binance: WBNB Token 0x4ec82ecd19529ff50a467f522029f69459bf071d0.088163117327326907 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LatteSwapRouter

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 168 runs

Other Settings:
istanbul EvmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 1 of 9: LatteSwapRouter.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity =0.6.12;

import "./LatteSwapLibrary.sol";
import "./LatteSwapSafeMath.sol";
import "./TransferHelper.sol";
import "./ILatteSwapRouter.sol";
import "./ILatteSwapFactory.sol";
import "./ILatteSwapBEP20.sol";
import "./IWBNB.sol";

contract LatteSwapRouter is ILatteSwapRouter {
  using LatteSwapSafeMath for uint256;

  address public immutable override factory;
  address public immutable override WBNB;

  modifier ensure(uint256 deadline) {
    require(deadline >= block.timestamp, "LatteSwapRouter::ensure::EXPIRED");
    _;
  }

  constructor(address _factory, address _WBNB) public {
    factory = _factory;
    WBNB = _WBNB;
  }

  receive() external payable {
    assert(msg.sender == WBNB); // only accept ETH via fallback from the WBNB contract
  }

  // **** ADD LIQUIDITY ****
  function _addLiquidity(
    address tokenA,
    address tokenB,
    uint256 amountADesired,
    uint256 amountBDesired,
    uint256 amountAMin,
    uint256 amountBMin
  ) internal virtual returns (uint256 amountA, uint256 amountB) {
    // create the pair if it doesn't exist yet
    if (ILatteSwapFactory(factory).getPair(tokenA, tokenB) == address(0)) {
      ILatteSwapFactory(factory).createPair(tokenA, tokenB);
    }
    (uint256 reserveA, uint256 reserveB) = LatteSwapLibrary.getReserves(factory, tokenA, tokenB);
    if (reserveA == 0 && reserveB == 0) {
      (amountA, amountB) = (amountADesired, amountBDesired);
    } else {
      uint256 amountBOptimal = LatteSwapLibrary.quote(amountADesired, reserveA, reserveB);
      if (amountBOptimal <= amountBDesired) {
        require(amountBOptimal >= amountBMin, "LatteSwapRouter::_addLiquidity::INSUFFICIENT_B_AMOUNT");
        (amountA, amountB) = (amountADesired, amountBOptimal);
      } else {
        uint256 amountAOptimal = LatteSwapLibrary.quote(amountBDesired, reserveB, reserveA);
        assert(amountAOptimal <= amountADesired);
        require(amountAOptimal >= amountAMin, "LatteSwapRouter::_addLiquidity::INSUFFICIENT_A_AMOUNT");
        (amountA, amountB) = (amountAOptimal, amountBDesired);
      }
    }
  }

  function addLiquidity(
    address tokenA,
    address tokenB,
    uint256 amountADesired,
    uint256 amountBDesired,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  )
    external
    virtual
    override
    ensure(deadline)
    returns (
      uint256 amountA,
      uint256 amountB,
      uint256 liquidity
    )
  {
    (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
    address pair = LatteSwapLibrary.pairFor(factory, tokenA, tokenB);
    TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
    TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
    liquidity = ILatteSwapPair(pair).mint(to);
  }

  function addLiquidityETH(
    address token,
    uint256 amountTokenDesired,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  )
    external
    payable
    virtual
    override
    ensure(deadline)
    returns (
      uint256 amountToken,
      uint256 amountETH,
      uint256 liquidity
    )
  {
    (amountToken, amountETH) = _addLiquidity(token, WBNB, amountTokenDesired, msg.value, amountTokenMin, amountETHMin);
    address pair = LatteSwapLibrary.pairFor(factory, token, WBNB);
    TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
    IWBNB(WBNB).deposit{ value: amountETH }();
    assert(IWBNB(WBNB).transfer(pair, amountETH));
    liquidity = ILatteSwapPair(pair).mint(to);
    // refund dust eth, if any
    if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
  }

  // **** REMOVE LIQUIDITY ****
  function removeLiquidity(
    address tokenA,
    address tokenB,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) {
    address pair = LatteSwapLibrary.pairFor(factory, tokenA, tokenB);
    ILatteSwapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
    (uint256 amount0, uint256 amount1) = ILatteSwapPair(pair).burn(to);
    (address token0, ) = LatteSwapLibrary.sortTokens(tokenA, tokenB);
    (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
    require(amountA >= amountAMin, "LatteSwapRouter::removeLiquidity::INSUFFICIENT_A_AMOUNT");
    require(amountB >= amountBMin, "LatteSwapRouter::removeLiquidity::INSUFFICIENT_B_AMOUNT");
  }

  function removeLiquidityETH(
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH) {
    (amountToken, amountETH) = removeLiquidity(
      token,
      WBNB,
      liquidity,
      amountTokenMin,
      amountETHMin,
      address(this),
      deadline
    );
    TransferHelper.safeTransfer(token, to, amountToken);
    IWBNB(WBNB).withdraw(amountETH);
    TransferHelper.safeTransferETH(to, amountETH);
  }

  function removeLiquidityWithPermit(
    address tokenA,
    address tokenB,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external virtual override returns (uint256 amountA, uint256 amountB) {
    address pair = LatteSwapLibrary.pairFor(factory, tokenA, tokenB);
    uint256 value = approveMax ? uint256(-1) : liquidity;
    ILatteSwapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
    (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
  }

  function removeLiquidityETHWithPermit(
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external virtual override returns (uint256 amountToken, uint256 amountETH) {
    address pair = LatteSwapLibrary.pairFor(factory, token, WBNB);
    uint256 value = approveMax ? uint256(-1) : liquidity;
    ILatteSwapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
    (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
  }

  // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
  function removeLiquidityETHSupportingFeeOnTransferTokens(
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) public virtual override ensure(deadline) returns (uint256 amountETH) {
    (, amountETH) = removeLiquidity(token, WBNB, liquidity, amountTokenMin, amountETHMin, address(this), deadline);
    TransferHelper.safeTransfer(token, to, ILatteSwapBEP20(token).balanceOf(address(this)));
    IWBNB(WBNB).withdraw(amountETH);
    TransferHelper.safeTransferETH(to, amountETH);
  }

  function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external virtual override returns (uint256 amountETH) {
    address pair = LatteSwapLibrary.pairFor(factory, token, WBNB);
    uint256 value = approveMax ? uint256(-1) : liquidity;
    ILatteSwapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
    amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
      token,
      liquidity,
      amountTokenMin,
      amountETHMin,
      to,
      deadline
    );
  }

  // **** SWAP ****
  // requires the initial amount to have already been sent to the first pair
  function _swap(
    uint256[] memory amounts,
    address[] memory path,
    address _to
  ) internal virtual {
    for (uint256 i; i < path.length - 1; i++) {
      (address input, address output) = (path[i], path[i + 1]);
      (address token0, ) = LatteSwapLibrary.sortTokens(input, output);
      uint256 amountOut = amounts[i + 1];
      (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0));
      address to = i < path.length - 2 ? LatteSwapLibrary.pairFor(factory, output, path[i + 2]) : _to;
      ILatteSwapPair(LatteSwapLibrary.pairFor(factory, input, output)).swap(amount0Out, amount1Out, to, new bytes(0));
    }
  }

  function swapExactTokensForTokens(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
    amounts = LatteSwapLibrary.getAmountsOut(factory, amountIn, path);
    require(
      amounts[amounts.length - 1] >= amountOutMin,
      "LatteSwapRouter::swapExactTokensForTokens::INSUFFICIENT_OUTPUT_AMOUNT"
    );
    TransferHelper.safeTransferFrom(
      path[0],
      msg.sender,
      LatteSwapLibrary.pairFor(factory, path[0], path[1]),
      amounts[0]
    );
    _swap(amounts, path, to);
  }

  function swapTokensForExactTokens(
    uint256 amountOut,
    uint256 amountInMax,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
    amounts = LatteSwapLibrary.getAmountsIn(factory, amountOut, path);
    require(amounts[0] <= amountInMax, "LatteSwapRouter::swapTokensForExactTokens::EXCESSIVE_INPUT_AMOUNT");
    TransferHelper.safeTransferFrom(
      path[0],
      msg.sender,
      LatteSwapLibrary.pairFor(factory, path[0], path[1]),
      amounts[0]
    );
    _swap(amounts, path, to);
  }

  function swapExactETHForTokens(
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) {
    require(path[0] == WBNB, "LatteSwapRouter::swapExactETHForTokens::INVALID_PATH");
    amounts = LatteSwapLibrary.getAmountsOut(factory, msg.value, path);
    require(
      amounts[amounts.length - 1] >= amountOutMin,
      "LatteSwapRouter::swapExactETHForTokens::INSUFFICIENT_OUTPUT_AMOUNT"
    );
    IWBNB(WBNB).deposit{ value: amounts[0] }();
    assert(IWBNB(WBNB).transfer(LatteSwapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
    _swap(amounts, path, to);
  }

  function swapTokensForExactETH(
    uint256 amountOut,
    uint256 amountInMax,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
    require(path[path.length - 1] == WBNB, "LatteSwapRouter::swapTokensForExactETH::INVALID_PATH");
    amounts = LatteSwapLibrary.getAmountsIn(factory, amountOut, path);
    require(amounts[0] <= amountInMax, "LatteSwapRouter::swapTokensForExactETH::EXCESSIVE_INPUT_AMOUNT");
    TransferHelper.safeTransferFrom(
      path[0],
      msg.sender,
      LatteSwapLibrary.pairFor(factory, path[0], path[1]),
      amounts[0]
    );
    _swap(amounts, path, address(this));
    IWBNB(WBNB).withdraw(amounts[amounts.length - 1]);
    TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
  }

  function swapExactTokensForETH(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
    require(path[path.length - 1] == WBNB, "LatteSwapRouter::swapExactTokensForETH::INVALID_PATH");
    amounts = LatteSwapLibrary.getAmountsOut(factory, amountIn, path);
    require(
      amounts[amounts.length - 1] >= amountOutMin,
      "LatteSwapRouter:swapExactTokensForETH::INSUFFICIENT_OUTPUT_AMOUNT"
    );
    TransferHelper.safeTransferFrom(
      path[0],
      msg.sender,
      LatteSwapLibrary.pairFor(factory, path[0], path[1]),
      amounts[0]
    );
    _swap(amounts, path, address(this));
    IWBNB(WBNB).withdraw(amounts[amounts.length - 1]);
    TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
  }

  function swapETHForExactTokens(
    uint256 amountOut,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) {
    require(path[0] == WBNB, "LatteSwapRouter::swapETHForExactTokens::INVALID_PATH");
    amounts = LatteSwapLibrary.getAmountsIn(factory, amountOut, path);
    require(amounts[0] <= msg.value, "LatteSwapRouter::swapETHForExactTokens::EXCESSIVE_INPUT_AMOUNT");
    IWBNB(WBNB).deposit{ value: amounts[0] }();
    assert(IWBNB(WBNB).transfer(LatteSwapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
    _swap(amounts, path, to);
    // refund dust eth, if any
    if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
  }

  // **** SWAP (supporting fee-on-transfer tokens) ****
  // requires the initial amount to have already been sent to the first pair
  function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
    for (uint256 i; i < path.length - 1; i++) {
      (address input, address output) = (path[i], path[i + 1]);
      (address token0, ) = LatteSwapLibrary.sortTokens(input, output);
      ILatteSwapPair pair = ILatteSwapPair(LatteSwapLibrary.pairFor(factory, input, output));
      uint256 amountInput;
      uint256 amountOutput;
      {
        // scope to avoid stack too deep errors
        (uint256 reserve0, uint256 reserve1, ) = pair.getReserves();
        (uint256 reserveInput, uint256 reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
        amountInput = ILatteSwapBEP20(input).balanceOf(address(pair)).sub(reserveInput);
        amountOutput = LatteSwapLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
      }
      (uint256 amount0Out, uint256 amount1Out) = input == token0
        ? (uint256(0), amountOutput)
        : (amountOutput, uint256(0));
      address to = i < path.length - 2 ? LatteSwapLibrary.pairFor(factory, output, path[i + 2]) : _to;
      pair.swap(amount0Out, amount1Out, to, new bytes(0));
    }
  }

  function swapExactTokensForTokensSupportingFeeOnTransferTokens(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) {
    TransferHelper.safeTransferFrom(path[0], msg.sender, LatteSwapLibrary.pairFor(factory, path[0], path[1]), amountIn);
    uint256 balanceBefore = ILatteSwapBEP20(path[path.length - 1]).balanceOf(to);
    _swapSupportingFeeOnTransferTokens(path, to);
    require(
      ILatteSwapBEP20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
      "LatteSwapRouter::swapExactTokensForTokensSupportingFeeOnTransferTokens::INSUFFICIENT_OUTPUT_AMOUNT"
    );
  }

  function swapExactETHForTokensSupportingFeeOnTransferTokens(
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external payable virtual override ensure(deadline) {
    require(path[0] == WBNB, "LatteSwapRouter::swapExactETHForTokensSupportingFeeOnTransferTokens::INVALID_PATH");
    uint256 amountIn = msg.value;
    IWBNB(WBNB).deposit{ value: amountIn }();
    assert(IWBNB(WBNB).transfer(LatteSwapLibrary.pairFor(factory, path[0], path[1]), amountIn));
    uint256 balanceBefore = ILatteSwapBEP20(path[path.length - 1]).balanceOf(to);
    _swapSupportingFeeOnTransferTokens(path, to);
    require(
      ILatteSwapBEP20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
      "LatteSwapRouter::swapExactETHForTokensSupportingFeeOnTransferTokens::INSUFFICIENT_OUTPUT_AMOUNT"
    );
  }

  function swapExactTokensForETHSupportingFeeOnTransferTokens(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) {
    require(
      path[path.length - 1] == WBNB,
      "LatteSwapRouter::swapExactTokensForETHSupportingFeeOnTransferTokens::INVALID_PATH"
    );
    TransferHelper.safeTransferFrom(path[0], msg.sender, LatteSwapLibrary.pairFor(factory, path[0], path[1]), amountIn);
    _swapSupportingFeeOnTransferTokens(path, address(this));
    uint256 amountOut = ILatteSwapBEP20(WBNB).balanceOf(address(this));
    require(
      amountOut >= amountOutMin,
      "LatteSwapRouter::swapExactTokensForETHSupportingFeeOnTransferTokens::INSUFFICIENT_OUTPUT_AMOUNT"
    );
    IWBNB(WBNB).withdraw(amountOut);
    TransferHelper.safeTransferETH(to, amountOut);
  }

  // **** LIBRARY FUNCTIONS ****
  function quote(
    uint256 amountA,
    uint256 reserveA,
    uint256 reserveB
  ) external pure virtual override returns (uint256 amountB) {
    return LatteSwapLibrary.quote(amountA, reserveA, reserveB);
  }

  function getAmountOut(
    uint256 amountIn,
    uint256 reserveIn,
    uint256 reserveOut
  ) external pure virtual override returns (uint256 amountOut) {
    return LatteSwapLibrary.getAmountOut(amountIn, reserveIn, reserveOut);
  }

  function getAmountIn(
    uint256 amountOut,
    uint256 reserveIn,
    uint256 reserveOut
  ) external pure virtual override returns (uint256 amountIn) {
    return LatteSwapLibrary.getAmountIn(amountOut, reserveIn, reserveOut);
  }

  function getAmountsOut(uint256 amountIn, address[] memory path)
    external
    view
    virtual
    override
    returns (uint256[] memory amounts)
  {
    return LatteSwapLibrary.getAmountsOut(factory, amountIn, path);
  }

  function getAmountsIn(uint256 amountOut, address[] memory path)
    external
    view
    virtual
    override
    returns (uint256[] memory amounts)
  {
    return LatteSwapLibrary.getAmountsIn(factory, amountOut, path);
  }
}

File 2 of 9: ILatteSwapBEP20.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

interface ILatteSwapBEP20 {
  event Approval(address indexed owner, address indexed spender, uint256 value);
  event Transfer(address indexed from, address indexed to, uint256 value);

  function name() external view returns (string memory);

  function symbol() external view returns (string memory);

  function decimals() external view returns (uint8);

  function totalSupply() external view returns (uint256);

  function balanceOf(address owner) external view returns (uint256);

  function allowance(address owner, address spender) external view returns (uint256);

  function approve(address spender, uint256 value) external returns (bool);

  function transfer(address to, uint256 value) external returns (bool);

  function transferFrom(
    address from,
    address to,
    uint256 value
  ) external returns (bool);
}

File 3 of 9: ILatteSwapFactory.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

interface ILatteSwapFactory {
  event PairCreated(address indexed token0, address indexed token1, address pair, uint256);

  function feeTo() external view returns (address);

  function feeToSetter() external view returns (address);

  function getPair(address tokenA, address tokenB) external view returns (address pair);

  function allPairs(uint256) external view returns (address pair);

  function allPairsLength() external view returns (uint256);

  function createPair(address tokenA, address tokenB) external returns (address pair);

  function setFeeTo(address) external;

  function setFeeToSetter(address) external;
}

File 4 of 9: ILatteSwapPair.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

interface ILatteSwapPair {
  event Approval(address indexed owner, address indexed spender, uint256 value);
  event Transfer(address indexed from, address indexed to, uint256 value);

  function name() external pure returns (string memory);

  function symbol() external pure returns (string memory);

  function decimals() external pure returns (uint8);

  function totalSupply() external view returns (uint256);

  function balanceOf(address owner) external view returns (uint256);

  function allowance(address owner, address spender) external view returns (uint256);

  function approve(address spender, uint256 value) external returns (bool);

  function transfer(address to, uint256 value) external returns (bool);

  function transferFrom(
    address from,
    address to,
    uint256 value
  ) external returns (bool);

  function DOMAIN_SEPARATOR() external view returns (bytes32);

  function PERMIT_TYPEHASH() external pure returns (bytes32);

  function nonces(address owner) external view returns (uint256);

  function permit(
    address owner,
    address spender,
    uint256 value,
    uint256 deadline,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external;

  event Mint(address indexed sender, uint256 amount0, uint256 amount1);
  event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to);
  event Swap(
    address indexed sender,
    uint256 amount0In,
    uint256 amount1In,
    uint256 amount0Out,
    uint256 amount1Out,
    address indexed to
  );
  event Sync(uint112 reserve0, uint112 reserve1);

  function MINIMUM_LIQUIDITY() external pure returns (uint256);

  function factory() external view returns (address);

  function token0() external view returns (address);

  function token1() external view returns (address);

  function getReserves()
    external
    view
    returns (
      uint112 reserve0,
      uint112 reserve1,
      uint32 blockTimestampLast
    );

  function price0CumulativeLast() external view returns (uint256);

  function price1CumulativeLast() external view returns (uint256);

  function kLast() external view returns (uint256);

  function mint(address to) external returns (uint256 liquidity);

  function burn(address to) external returns (uint256 amount0, uint256 amount1);

  function swap(
    uint256 amount0Out,
    uint256 amount1Out,
    address to,
    bytes calldata data
  ) external;

  function skim(address to) external;

  function sync() external;

  function initialize(address, address) external;
}

File 5 of 9: ILatteSwapRouter.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.6.2;

interface ILatteSwapRouter {
  function factory() external pure returns (address);

  function WBNB() external pure returns (address);

  function addLiquidity(
    address tokenA,
    address tokenB,
    uint256 amountADesired,
    uint256 amountBDesired,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  )
    external
    returns (
      uint256 amountA,
      uint256 amountB,
      uint256 liquidity
    );

  function addLiquidityETH(
    address token,
    uint256 amountTokenDesired,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  )
    external
    payable
    returns (
      uint256 amountToken,
      uint256 amountETH,
      uint256 liquidity
    );

  function removeLiquidity(
    address tokenA,
    address tokenB,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  ) external returns (uint256 amountA, uint256 amountB);

  function removeLiquidityETH(
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) external returns (uint256 amountToken, uint256 amountETH);

  function removeLiquidityWithPermit(
    address tokenA,
    address tokenB,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint256 amountA, uint256 amountB);

  function removeLiquidityETHWithPermit(
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint256 amountToken, uint256 amountETH);

  function swapExactTokensForTokens(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapTokensForExactTokens(
    uint256 amountOut,
    uint256 amountInMax,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapExactETHForTokens(
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external payable returns (uint256[] memory amounts);

  function swapTokensForExactETH(
    uint256 amountOut,
    uint256 amountInMax,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapExactTokensForETH(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapETHForExactTokens(
    uint256 amountOut,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external payable returns (uint256[] memory amounts);

  function quote(
    uint256 amountA,
    uint256 reserveA,
    uint256 reserveB
  ) external pure returns (uint256 amountB);

  function getAmountOut(
    uint256 amountIn,
    uint256 reserveIn,
    uint256 reserveOut
  ) external pure returns (uint256 amountOut);

  function getAmountIn(
    uint256 amountOut,
    uint256 reserveIn,
    uint256 reserveOut
  ) external pure returns (uint256 amountIn);

  function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts);

  function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts);

  function removeLiquidityETHSupportingFeeOnTransferTokens(
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) external returns (uint256 amountETH);

  function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint256 amountETH);

  function swapExactTokensForTokensSupportingFeeOnTransferTokens(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external;

  function swapExactETHForTokensSupportingFeeOnTransferTokens(
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external payable;

  function swapExactTokensForETHSupportingFeeOnTransferTokens(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external;
}

File 6 of 9: IWBNB.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

interface IWBNB {
  function deposit() external payable;

  function transfer(address to, uint256 value) external returns (bool);

  function withdraw(uint256) external;
}

File 7 of 9: LatteSwapLibrary.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

import "./ILatteSwapPair.sol";
import "./LatteSwapSafeMath.sol";

library LatteSwapLibrary {
  using LatteSwapSafeMath for uint256;

  // returns sorted token addresses, used to handle return values from pairs sorted in this order
  function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
    require(tokenA != tokenB, "LatteSwapLibrary::sortTokens::IDENTICAL_ADDRESSES");
    (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
    require(token0 != address(0), "LatteSwapLibrary::sortTokens::ZERO_ADDRESS");
  }

  // calculates the CREATE2 address for a pair without making any external calls
  function pairFor(
    address factory,
    address tokenA,
    address tokenB
  ) internal pure returns (address pair) {
    (address token0, address token1) = sortTokens(tokenA, tokenB);
    pair = address(
      uint256(
        keccak256(
          abi.encodePacked(
            hex"ff",
            factory,
            keccak256(abi.encodePacked(token0, token1)),
            hex"d186cd0235b0839707c25b5e4a518a7e67159a1c74f36680d920c0d82097db36" // init code hash
          )
        )
      )
    );
  }

  // fetches and sorts the reserves for a pair
  function getReserves(
    address factory,
    address tokenA,
    address tokenB
  ) internal view returns (uint256 reserveA, uint256 reserveB) {
    (address token0, ) = sortTokens(tokenA, tokenB);
    (uint256 reserve0, uint256 reserve1, ) = ILatteSwapPair(pairFor(factory, tokenA, tokenB)).getReserves();
    (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
  }

  // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
  function quote(
    uint256 amountA,
    uint256 reserveA,
    uint256 reserveB
  ) internal pure returns (uint256 amountB) {
    require(amountA > 0, "LatteSwapLibrary::quote::INSUFFICIENT_AMOUNT");
    require(reserveA > 0 && reserveB > 0, "LatteSwapLibrary::quote::INSUFFICIENT_LIQUIDITY");
    amountB = amountA.mul(reserveB) / reserveA;
  }

  // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
  function getAmountOut(
    uint256 amountIn,
    uint256 reserveIn,
    uint256 reserveOut
  ) internal pure returns (uint256 amountOut) {
    require(amountIn > 0, "LatteSwapLibrary::getAmountOut::INSUFFICIENT_INPUT_AMOUNT");
    require(reserveIn > 0 && reserveOut > 0, "LatteSwapLibrary::getAmountOut::INSUFFICIENT_LIQUIDITY");
    uint256 amountInWithFee = amountIn.mul(9975);
    uint256 numerator = amountInWithFee.mul(reserveOut);
    uint256 denominator = reserveIn.mul(10000).add(amountInWithFee);
    amountOut = numerator / denominator;
  }

  // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
  function getAmountIn(
    uint256 amountOut,
    uint256 reserveIn,
    uint256 reserveOut
  ) internal pure returns (uint256 amountIn) {
    require(amountOut > 0, "LatteSwapLibrary::getAmountIn::INSUFFICIENT_OUTPUT_AMOUNT");
    require(reserveIn > 0 && reserveOut > 0, "LatteSwapLibrary::getAmountIn::INSUFFICIENT_LIQUIDITY");
    uint256 numerator = reserveIn.mul(amountOut).mul(10000);
    uint256 denominator = reserveOut.sub(amountOut).mul(9975);
    amountIn = (numerator / denominator).add(1);
  }

  // performs chained getAmountOut calculations on any number of pairs
  function getAmountsOut(
    address factory,
    uint256 amountIn,
    address[] memory path
  ) internal view returns (uint256[] memory amounts) {
    require(path.length >= 2, "LatteSwapLibrary::getAmountsOut::INVALID_PATH");
    amounts = new uint256[](path.length);
    amounts[0] = amountIn;
    for (uint256 i; i < path.length - 1; i++) {
      (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i], path[i + 1]);
      amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
    }
  }

  // performs chained getAmountIn calculations on any number of pairs
  function getAmountsIn(
    address factory,
    uint256 amountOut,
    address[] memory path
  ) internal view returns (uint256[] memory amounts) {
    require(path.length >= 2, "LatteSwapLibrary::getAmountsIn::INVALID_PATH");
    amounts = new uint256[](path.length);
    amounts[amounts.length - 1] = amountOut;
    for (uint256 i = path.length - 1; i > 0; i--) {
      (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i - 1], path[i]);
      amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
    }
  }
}

File 8 of 9: LatteSwapSafeMath.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity =0.6.12;

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)

library LatteSwapSafeMath {
  function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
    require((z = x + y) >= x, "LatteSwapSafeMath::add::ds-math-add-overflow");
  }

  function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
    require((z = x - y) <= x, "LatteSwapSafeMath::sub::ds-math-sub-underflow");
  }

  function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
    require(y == 0 || (z = x * y) / y == x, "LatteSwapSafeMath::mul::ds-math-mul-overflow");
  }
}

File 9 of 9: TransferHelper.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.6.0;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
  function safeApprove(
    address token,
    address to,
    uint256 value
  ) internal {
    // bytes4(keccak256(bytes('approve(address,uint256)')));
    (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
    require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper::safeApprove::APPROVE_FAILED");
  }

  function safeTransfer(
    address token,
    address to,
    uint256 value
  ) internal {
    // bytes4(keccak256(bytes('transfer(address,uint256)')));
    (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
    require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper::safeTransfer::TRANSFER_FAILED");
  }

  function safeTransferFrom(
    address token,
    address from,
    address to,
    uint256 value
  ) internal {
    // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
    (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
    require(
      success && (data.length == 0 || abi.decode(data, (bool))),
      "TransferHelper::safeTransferFrom::TRANSFER_FROM_FAILED"
    );
  }

  function safeTransferETH(address to, uint256 value) internal {
    (bool success, ) = to.call{ value: value }(new bytes(0));
    require(success, "TransferHelper::safeTransferETH::BNB_TRANSFER_FAILED");
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WBNB","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WBNB","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801561001057600080fd5b5060405162004cb538038062004cb58339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614b30620001856000398061015f5280610ce45280610d1f5280610e16528061103052806113ba528061151c52806118cb52806119a25280611a7c5280611b4a5280611c8c5280611d145280611f505280611fcb528061207f528061214b52806121dc5280612250528061277052806129da5280612a305280612a645280612ad85280612c665280612da55280612e2d525080610ea05280610f7752806110f6528061112f528061126a528061144452806114fa528061166a5280611bd95280611d465280611ea0528061228252806124fd52806126f5528061271e528061274e52806128bb5280612a0e5280612cf55280612e5f52806136b952806136fc52806139c05280613b365280613f035280613fbc528061406f5250614b306000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df5780638dd9500214610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110ef945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611125565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b03813516906020013561121f565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561136a565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356114f2565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611600565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b03813516906020013561187d565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b02565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611e48565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611e55565b34801561088157600080fd5b5061088a611f4e565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611f72565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611f7f565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b038135169060200135612105565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356124af565b348015610a1c57600080fd5b5061088a6126f3565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612717945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612744565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612858565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a0013561298b565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612c1e565b6000808242811015610cde576040805162461bcd60e51b815260206004820181905260248201526000805160206148e0833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6124af565b9093509150610d1d898685612f93565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da585836130e7565b50965096945050505050565b6000610dbe8484846131df565b949350505050565b60608142811015610e0c576040805162461bcd60e51b815260206004820181905260248201526000805160206148e0833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9b5760405162461bcd60e51b81526004018080602001828103825260348152602001806148526034913960400191505060405180910390fd5b610ef97f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132b792505050565b91508682600184510381518110610f0c57fe5b60200260200101511015610f515760405162461bcd60e51b81526004018080602001828103825260418152602001806145446041913960600191505060405180910390fd5b610fef86866000818110610f6157fe5b905060200201356001600160a01b031633610fd57f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fa357fe5b905060200201356001600160a01b03168b8b6001818110610fc057fe5b905060200201356001600160a01b03166133ed565b85600081518110610fe257fe5b60200260200101516134ad565b61102e8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061360a915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061106d57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110ab57600080fd5b505af11580156110bf573d6000803e3d6000fd5b505050506110e484836001855103815181106110d757fe5b60200260200101516130e7565b509695505050505050565b606061111c7f00000000000000000000000000000000000000000000000000000000000000008484613847565b90505b92915050565b60008060006111557f00000000000000000000000000000000000000000000000000000000000000008f8f6133ed565b9050600087611164578c611168565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111de57600080fd5b505af11580156111f2573d6000803e3d6000fd5b505050506112058f8f8f8f8f8f8f6124af565b809450819550505050509b509b9950505050505050505050565b60608142811015611265576040805162461bcd60e51b815260206004820181905260248201526000805160206148e0833981519152604482015290519081900360640190fd5b6112c37f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132b792505050565b915086826001845103815181106112d657fe5b6020026020010151101561131b5760405162461bcd60e51b8152600401808060200182810382526045815260200180614a786045913960600191505060405180910390fd5b61132b86866000818110610f6157fe5b6110e48287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061360a915050565b606081428110156113b0576040805162461bcd60e51b815260206004820181905260248201526000805160206148e0833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106113ea57fe5b905060200201356001600160a01b03166001600160a01b03161461143f5760405162461bcd60e51b81526004018080602001828103825260348152602001806147376034913960400191505060405180910390fd5b61149d7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384792505050565b915086826000815181106114ad57fe5b60200260200101511115610f515760405162461bcd60e51b815260040180806020018281038252603e815260200180614abd603e913960400191505060405180910390fd5b6000806115407f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006133ed565b905060008661154f578b611553565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115c957600080fd5b505af11580156115dd573d6000803e3d6000fd5b505050506115ef8d8d8d8d8d8d611f7f565b9d9c50505050505050505050505050565b8042811015611644576040805162461bcd60e51b815260206004820181905260248201526000805160206148e0833981519152604482015290519081900360640190fd5b6116b98585600081811061165457fe5b905060200201356001600160a01b0316336116b37f00000000000000000000000000000000000000000000000000000000000000008989600081811061169657fe5b905060200201356001600160a01b03168a8a6001818110610fc057fe5b8a6134ad565b6000858560001981018181106116cb57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561172757600080fd5b505afa15801561173b573d6000803e3d6000fd5b505050506040513d602081101561175157600080fd5b50516040805160208881028281018201909352888252929350611793929091899189918291850190849080828437600092019190915250889250613969915050565b8661183682888860001981018181106117a857fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180457600080fd5b505afa158015611818573d6000803e3d6000fd5b505050506040513d602081101561182e57600080fd5b505190613c6b565b10156118735760405162461bcd60e51b81526004018080602001828103825260628152602001806146d56062913960800191505060405180910390fd5b5050505050505050565b80428110156118c1576040805162461bcd60e51b815260206004820181905260248201526000805160206148e0833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016858560001981018181106118fb57fe5b905060200201356001600160a01b03166001600160a01b0316146119505760405162461bcd60e51b81526004018080602001828103825260518152602001806143ed6051913960600191505060405180910390fd5b6119608585600081811061165457fe5b61199e858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613969915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a0d57600080fd5b505afa158015611a21573d6000803e3d6000fd5b505050506040513d6020811015611a3757600080fd5b5051905086811015611a7a5760405162461bcd60e51b815260040180806020018281038252605f81526020018061461b605f913960600191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611ae057600080fd5b505af1158015611af4573d6000803e3d6000fd5b5050505061187384826130e7565b60608142811015611b48576040805162461bcd60e51b815260206004820181905260248201526000805160206148e0833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611b7f57fe5b905060200201356001600160a01b03166001600160a01b031614611bd45760405162461bcd60e51b81526004018080602001828103825260348152602001806147976034913960400191505060405180910390fd5b611c327f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132b792505050565b91508682600184510381518110611c4557fe5b60200260200101511015611c8a5760405162461bcd60e51b81526004018080602001828103825260428152602001806143ab6042913960600191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611cc657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611cf957600080fd5b505af1158015611d0d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d727f00000000000000000000000000000000000000000000000000000000000000008989600081811061169657fe5b84600081518110611d7f57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611dcd57600080fd5b505af1158015611de1573d6000803e3d6000fd5b505050506040513d6020811015611df757600080fd5b5051611dff57fe5b611e3e8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061360a915050565b5095945050505050565b6000610dbe848484613cad565b60608142811015611e9b576040805162461bcd60e51b815260206004820181905260248201526000805160206148e0833981519152604482015290519081900360640190fd5b611ef97f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384792505050565b91508682600081518110611f0957fe5b6020026020010151111561131b5760405162461bcd60e51b81526004018080602001828103825260418152602001806149006041913960600191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe848484613d85565b60008142811015611fc5576040805162461bcd60e51b815260206004820181905260248201526000805160206148e0833981519152604482015290519081900360640190fd5b611ff4887f000000000000000000000000000000000000000000000000000000000000000089898930896124af565b90508092505061207d88858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561204c57600080fd5b505afa158015612060573d6000803e3d6000fd5b505050506040513d602081101561207657600080fd5b5051612f93565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120e357600080fd5b505af11580156120f7573d6000803e3d6000fd5b505050506110e484836130e7565b8042811015612149576040805162461bcd60e51b815260206004820181905260248201526000805160206148e0833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061218057fe5b905060200201356001600160a01b03166001600160a01b0316146121d55760405162461bcd60e51b81526004018080602001828103825260518152602001806148016051913960600191505060405180910390fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561223557600080fd5b505af1158015612249573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122ae7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169657fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156122f557600080fd5b505af1158015612309573d6000803e3d6000fd5b505050506040513d602081101561231f57600080fd5b505161232757fe5b60008686600019810181811061233957fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561239557600080fd5b505afa1580156123a9573d6000803e3d6000fd5b505050506040513d60208110156123bf57600080fd5b505160408051602089810282810182019093528982529293506124019290918a918a918291850190849080828437600092019190915250899250613969915050565b87612472828989600019810181811061241657fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180457600080fd5b10156118735760405162461bcd60e51b815260040180806020018281038252605f815260200180614585605f913960600191505060405180910390fd5b60008082428110156124f6576040805162461bcd60e51b815260206004820181905260248201526000805160206148e0833981519152604482015290519081900360640190fd5b60006125237f00000000000000000000000000000000000000000000000000000000000000008c8c6133ed565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561257e57600080fd5b505af1158015612592573d6000803e3d6000fd5b505050506040513d60208110156125a857600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156125f557600080fd5b505af1158015612609573d6000803e3d6000fd5b505050506040513d604081101561261f57600080fd5b508051602090910151909250905060006126398e8e613e2b565b509050806001600160a01b03168e6001600160a01b03161461265c57818361265f565b82825b90975095508a8710156126a35760405162461bcd60e51b81526004018080602001828103825260378152602001806144a76037913960400191505060405180910390fd5b898610156126e25760405162461bcd60e51b81526004018080602001828103825260378152602001806145e46037913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606061111c7f000000000000000000000000000000000000000000000000000000000000000084846132b7565b60008060006127947f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006133ed565b90506000876127a3578c6127a7565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561281d57600080fd5b505af1158015612831573d6000803e3d6000fd5b505050506128438e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b600080600083428110156128a1576040805162461bcd60e51b815260206004820181905260248201526000805160206148e0833981519152604482015290519081900360640190fd5b6128af8c8c8c8c8c8c613ef3565b909450925060006128e17f00000000000000000000000000000000000000000000000000000000000000008e8e6133ed565b90506128ef8d3383886134ad565b6128fb8c3383876134ad565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561294a57600080fd5b505af115801561295e573d6000803e3d6000fd5b505050506040513d602081101561297457600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156129d4576040805162461bcd60e51b815260206004820181905260248201526000805160206148e0833981519152604482015290519081900360640190fd5b612a028a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613ef3565b90945092506000612a547f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006133ed565b9050612a628b3383886134ad565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612abd57600080fd5b505af1158015612ad1573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b4d57600080fd5b505af1158015612b61573d6000803e3d6000fd5b505050506040513d6020811015612b7757600080fd5b5051612b7f57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612bce57600080fd5b505af1158015612be2573d6000803e3d6000fd5b505050506040513d6020811015612bf857600080fd5b5051925034841015612c1057612c10338534036130e7565b505096509650969350505050565b60608142811015612c64576040805162461bcd60e51b815260206004820181905260248201526000805160206148e0833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612c9b57fe5b905060200201356001600160a01b03166001600160a01b031614612cf05760405162461bcd60e51b81526004018080602001828103825260348152602001806144736034913960400191505060405180910390fd5b612d4e7f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384792505050565b91503482600081518110612d5e57fe5b60200260200101511115612da35760405162461bcd60e51b815260040180806020018281038252603e815260200180614941603e913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612ddf57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e1257600080fd5b505af1158015612e26573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612e8b7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169657fe5b84600081518110612e9857fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ee657600080fd5b505af1158015612efa573d6000803e3d6000fd5b505050506040513d6020811015612f1057600080fd5b5051612f1857fe5b612f578287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061360a915050565b81600081518110612f6457fe5b6020026020010151341115611e3e57611e3e3383600081518110612f8457fe5b602002602001015134036130e7565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106130105780518252601f199092019160209182019101612ff1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613072576040519150601f19603f3d011682016040523d82523d6000602084013e613077565b606091505b50915091508180156130a55750805115806130a557508080602001905160208110156130a257600080fd5b50515b6130e05760405162461bcd60e51b815260040180806020018281038252602d8152602001806148b3602d913960400191505060405180910390fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131335780518252601f199092019160209182019101613114565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613195576040519150601f19603f3d011682016040523d82523d6000602084013e61319a565b606091505b50509050806131da5760405162461bcd60e51b8152600401808060200182810382526034815260200180614a446034913960400191505060405180910390fd5b505050565b600080841161321f5760405162461bcd60e51b81526004018080602001828103825260398152602001806143726039913960400191505060405180910390fd5b60008311801561322f5750600082115b61326a5760405162461bcd60e51b81526004018080602001828103825260368152602001806142e46036913960400191505060405180910390fd5b6000613278856126f7614184565b905060006132868285614184565b905060006132a08361329a88612710614184565b906141da565b90508082816132ab57fe5b04979650505050505050565b60606002825110156132fa5760405162461bcd60e51b815260040180806020018281038252602d8152602001806149ed602d913960400191505060405180910390fd5b815167ffffffffffffffff8111801561331257600080fd5b5060405190808252806020026020018201604052801561333c578160200160208202803683370190505b509050828160008151811061334d57fe5b60200260200101818152505060005b60018351038110156133e55760008061339f8786858151811061337b57fe5b602002602001015187866001018151811061339257fe5b602002602001015161421c565b915091506133c18484815181106133b257fe5b602002602001015183836131df565b8484600101815181106133d057fe5b6020908102919091010152505060010161335c565b509392505050565b60008060006133fc8585613e2b565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527fd186cd0235b0839707c25b5e4a518a7e67159a1c74f36680d920c0d82097db36609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106135325780518252601f199092019160209182019101613513565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613594576040519150601f19603f3d011682016040523d82523d6000602084013e613599565b606091505b50915091508180156135c75750805115806135c757508080602001905160208110156135c457600080fd5b50515b6136025760405162461bcd60e51b81526004018080602001828103825260368152602001806147cb6036913960400191505060405180910390fd5b505050505050565b60005b60018351038110156138415760008084838151811061362857fe5b602002602001015185846001018151811061363f57fe5b60200260200101519150915060006136578383613e2b565b509050600087856001018151811061366b57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146136995782600061369d565b6000835b91509150600060028a510388106136b457886136f5565b6136f57f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106136e857fe5b60200260200101516133ed565b90506137227f000000000000000000000000000000000000000000000000000000000000000088886133ed565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f19166020018201604052801561375f576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156137c75781810151838201526020016137af565b50505050905090810190601f1680156137f45780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561381657600080fd5b505af115801561382a573d6000803e3d6000fd5b50506001909901985061360d975050505050505050565b50505050565b606060028251101561388a5760405162461bcd60e51b815260040180806020018281038252602c81526020018061431a602c913960400191505060405180910390fd5b815167ffffffffffffffff811180156138a257600080fd5b506040519080825280602002602001820160405280156138cc578160200160208202803683370190505b50905082816001835103815181106138e057fe5b60209081029190910101528151600019015b80156133e5576000806139228786600186038151811061390e57fe5b602002602001015187868151811061339257fe5b9150915061394484848151811061393557fe5b60200260200101518383613cad565b84600185038151811061395357fe5b60209081029190910101525050600019016138f2565b60005b60018351038110156131da5760008084838151811061398757fe5b602002602001015185846001018151811061399e57fe5b60200260200101519150915060006139b68383613e2b565b50905060006139e67f000000000000000000000000000000000000000000000000000000000000000085856133ed565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613a2757600080fd5b505afa158015613a3b573d6000803e3d6000fd5b505050506040513d6060811015613a5157600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613a87578284613a8a565b83835b91509150613adf828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180457600080fd5b9550613aec8683836131df565b945050505050600080856001600160a01b0316886001600160a01b031614613b1657826000613b1a565b6000835b91509150600060028c51038a10613b31578a613b65565b613b657f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106136e857fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613bef578181015183820152602001613bd7565b50505050905090810190601f168015613c1c5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613c3e57600080fd5b505af1158015613c52573d6000803e3d6000fd5b50506001909b019a5061396c9950505050505050505050565b8082038281111561111f5760405162461bcd60e51b815260040180806020018281038252602d815260200180614886602d913960400191505060405180910390fd5b6000808411613ced5760405162461bcd60e51b815260040180806020018281038252603981526020018061497f6039913960400191505060405180910390fd5b600083118015613cfd5750600082115b613d385760405162461bcd60e51b81526004018080602001828103825260358152602001806149b86035913960400191505060405180910390fd5b6000613d50612710613d4a8688614184565b90614184565b90506000613d646126f7613d4a8689613c6b565b9050613d7b6001828481613d7457fe5b04906141da565b9695505050505050565b6000808411613dc55760405162461bcd60e51b815260040180806020018281038252602c81526020018061476b602c913960400191505060405180910390fd5b600083118015613dd55750600082115b613e105760405162461bcd60e51b815260040180806020018281038252602f8152602001806146a6602f913960400191505060405180910390fd5b82613e1b8584614184565b81613e2257fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613e7f5760405162461bcd60e51b81526004018080602001828103825260318152602001806144de6031913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613e9f578284613ea2565b83835b90925090506001600160a01b038216613eec5760405162461bcd60e51b815260040180806020018281038252602a815260200180614a1a602a913960400191505060405180910390fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015613f7f57600080fd5b505afa158015613f93573d6000803e3d6000fd5b505050506040513d6020811015613fa957600080fd5b50516001600160a01b03161415614067577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b15801561403a57600080fd5b505af115801561404e573d6000803e3d6000fd5b505050506040513d602081101561406457600080fd5b50505b6000806140957f00000000000000000000000000000000000000000000000000000000000000008b8b61421c565b915091508160001480156140a7575080155b156140b757879350869250614177565b60006140c4898484613d85565b9050878111614117578581101561410c5760405162461bcd60e51b815260040180806020018281038252603581526020018061443e6035913960400191505060405180910390fd5b889450925082614175565b6000614124898486613d85565b90508981111561413057fe5b8781101561416f5760405162461bcd60e51b815260040180806020018281038252603581526020018061450f6035913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b600081158061419f5750508082028282828161419c57fe5b04145b61111f5760405162461bcd60e51b815260040180806020018281038252602c81526020018061467a602c913960400191505060405180910390fd5b8082018281101561111f5760405162461bcd60e51b815260040180806020018281038252602c815260200180614346602c913960400191505060405180910390fd5b600080600061422b8585613e2b565b50905060008061423c8888886133ed565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561427457600080fd5b505afa158015614288573d6000803e3d6000fd5b505050506040513d606081101561429e57600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b03878116908416146142d15780826142d4565b81815b9099909850965050505050505056fe4c61747465537761704c6962726172793a3a676574416d6f756e744f75743a3a494e53554646494349454e545f4c49515549444954594c61747465537761704c6962726172793a3a676574416d6f756e7473496e3a3a494e56414c49445f504154484c6174746553776170536166654d6174683a3a6164643a3a64732d6d6174682d6164642d6f766572666c6f774c61747465537761704c6962726172793a3a676574416d6f756e744f75743a3a494e53554646494349454e545f494e5055545f414d4f554e544c6174746553776170526f757465723a3a737761704578616374455448466f72546f6b656e733a3a494e53554646494349454e545f4f55545055545f414d4f554e544c6174746553776170526f757465723a3a737761704578616374546f6b656e73466f72455448537570706f7274696e674665654f6e5472616e73666572546f6b656e733a3a494e56414c49445f504154484c6174746553776170526f757465723a3a5f6164644c69717569646974793a3a494e53554646494349454e545f425f414d4f554e544c6174746553776170526f757465723a3a73776170455448466f724578616374546f6b656e733a3a494e56414c49445f504154484c6174746553776170526f757465723a3a72656d6f76654c69717569646974793a3a494e53554646494349454e545f415f414d4f554e544c61747465537761704c6962726172793a3a736f7274546f6b656e733a3a4944454e544943414c5f4144445245535345534c6174746553776170526f757465723a3a5f6164644c69717569646974793a3a494e53554646494349454e545f415f414d4f554e544c6174746553776170526f757465723a737761704578616374546f6b656e73466f724554483a3a494e53554646494349454e545f4f55545055545f414d4f554e544c6174746553776170526f757465723a3a737761704578616374455448466f72546f6b656e73537570706f7274696e674665654f6e5472616e73666572546f6b656e733a3a494e53554646494349454e545f4f55545055545f414d4f554e544c6174746553776170526f757465723a3a72656d6f76654c69717569646974793a3a494e53554646494349454e545f425f414d4f554e544c6174746553776170526f757465723a3a737761704578616374546f6b656e73466f72455448537570706f7274696e674665654f6e5472616e73666572546f6b656e733a3a494e53554646494349454e545f4f55545055545f414d4f554e544c6174746553776170536166654d6174683a3a6d756c3a3a64732d6d6174682d6d756c2d6f766572666c6f774c61747465537761704c6962726172793a3a71756f74653a3a494e53554646494349454e545f4c49515549444954594c6174746553776170526f757465723a3a737761704578616374546f6b656e73466f72546f6b656e73537570706f7274696e674665654f6e5472616e73666572546f6b656e733a3a494e53554646494349454e545f4f55545055545f414d4f554e544c6174746553776170526f757465723a3a73776170546f6b656e73466f7245786163744554483a3a494e56414c49445f504154484c61747465537761704c6962726172793a3a71756f74653a3a494e53554646494349454e545f414d4f554e544c6174746553776170526f757465723a3a737761704578616374455448466f72546f6b656e733a3a494e56414c49445f504154485472616e7366657248656c7065723a3a736166655472616e7366657246726f6d3a3a5452414e534645525f46524f4d5f4641494c45444c6174746553776170526f757465723a3a737761704578616374455448466f72546f6b656e73537570706f7274696e674665654f6e5472616e73666572546f6b656e733a3a494e56414c49445f504154484c6174746553776170526f757465723a3a737761704578616374546f6b656e73466f724554483a3a494e56414c49445f504154484c6174746553776170536166654d6174683a3a7375623a3a64732d6d6174682d7375622d756e646572666c6f775472616e7366657248656c7065723a3a736166655472616e736665723a3a5452414e534645525f4641494c45444c6174746553776170526f757465723a3a656e737572653a3a455850495245444c6174746553776170526f757465723a3a73776170546f6b656e73466f724578616374546f6b656e733a3a4558434553534956455f494e5055545f414d4f554e544c6174746553776170526f757465723a3a73776170455448466f724578616374546f6b656e733a3a4558434553534956455f494e5055545f414d4f554e544c61747465537761704c6962726172793a3a676574416d6f756e74496e3a3a494e53554646494349454e545f4f55545055545f414d4f554e544c61747465537761704c6962726172793a3a676574416d6f756e74496e3a3a494e53554646494349454e545f4c49515549444954594c61747465537761704c6962726172793a3a676574416d6f756e74734f75743a3a494e56414c49445f504154484c61747465537761704c6962726172793a3a736f7274546f6b656e733a3a5a45524f5f414444524553535472616e7366657248656c7065723a3a736166655472616e736665724554483a3a424e425f5452414e534645525f4641494c45444c6174746553776170526f757465723a3a737761704578616374546f6b656e73466f72546f6b656e733a3a494e53554646494349454e545f4f55545055545f414d4f554e544c6174746553776170526f757465723a3a73776170546f6b656e73466f7245786163744554483a3a4558434553534956455f494e5055545f414d4f554e54a26469706673582212206cbf02eec9a21c30597de3f335215a9ffdf1bfa835db9e5810c72f346f351a0864736f6c634300060c00330000000000000000000000004dce5bdb81b8d5edb66ca1b8b2616a8e0dd5f807000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

0000000000000000000000004dce5bdb81b8d5edb66ca1b8b2616a8e0dd5f807000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Decoded View---------------
Arg [0] : _factory (address): 0x4dce5bdb81b8d5edb66ca1b8b2616a8e0dd5f807
Arg [1] : _WBNB (address): 0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000004dce5bdb81b8d5edb66ca1b8b2616a8e0dd5f807
Arg [1] : 000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c


Deployed ByteCode Sourcemap

283:17761:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;731:10;-1:-1:-1;;;;;745:4:6;731:18;;724:26;;;;283:17761;;;;;4641:581;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4641:581:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17113:234;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17113:234:6;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;11444:867;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11444:867:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11444:867:6;;;;;;;;;;;;-1:-1:-1;11444:867:6;-1:-1:-1;;;;;;11444:867:6;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17817:225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17817:225:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17817:225:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17817:225:6;;-1:-1:-1;17817:225:6;;-1:-1:-1;;;;;17817:225:6:i;5226:647::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5226:647:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;8662:639::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8662:639:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8662:639:6;;;;;;;;;;;;-1:-1:-1;8662:639:6;-1:-1:-1;;;;;;8662:639:6;;;;;;;;:::i;10612:828::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10612:828:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10612:828:6;;;;;;;;;;;;-1:-1:-1;10612:828:6;-1:-1:-1;;;;;;10612:828:6;;;;;;;;:::i;7163:708::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7163:708:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14420:705::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14420:705:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14420:705:6;;;;;;;;;;;;-1:-1:-1;14420:705:6;-1:-1:-1;;;;;;14420:705:6;;;;;;;;:::i;15989:873::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15989:873:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15989:873:6;;;;;;;;;;;;-1:-1:-1;15989:873:6;-1:-1:-1;;;;;;15989:873:6;;;;;;;;:::i;9908:700::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9908:700:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9908:700:6;;;;;;;;;;;;-1:-1:-1;9908:700:6;-1:-1:-1;;;;;;9908:700:6;;;;;;;;:::i;17351:233::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17351:233:6;;;;;;;;;;;;:::i;9305:599::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9305:599:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9305:599:6;;;;;;;;;;;;-1:-1:-1;9305:599:6;-1:-1:-1;;;;;;9305:599:6;;;;;;;;:::i;417:38::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;417:38:6;;;;;;;;;;;;;;16899:210;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16899:210:6;;;;;;;;;;;;:::i;6593:566::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6593:566:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15129:856::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15129:856:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15129:856:6;;;;;;;;;;;;-1:-1:-1;15129:856:6;-1:-1:-1;;;;;;15129:856:6;;;;;;;;:::i;3789:848::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3789:848:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;372:41::-;;;;;;;;;;;;;:::i;17588:225::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17588:225:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17588:225:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17588:225:6;;-1:-1:-1;17588:225:6;;-1:-1:-1;;;;;17588:225:6:i;5877:644::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5877:644:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2130:737::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2130:737:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;2871:882;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2871:882:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12315:785::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12315:785:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12315:785:6;;;;;;;;;;;;-1:-1:-1;12315:785:6;-1:-1:-1;;;;;;12315:785:6;;;;;;;;:::i;4641:581::-;4857:19;4878:17;4838:8;520:15;508:8;:27;;500:72;;;;;-1:-1:-1;;;500:72:6;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;500:72:6;;;;;;;;;;;;;;;4930:142:::1;4953:5;4966:4;4978:9;4995:14;5017:12;5045:4;5058:8;4930:15;:142::i;:::-;4903:169:::0;;-1:-1:-1;4903:169:6;-1:-1:-1;5078:51:6::1;5106:5:::0;5113:2;4903:169;5078:27:::1;:51::i;:::-;5141:4;-1:-1:-1::0;;;;;5135:20:6::1;;5156:9;5135:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;5172:45;5203:2;5207:9;5172:30;:45::i;:::-;4641:581:::0;;;;;;;;;;:::o;17113:234::-;17248:17;17280:62;17310:8;17320:9;17331:10;17280:29;:62::i;:::-;17273:69;17113:234;-1:-1:-1;;;;17113:234:6:o;11444:867::-;11646:24;11627:8;520:15;508:8;:27;;500:72;;;;;-1:-1:-1;;;500:72:6;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;500:72:6;;;;;;;;;;;;;;;-1:-1:-1;;;;;11711:4:6::1;11686:29;:4:::0;;-1:-1:-1;;11691:15:6;;11686:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;11686:21:6::1;-1:-1:-1::0;;;;;11686:29:6::1;;11678:94;;;;-1:-1:-1::0;;;11678:94:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11788:55;11819:7;11828:8;11838:4;;11788:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;11788:30:6::1;::::0;-1:-1:-1;;;11788:55:6:i:1;:::-;11778:65;;11895:12;11864:7;11889:1;11872:7;:14;:18;11864:27;;;;;;;;;;;;;;:43;;11849:139;;;;-1:-1:-1::0;;;11849:139:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11994:147;12033:4;;12038:1;12033:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;12033:7:6::1;12048:10;12066:51;12091:7;12100:4;;12105:1;12100:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;12100:7:6::1;12109:4;;12114:1;12109:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;12109:7:6::1;12066:24;:51::i;:::-;12125:7;12133:1;12125:10;;;;;;;;;;;;;;11994:31;:147::i;:::-;12147:35;12153:7;12162:4;;12147:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;12176:4:6::1;::::0;-1:-1:-1;12147:5:6::1;::::0;-1:-1:-1;;12147:35:6:i:1;:::-;12194:4;-1:-1:-1::0;;;;;12188:20:6::1;;12209:7;12234:1;12217:7;:14;:18;12209:27;;;;;;;;;;;;;;12188:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;12243:63;12274:2;12278:7;12303:1;12286:7;:14;:18;12278:27;;;;;;;;;;;;;;12243:30;:63::i;:::-;11444:867:::0;;;;;;;;;:::o;17817:225::-;17941:24;17982:55;18012:7;18021:9;18032:4;17982:29;:55::i;:::-;17975:62;;17817:225;;;;;:::o;5226:647::-;5513:15;5530;5553:12;5568:49;5593:7;5602:6;5610;5568:24;:49::i;:::-;5553:64;;5623:13;5639:10;:36;;5666:9;5639:36;;;-1:-1:-1;;5639:36:6;5681:80;;;-1:-1:-1;;;5681:80:6;;5709:10;5681:80;;;;5729:4;5681:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5623:52;;-1:-1:-1;;;;;;5681:27:6;;;;;:80;;;;;-1:-1:-1;;5681:80:6;;;;;;;;-1:-1:-1;5681:27:6;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5788;5804:6;5812;5820:9;5831:10;5843;5855:2;5859:8;5788:15;:80::i;:::-;5767:101;;;;;;;;5226:647;;;;;;;;;;;;;;;;:::o;8662:639::-;8867:24;8848:8;520:15;508:8;:27;;500:72;;;;;-1:-1:-1;;;500:72:6;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;500:72:6;;;;;;;;;;;;;;;8909:55:::1;8940:7;8949:8;8959:4;;8909:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;8909:30:6::1;::::0;-1:-1:-1;;;8909:55:6:i:1;:::-;8899:65;;9016:12;8985:7;9010:1;8993:7;:14;:18;8985:27;;;;;;;;;;;;;;:43;;8970:143;;;;-1:-1:-1::0;;;8970:143:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9119:147;9158:4;;9163:1;9158:7;;;;;;9119:147;9272:24;9278:7;9287:4;;9272:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;9293:2:6;;-1:-1:-1;9272:5:6::1;::::0;-1:-1:-1;;9272:24:6:i:1;10612:828::-:0;10814:24;10795:8;520:15;508:8;:27;;500:72;;;;;-1:-1:-1;;;500:72:6;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;500:72:6;;;;;;;;;;;;;;;-1:-1:-1;;;;;10879:4:6::1;10854:29;:4:::0;;-1:-1:-1;;10859:15:6;;10854:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;10854:21:6::1;-1:-1:-1::0;;;;;10854:29:6::1;;10846:94;;;;-1:-1:-1::0;;;10846:94:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10956:55;10986:7;10995:9;11006:4;;10956:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;10956:29:6::1;::::0;-1:-1:-1;;;10956:55:6:i:1;:::-;10946:65;;11039:11;11025:7;11033:1;11025:10;;;;;;;;;;;;;;:25;;11017:100;;;;-1:-1:-1::0;;;11017:100:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7163:708:::0;7467:17;7492:12;7507:46;7532:7;7541:5;7548:4;7507:24;:46::i;:::-;7492:61;;7559:13;7575:10;:36;;7602:9;7575:36;;;-1:-1:-1;;7575:36:6;7617:80;;;-1:-1:-1;;;7617:80:6;;7645:10;7617:80;;;;7665:4;7617:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7559:52;;-1:-1:-1;;;;;;7617:27:6;;;;;:80;;;;;-1:-1:-1;;7617:80:6;;;;;;;;-1:-1:-1;7617:27:6;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7715:151;7770:5;7783:9;7800:14;7822:12;7842:2;7852:8;7715:47;:151::i;:::-;7703:163;7163:708;-1:-1:-1;;;;;;;;;;;;;7163:708:6:o;14420:705::-;14635:8;520:15;508:8;:27;;500:72;;;;;-1:-1:-1;;;500:72:6;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;500:72:6;;;;;;;;;;;;;;;14651:115:::1;14683:4;;14688:1;14683:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;14683:7:6::1;14692:10;14704:51;14729:7;14738:4;;14743:1;14738:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;14738:7:6::1;14747:4;;14752:1;14747:7;;;;;;14704:51;14757:8;14651:31;:115::i;:::-;14772:21;14812:4:::0;;-1:-1:-1;;14817:15:6;;14812:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;14812:21:6::1;-1:-1:-1::0;;;;;14796:48:6::1;;14845:2;14796:52;;;;;;;;;;;;;-1:-1:-1::0;;;;;14796:52:6::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;14796:52:6;14854:44:::1;::::0;;14796:52:::1;14854:44:::0;;::::1;::::0;;;;;;;;;;;14796:52;;-1:-1:-1;14854:44:6::1;::::0;;;14889:4;;;;;;14854:44;::::1;::::0;14889:4;;14854:44;14889:4;14854:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;14895:2:6;;-1:-1:-1;14854:34:6::1;::::0;-1:-1:-1;;14854:44:6:i:1;:::-;14994:12:::0;14919:71:::1;14976:13:::0;14935:4;;-1:-1:-1;;14940:15:6;;14935:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;14935:21:6::1;-1:-1:-1::0;;;;;14919:48:6::1;;14968:2;14919:52;;;;;;;;;;;;;-1:-1:-1::0;;;;;14919:52:6::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;14919:52:6;;:56:::1;:71::i;:::-;:87;;14904:216;;;;-1:-1:-1::0;;;14904:216:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;578:1;14420:705:::0;;;;;;;:::o;15989:873::-;16201:8;520:15;508:8;:27;;500:72;;;;;-1:-1:-1;;;500:72:6;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;500:72:6;;;;;;;;;;;;;;;-1:-1:-1;;;;;16257:4:6::1;16232:29;:4:::0;;-1:-1:-1;;16237:15:6;;16232:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;16232:21:6::1;-1:-1:-1::0;;;;;16232:29:6::1;;16217:141;;;;-1:-1:-1::0;;;16217:141:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16364:115;16396:4;;16401:1;16396:7;;;;;;16364:115;16485:55;16520:4;;16485:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;16534:4:6::1;::::0;-1:-1:-1;16485:34:6::1;::::0;-1:-1:-1;;16485:55:6:i:1;:::-;16546:17;16582:4;-1:-1:-1::0;;;;;16566:31:6::1;;16606:4;16566:46;;;;;;;;;;;;;-1:-1:-1::0;;;;;16566:46:6::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;16566:46:6;;-1:-1:-1;16633:25:6;;::::1;;16618:151;;;;-1:-1:-1::0;;;16618:151:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16781:4;-1:-1:-1::0;;;;;16775:20:6::1;;16796:9;16775:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16812:45;16843:2;16847:9;16812:30;:45::i;9908:700::-:0;10096:24;10077:8;520:15;508:8;:27;;500:72;;;;;-1:-1:-1;;;500:72:6;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;500:72:6;;;;;;;;;;;;;;;10147:4:::1;-1:-1:-1::0;;;;;10136:15:6::1;:4;;10141:1;10136:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;10136:7:6::1;-1:-1:-1::0;;;;;10136:15:6::1;;10128:80;;;;-1:-1:-1::0;;;10128:80:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10224:56;10255:7;10264:9;10275:4;;10224:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;10224:30:6::1;::::0;-1:-1:-1;;;10224:56:6:i:1;:::-;10214:66;;10332:12;10301:7;10326:1;10309:7;:14;:18;10301:27;;;;;;;;;;;;;;:43;;10286:140;;;;-1:-1:-1::0;;;10286:140:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10438:4;-1:-1:-1::0;;;;;10432:19:6::1;;10460:7;10468:1;10460:10;;;;;;;;;;;;;;10432:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;10493:4;-1:-1:-1::0;;;;;10487:20:6::1;;10508:51;10533:7;10542:4;;10547:1;10542:7;;;;;;10508:51;10561:7;10569:1;10561:10;;;;;;;;;;;;;;10487:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;10487:85:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;10487:85:6;10480:93:::1;;;;10579:24;10585:7;10594:4;;10579:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;10600:2:6;;-1:-1:-1;10579:5:6::1;::::0;-1:-1:-1;;10579:24:6:i:1;:::-;9908:700:::0;;;;;;;;:::o;17351:233::-;17486:16;17517:62;17546:9;17557;17568:10;17517:28;:62::i;9305:599::-;9510:24;9491:8;520:15;508:8;:27;;500:72;;;;;-1:-1:-1;;;500:72:6;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;500:72:6;;;;;;;;;;;;;;;9552:55:::1;9582:7;9591:9;9602:4;;9552:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;9552:29:6::1;::::0;-1:-1:-1;;;9552:55:6:i:1;:::-;9542:65;;9635:11;9621:7;9629:1;9621:10;;;;;;;;;;;;;;:25;;9613:103;;;;-1:-1:-1::0;;;9613:103:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;417:38:::0;;;:::o;16899:210::-;17023:15;17053:51;17076:7;17085:8;17095;17053:22;:51::i;6593:566::-;6838:17;6819:8;520:15;508:8;:27;;500:72;;;;;-1:-1:-1;;;500:72:6;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;500:72:6;;;;;;;;;;;;;;;6879:94:::1;6895:5;6902:4;6908:9;6919:14;6935:12;6957:4;6964:8;6879:15;:94::i;:::-;6863:110;;;;;;6979:87;7007:5;7014:2;7034:5;-1:-1:-1::0;;;;;7018:32:6::1;;7059:4;7018:47;;;;;;;;;;;;;-1:-1:-1::0;;;;;7018:47:6::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;7018:47:6;6979:27:::1;:87::i;:::-;7078:4;-1:-1:-1::0;;;;;7072:20:6::1;;7093:9;7072:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;7109:45;7140:2;7144:9;7109:30;:45::i;15129:856::-:0;15327:8;520:15;508:8;:27;;500:72;;;;;-1:-1:-1;;;500:72:6;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;500:72:6;;;;;;;;;;;;;;;15362:4:::1;-1:-1:-1::0;;;;;15351:15:6::1;:4;;15356:1;15351:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;15351:7:6::1;-1:-1:-1::0;;;;;15351:15:6::1;;15343:109;;;;-1:-1:-1::0;;;15343:109:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15458:16;15477:9;15458:28;;15498:4;-1:-1:-1::0;;;;;15492:19:6::1;;15520:8;15492:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;15551:4;-1:-1:-1::0;;;;;15545:20:6::1;;15566:51;15591:7;15600:4;;15605:1;15600:7;;;;;;15566:51;15619:8;15545:83;;;;;;;;;;;;;-1:-1:-1::0;;;;;15545:83:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;15545:83:6;15538:91:::1;;;;15635:21;15675:4:::0;;-1:-1:-1;;15680:15:6;;15675:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;15675:21:6::1;-1:-1:-1::0;;;;;15659:48:6::1;;15708:2;15659:52;;;;;;;;;;;;;-1:-1:-1::0;;;;;15659:52:6::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;15659:52:6;15717:44:::1;::::0;;15659:52:::1;15717:44:::0;;::::1;::::0;;;;;;;;;;;15659:52;;-1:-1:-1;15717:44:6::1;::::0;;;15752:4;;;;;;15717:44;::::1;::::0;15752:4;;15717:44;15752:4;15717:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;15758:2:6;;-1:-1:-1;15717:34:6::1;::::0;-1:-1:-1;;15717:44:6:i:1;:::-;15857:12:::0;15782:71:::1;15839:13:::0;15798:4;;-1:-1:-1;;15803:15:6;;15798:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;15798:21:6::1;-1:-1:-1::0;;;;;15782:48:6::1;;15831:2;15782:52;;;;;;;;;;;;;-1:-1:-1::0;;;;;15782:52:6::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;:71;:87;;15767:213;;;;-1:-1:-1::0;;;15767:213:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3789:848:::0;4017:15;4034;3998:8;520:15;508:8;:27;;500:72;;;;;-1:-1:-1;;;500:72:6;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;500:72:6;;;;;;;;;;;;;;;4057:12:::1;4072:49;4097:7;4106:6;4114;4072:24;:49::i;:::-;4127:62;::::0;;-1:-1:-1;;;4127:62:6;;4161:10:::1;4127:62;::::0;::::1;::::0;-1:-1:-1;;;;;4127:33:6;::::1;:62:::0;;;;;;;;;;;;;;4057:64;;-1:-1:-1;4127:33:6;;::::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;4127:33:6;:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;4258:29:6::1;::::0;;-1:-1:-1;;;4258:29:6;;-1:-1:-1;;;;;4258:29:6;;::::1;;::::0;::::1;::::0;;;4222:15:::1;::::0;;;4258:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;4222:15;4258:25;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;4258:29:6;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;4258:29:6;-1:-1:-1;4294:14:6::1;4314:43;4342:6:::0;4350;4314:27:::1;:43::i;:::-;4293:64;;;4394:6;-1:-1:-1::0;;;;;4384:16:6::1;:6;-1:-1:-1::0;;;;;4384:16:6::1;;:58;;4425:7;4434;4384:58;;;4404:7;4413;4384:58;4363:79:::0;;-1:-1:-1;4363:79:6;-1:-1:-1;4456:21:6;;::::1;;4448:89;;;;-1:-1:-1::0;;;4448:89:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4562:10;4551:7;:21;;4543:89;;;;-1:-1:-1::0;;;4543:89:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;578:1;;;;3789:848:::0;;;;;;;;;;;:::o;372:41::-;;;:::o;17588:225::-;17712:24;17753:55;17784:7;17793:8;17803:4;17753:30;:55::i;5877:644::-;6152:19;6173:17;6198:12;6213:46;6238:7;6247:5;6254:4;6213:24;:46::i;:::-;6198:61;;6265:13;6281:10;:36;;6308:9;6281:36;;;-1:-1:-1;;6281:36:6;6323:80;;;-1:-1:-1;;;6323:80:6;;6351:10;6323:80;;;;6371:4;6323:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6265:52;;-1:-1:-1;;;;;;6323:27:6;;;;;:80;;;;;-1:-1:-1;;6323:80:6;;;;;;;;-1:-1:-1;6323:27:6;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6436;6455:5;6462:9;6473:14;6489:12;6503:2;6507:8;6436:18;:80::i;:::-;6409:107;;;;-1:-1:-1;5877:644:6;-1:-1:-1;;;;;;;;;;;;;5877:644:6:o;2130:737::-;2417:15;2440;2463:17;2387:8;520:15;508:8;:27;;500:72;;;;;-1:-1:-1;;;500:72:6;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;500:72:6;;;;;;;;;;;;;;;2516:85:::1;2530:6;2538;2546:14;2562;2578:10;2590;2516:13;:85::i;:::-;2495:106:::0;;-1:-1:-1;2495:106:6;-1:-1:-1;2607:12:6::1;2622:49;2647:7;2656:6:::0;2664;2622:24:::1;:49::i;:::-;2607:64;;2677:66;2709:6;2717:10;2729:4;2735:7;2677:31;:66::i;:::-;2749;2781:6;2789:10;2801:4;2807:7;2749:31;:66::i;:::-;2848:4;-1:-1:-1::0;;;;;2833:25:6::1;;2859:2;2833:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;2833:29:6::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;2833:29:6;2130:737;;;;-1:-1:-1;2833:29:6;;-1:-1:-1;2130:737:6;;-1:-1:-1;;;;;;;;;2130:737:6:o;2871:882::-;3134:19;3161:17;3186;3104:8;520:15;508:8;:27;;500:72;;;;;-1:-1:-1;;;500:72:6;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;500:72:6;;;;;;;;;;;;;;;3245:87:::1;3259:5;3266:4;3272:18;3292:9;3303:14;3319:12;3245:13;:87::i;:::-;3218:114:::0;;-1:-1:-1;3218:114:6;-1:-1:-1;3338:12:6::1;3353:46;3378:7;3387:5:::0;3394:4:::1;3353:24;:46::i;:::-;3338:61;;3405:69;3437:5;3444:10;3456:4;3462:11;3405:31;:69::i;:::-;3486:4;-1:-1:-1::0;;;;;3480:19:6::1;;3508:9;3480:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;3540:4;-1:-1:-1::0;;;;;3534:20:6::1;;3555:4;3561:9;3534:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;3534:37:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;3534:37:6;3527:45:::1;;;;3605:4;-1:-1:-1::0;;;;;3590:25:6::1;;3616:2;3590:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;3590:29:6::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;3590:29:6;;-1:-1:-1;3660:9:6::1;:21:::0;-1:-1:-1;3656:92:6::1;;;3683:65;3714:10;3738:9;3726;:21;3683:30;:65::i;:::-;578:1;2871:882:::0;;;;;;;;;;;:::o;12315:785::-;12500:24;12481:8;520:15;508:8;:27;;500:72;;;;;-1:-1:-1;;;500:72:6;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;500:72:6;;;;;;;;;;;;;;;12551:4:::1;-1:-1:-1::0;;;;;12540:15:6::1;:4;;12545:1;12540:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;12540:7:6::1;-1:-1:-1::0;;;;;12540:15:6::1;;12532:80;;;;-1:-1:-1::0;;;12532:80:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12628:55;12658:7;12667:9;12678:4;;12628:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;12628:29:6::1;::::0;-1:-1:-1;;;12628:55:6:i:1;:::-;12618:65;;12711:9;12697:7;12705:1;12697:10;;;;;;;;;;;;;;:23;;12689:98;;;;-1:-1:-1::0;;;12689:98:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12799:4;-1:-1:-1::0;;;;;12793:19:6::1;;12821:7;12829:1;12821:10;;;;;;;;;;;;;;12793:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;12854:4;-1:-1:-1::0;;;;;12848:20:6::1;;12869:51;12894:7;12903:4;;12908:1;12903:7;;;;;;12869:51;12922:7;12930:1;12922:10;;;;;;;;;;;;;;12848:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;12848:85:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;12848:85:6;12841:93:::1;;;;12940:24;12946:7;12955:4;;12940:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;12961:2:6;;-1:-1:-1;12940:5:6::1;::::0;-1:-1:-1;;12940:24:6:i:1;:::-;13017:7;13025:1;13017:10;;;;;;;;;;;;;;13005:9;:22;13001:94;;;13029:66;13060:10;13084:7;13092:1;13084:10;;;;;;;;;;;;;;13072:9;:22;13029:30;:66::i;577:376:8:-:0;781:45;;;-1:-1:-1;;;;;781:45:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;781:45:8;-1:-1:-1;;;781:45:8;;;770:57;;;;735:12;;749:17;;770:10;;;;781:45;770:57;;;781:45;770:57;;781:45;770:57;;;;;;;;;;-1:-1:-1;;770:57:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;734:93;;;;841:7;:57;;;;-1:-1:-1;853:11:8;;:16;;:44;;;884:4;873:24;;;;;;;;;;;;;;;-1:-1:-1;873:24:8;853:44;833:115;;;;-1:-1:-1;;;833:115:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;577:376;;;;;:::o;1404:206::-;1514:12;;;1472;1514;;;;;;;;;-1:-1:-1;;;;;1490:7:8;;;1506:5;;1490:37;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1490:37:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1471:56;;;1541:7;1533:72;;;;-1:-1:-1;;;1533:72:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1404:206;;;:::o;2265:551:5:-;2383:17;2427:1;2416:8;:12;2408:82;;;;-1:-1:-1;;;2408:82:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2516:1;2504:9;:13;:31;;;;;2534:1;2521:10;:14;2504:31;2496:98;;;;-1:-1:-1;;;2496:98:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2600:23;2626:18;:8;2639:4;2626:12;:18::i;:::-;2600:44;-1:-1:-1;2650:17:5;2670:31;2600:44;2690:10;2670:19;:31::i;:::-;2650:51;-1:-1:-1;2707:19:5;2729:41;2754:15;2729:20;:9;2743:5;2729:13;:20::i;:::-;:24;;:41::i;:::-;2707:63;;2800:11;2788:9;:23;;;;;;;2265:551;-1:-1:-1;;;;;;;2265:551:5:o;3511:518::-;3631:24;3686:1;3671:4;:11;:16;;3663:74;;;;-1:-1:-1;;;3663:74:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3767:4;:11;3753:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3753:26:5;;3743:36;;3798:8;3785:7;3793:1;3785:10;;;;;;;;;;;;;:21;;;;;3817:9;3812:213;3846:1;3832:4;:11;:15;3828:1;:19;3812:213;;;3863:17;3882:18;3904:42;3916:7;3925:4;3930:1;3925:7;;;;;;;;;;;;;;3934:4;3939:1;3943;3939:5;3934:11;;;;;;;;;;;;;;3904;:42::i;:::-;3862:84;;;;3971:47;3984:7;3992:1;3984:10;;;;;;;;;;;;;;3996:9;4007:10;3971:12;:47::i;:::-;3954:7;3962:1;3966;3962:5;3954:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;3849:3:5;;3812:213;;;;3511:518;;;;;:::o;736:509::-;841:12;862:14;878;896:26;907:6;915;896:10;:26::i;:::-;1070:32;;;-1:-1:-1;;1070:32:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1060:43;;;;;;-1:-1:-1;;;;;;988:228:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;967:259;;;;;;;;;736:509;-1:-1:-1;;;;;736:509:5:o;957:443:8:-;1195:51;;;-1:-1:-1;;;;;1195:51:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1195:51:8;-1:-1:-1;;;1195:51:8;;;1184:63;;;;1149:12;;1163:17;;1184:10;;;;1195:51;1184:63;;;1195:51;1184:63;;1195:51;1184:63;;;;;;;;;;-1:-1:-1;;1184:63:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1148:99;;;;1268:7;:57;;;;-1:-1:-1;1280:11:8;;:16;;:44;;;1311:4;1300:24;;;;;;;;;;;;;;;-1:-1:-1;1300:24:8;1280:44;1253:142;;;;-1:-1:-1;;;1253:142:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;957:443;;;;;;:::o;7972:686:6:-;8093:9;8088:566;8122:1;8108:4;:11;:15;8104:1;:19;8088:566;;;8139:13;8154:14;8173:4;8178:1;8173:7;;;;;;;;;;;;;;8182:4;8187:1;8191;8187:5;8182:11;;;;;;;;;;;;;;8138:56;;;;8203:14;8223:42;8251:5;8258:6;8223:27;:42::i;:::-;8202:63;;;8273:17;8293:7;8301:1;8305;8301:5;8293:14;;;;;;;;;;;;;;8273:34;;8316:18;8336;8367:6;-1:-1:-1;;;;;8358:15:6;:5;-1:-1:-1;;;;;8358:15:6;;:67;;8403:9;8422:1;8358:67;;;8385:1;8389:9;8358:67;8315:110;;;;8433:10;8464:1;8450:4;:11;:15;8446:1;:19;:82;;8525:3;8446:82;;;8468:54;8493:7;8502:6;8510:4;8515:1;8519;8515:5;8510:11;;;;;;;;;;;;;;8468:24;:54::i;:::-;8433:95;;8551:48;8576:7;8585:5;8592:6;8551:24;:48::i;:::-;-1:-1:-1;;;;;8536:69:6;;8606:10;8618;8630:2;8644:1;8634:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8634:12:6;;8536:111;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8536:111:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8125:3:6;;;;;-1:-1:-1;8088:566:6;;-1:-1:-1;;;;;;;;8088:566:6;;;7972:686;;;:::o;4103:538:5:-;4223:24;4278:1;4263:4;:11;:16;;4255:73;;;;-1:-1:-1;;;4255:73:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4358:4;:11;4344:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4344:26:5;;4334:36;;4406:9;4376:7;4401:1;4384:7;:14;:18;4376:27;;;;;;;;;;;;;;;;;:39;4438:11;;-1:-1:-1;;4438:15:5;4421:216;4455:5;;4421:216;;4476:17;4495:18;4517:42;4529:7;4538:4;4547:1;4543;:5;4538:11;;;;;;;;;;;;;;4551:4;4556:1;4551:7;;;;;;;4517:42;4475:84;;;;4584:46;4596:7;4604:1;4596:10;;;;;;;;;;;;;;4608:9;4619:10;4584:11;:46::i;:::-;4567:7;4579:1;4575;:5;4567:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;4462:3:5;4421:216;;13237:1179:6;13345:9;13340:1072;13374:1;13360:4;:11;:15;13356:1;:19;13340:1072;;;13391:13;13406:14;13425:4;13430:1;13425:7;;;;;;;;;;;;;;13434:4;13439:1;13443;13439:5;13434:11;;;;;;;;;;;;;;13390:56;;;;13455:14;13475:42;13503:5;13510:6;13475:27;:42::i;:::-;13454:63;;;13525:19;13562:48;13587:7;13596:5;13603:6;13562:24;:48::i;:::-;13525:86;;13619:19;13646:20;13733:16;13751;13773:4;-1:-1:-1;;;;;13773:16:6;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13773:18:6;;;;;;;-1:-1:-1;;;;;13732:59:6;;;;-1:-1:-1;13732:59:6;;-1:-1:-1;13802:20:6;;-1:-1:-1;;;;;13849:15:6;;;;;;;:61;;13891:8;13901;13849:61;;;13868:8;13878;13849:61;13801:109;;;;13934:65;13986:12;13950:5;-1:-1:-1;;;;;13934:32:6;;13975:4;13934:47;;;;;;;;;;;;;-1:-1:-1;;;;;13934:47:6;;;;;;;;;;;;;;;;;;;;;;;;;;:65;13920:79;;14024:71;14054:11;14067:12;14081:13;14024:29;:71::i;:::-;14009:86;;13340:1072;;;;14112:18;14132;14163:6;-1:-1:-1;;;;;14154:15:6;:5;-1:-1:-1;;;;;14154:15:6;;:89;;14218:12;14240:1;14154:89;;;14189:1;14193:12;14154:89;14111:132;;;;14251:10;14282:1;14268:4;:11;:15;14264:1;:19;:82;;14343:3;14264:82;;;14286:54;14311:7;14320:6;14328:4;14333:1;14337;14333:5;14328:11;;;;;;;14286:54;14392:12;;;14402:1;14392:12;;;;;;;;;;-1:-1:-1;;;14354:51:6;;;;;;;;;;;;;;-1:-1:-1;;;;;14354:51:6;;;;;;;;;;;;;;;;;;;;;;14251:95;;-1:-1:-1;14354:9:6;;;;;;14364:10;;14376;;14251:95;;14392:12;;14354:51;;;;;;;;14392:12;;14354:51;;;;14392:12;;14354:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13377:3:6;;;;;-1:-1:-1;13340:1072:6;;-1:-1:-1;;;;;;;;;;13340:1072:6;356:154:7;444:5;;;439:16;;;;431:74;;;;-1:-1:-1;;;431:74:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2930:506:5;3048:16;3092:1;3080:9;:13;3072:83;;;;-1:-1:-1;;;3072:83:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3181:1;3169:9;:13;:31;;;;;3199:1;3186:10;:14;3169:31;3161:97;;;;-1:-1:-1;;;3161:97:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3264:17;3284:35;3313:5;3284:24;:9;3298;3284:13;:24::i;:::-;:28;;:35::i;:::-;3264:55;-1:-1:-1;3325:19:5;3347:35;3377:4;3347:25;:10;3362:9;3347:14;:25::i;:35::-;3325:57;;3399:32;3429:1;3412:11;3400:9;:23;;;;;;;3399:29;:32::i;:::-;3388:43;2930:506;-1:-1:-1;;;;;;2930:506:5:o;1805:345::-;1912:15;1953:1;1943:7;:11;1935:68;;;;-1:-1:-1;;;1935:68:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2028:1;2017:8;:12;:28;;;;;2044:1;2033:8;:12;2017:28;2009:88;;;;-1:-1:-1;;;2009:88:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2137:8;2113:21;:7;2125:8;2113:11;:21::i;:::-;:32;;;;;;;1805:345;-1:-1:-1;;;;1805:345:5:o;296:355::-;371:14;387;427:6;-1:-1:-1;;;;;417:16:5;:6;-1:-1:-1;;;;;417:16:5;;;409:78;;;;-1:-1:-1;;;409:78:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;521:6;-1:-1:-1;;;;;512:15:5;:6;-1:-1:-1;;;;;512:15:5;;:53;;550:6;558;512:53;;;531:6;539;512:53;493:72;;-1:-1:-1;493:72:5;-1:-1:-1;;;;;;579:20:5;;571:75;;;;-1:-1:-1;;;571:75:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;296:355;;;;;:::o;843:1283:6:-;1040:15;1057;1193:1;-1:-1:-1;;;;;1131:64:6;1149:7;-1:-1:-1;;;;;1131:34:6;;1166:6;1174;1131:50;;;;;;;;;;;;;-1:-1:-1;;;;;1131:50:6;;;;;;-1:-1:-1;;;;;1131:50:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1131:50:6;-1:-1:-1;;;;;1131:64:6;;1127:138;;;1223:7;-1:-1:-1;;;;;1205:37:6;;1243:6;1251;1205:53;;;;;;;;;;;;;-1:-1:-1;;;;;1205:53:6;;;;;;-1:-1:-1;;;;;1205:53:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1127:138:6;1271:16;1289;1309:53;1338:7;1347:6;1355;1309:28;:53::i;:::-;1270:92;;;;1372:8;1384:1;1372:13;:30;;;;-1:-1:-1;1389:13:6;;1372:30;1368:754;;;1434:14;;-1:-1:-1;1450:14:6;;-1:-1:-1;1368:754:6;;;1486:22;1511:58;1534:14;1550:8;1560;1511:22;:58::i;:::-;1486:83;;1599:14;1581;:32;1577:539;;1651:10;1633:14;:28;;1625:94;;;;-1:-1:-1;;;1625:94:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1751:14;;-1:-1:-1;1767:14:6;-1:-1:-1;1767:14:6;1577:539;;;1807:22;1832:58;1855:14;1871:8;1881;1832:22;:58::i;:::-;1807:83;;1925:14;1907;:32;;1900:40;;;;1976:10;1958:14;:28;;1950:94;;;;-1:-1:-1;;;1950:94:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2076:14;-1:-1:-1;2092:14:6;;-1:-1:-1;1577:539:6;1368:754;;843:1283;;;;;;;;;;;:::o;514:167:7:-;572:9;597:6;;;:30;;-1:-1:-1;;612:5:7;;;626:1;621;612:5;621:1;607:15;;;;;:20;597:30;589:87;;;;-1:-1:-1;;;589:87:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;199:153;287:5;;;282:16;;;;274:73;;;;-1:-1:-1;;;274:73:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1296:403:5;1405:16;1423;1448:14;1468:26;1479:6;1487;1468:10;:26::i;:::-;1447:47;;;1501:16;1519;1556:32;1564:7;1573:6;1581;1556:7;:32::i;:::-;-1:-1:-1;;;;;1541:60:5;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1541:62:5;;;;;;;-1:-1:-1;;;;;1500:103:5;;;;-1:-1:-1;1500:103:5;;-1:-1:-1;;;;;;1632:16:5;;;;;;;:62;;1675:8;1685;1632:62;;;1652:8;1662;1632:62;1609:85;;;;-1:-1:-1;1296:403:5;-1:-1:-1;;;;;;;1296:403:5:o

Swarm Source

ipfs://6cbf02eec9a21c30597de3f335215a9ffdf1bfa835db9e5810c72f346f351a08
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
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.