Contract 0xc873fEcbd354f5A56E00E710B90EF4201db2448d 22

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x246a5ed5a794eae01c55ca335b5b9fc1dba1f391ef4f30d1ca35b2ffc60e972cSwap Exact Token...1862048042024-03-02 2:26:081 min ago0xe900fc0035f37ddc5d4681f6db9aa875f7581cd8 IN  Camelot: Router0 ETH0.00022972 0.1
0x691c8466eaadb5206a4180f8bacb614a84a294fc3e68eb770a57252375a311aeSwap Exact ETH F...1862046482024-03-02 2:25:262 mins ago0xe900fc0035f37ddc5d4681f6db9aa875f7581cd8 IN  Camelot: Router0.5 ETH0.00022316 0.1
0x3d78f996c524b684e2276e885e8977e31f2e5c4548b66e4f319b8d9c67412072Swap Exact Token...1862042582024-03-02 2:23:413 mins ago0xe9072625bb804fffe1e5838ac6d7907ed01e275a IN  Camelot: Router0 ETH0.00023223 0.1
0x0be332e42f47f512bd3e6431797c1ed1199f6359a7dde57b658348b784cac765Swap Exact Token...1862041162024-03-02 2:23:034 mins ago0xcc4f1cb6064a69ac83a5133ffcf09217ae33c2cf IN  Camelot: Router0 ETH0.000229920.1
0xcdd7fb3af31354499ff14e1da7ecd5f5d1f1a5d909ba6b3b2ec86e960f22df34Swap Exact Token...1862033542024-03-02 2:19:477 mins ago0x73bbbc23c78c52cd847074ef68a5cf4aad92f6a7 IN  Camelot: Router0 ETH0.00022311 0.1
0x1dcf06ec070b4888491e3504d2c203ab81cd8e32af27fa69947945bc45e456b3Swap Exact ETH F...1862023872024-03-02 2:15:2612 mins ago0xedd24a124e1afbdf13e9e9dd8ccfd867488b804a IN  Camelot: Router0.007 ETH0.00022594 0.1
0x583f5f8dadda318f2d313d21ae220be700250317cd3776285d97ba6c98d7f1d7Swap Exact Token...1862022602024-03-02 2:14:5312 mins ago0x1c1eb8ea2e464d4815fba5a833d3abb5d6e1aa49 IN  Camelot: Router0 ETH0.000227930.1
0x2380e4f75735ae7db19b031fd3e3e3bbce6ed8c546e41249e1d9a37942573374Swap Exact Token...1862014402024-03-02 2:11:1516 mins ago0x3e9f44209e3217a81f7913a6cd910b9a379a7895 IN  Camelot: Router0 ETH0.00022954 0.1
0xc95b85760df0c0e50b54728634cc3e759d7869a3b2ecbde5ff04f809a5b6d861Swap Exact Token...1862009142024-03-02 2:08:5218 mins ago0x4cb6f0ef0eeb503f8065af1a6e6d5dd46197d3d9 IN  Camelot: Router0 ETH0.00023088 0.1
0xa9858bb1c2fc97c95840a870b24d5c97529620d5c7e473077607a94be349748fSwap Exact Token...1862009132024-03-02 2:08:5218 mins ago0x622661ab4b6ab93c659e751f47ebb0c6e6ad9f48 IN  Camelot: Router0 ETH0.00025528 0.1
0x411768160f84a3633880d7249aa6c71376253b6d17be33ed6b253360595bbdfdSwap Exact Token...1862006362024-03-02 2:07:3719 mins ago0x4cb6f0ef0eeb503f8065af1a6e6d5dd46197d3d9 IN  Camelot: Router0 ETH0.00023371 0.1
0xd7630d393d62e6e3ca11fa0e778119cd941bf78fb28923e7d5e21bef74e0d747Swap Exact Token...1862006362024-03-02 2:07:3719 mins ago0x622661ab4b6ab93c659e751f47ebb0c6e6ad9f48 IN  Camelot: Router0 ETH0.00025359 0.1
0x87855ebbdbf0f55dfa00af04a39a09dfdf0cc2821cd19cc0382d141550717218Swap Exact Token...1862004802024-03-02 2:06:5620 mins ago0x4cb6f0ef0eeb503f8065af1a6e6d5dd46197d3d9 IN  Camelot: Router0 ETH0.00023342 0.1
0xf5861e825b6ef56843c4d8c6e3ead6d4925fd4f5ac13c93154e06cf07c6a287aSwap Exact Token...1862004782024-03-02 2:06:5520 mins ago0x4cb6f0ef0eeb503f8065af1a6e6d5dd46197d3d9 IN  Camelot: Router0 ETH0.00023201 0.1
0x31357f96742f17c01246a1e884ee2dd78fe50b5100c8cb22c7fdab5112c2591fSwap Exact Token...1862004782024-03-02 2:06:5520 mins ago0x622661ab4b6ab93c659e751f47ebb0c6e6ad9f48 IN  Camelot: Router0 ETH0.00025472 0.1
0x37d25ea32211242566b454a1bbad1eb325cd3dc61e201e2bea62321c8a99a677Swap Exact Token...1862002162024-03-02 2:05:4421 mins ago0x622661ab4b6ab93c659e751f47ebb0c6e6ad9f48 IN  Camelot: Router0 ETH0.00025641 0.1
0x3c920a3861ede5ee0e4ccbb96d07d824aaf94e65e3123bf0f5814b70b0dd316eSwap Exact Token...1862002162024-03-02 2:05:4421 mins ago0x4cb6f0ef0eeb503f8065af1a6e6d5dd46197d3d9 IN  Camelot: Router0 ETH0.00023258 0.1
0x03e9e5dc9bc25293c8db80fa9ceb67be8a884d0c2a300ec0c8cea6dd3f02502cSwap Exact Token...1862001182024-03-02 2:05:1922 mins ago0xb807552caa609e08634513f90c60f5aeaa8ebd83 IN  Camelot: Router0 ETH0.00021970.1
0x10e94a46a88dd329d6ff6554be2d375c53e8faf4ffe464612648d60e53c50f7eRemove Liquidity...1861997902024-03-02 2:03:5323 mins ago0xa96c1df041e4a43fd95487e6913626d7af3e752c IN  Camelot: Router0 ETH0.00026385 0.1
0xcdfbe46d2dffb163819b9dc92e88ba362ac01058afa60f6ebc386052f99e9819Swap Exact ETH F...1861996262024-03-02 2:03:1124 mins ago0xe134700115a63d264564e6417390ff73f5804ead IN  Camelot: Router0.000499 ETH0.000289940.1
0x25113961efe2b4125d066bf73669264e46c7f0cff4dbba12ee9a02b24a1af230Swap Exact Token...1861990232024-03-02 2:00:2926 mins ago0xecf4e16e2903c21e95dafe74e31682d1b8ffe111 IN  Camelot: Router0 ETH0.00022428 0.1
0x2afca624d52e0ed1e24e4e95e46d6154f08607aee34a6668743aea3d958ea43cSwap Exact Token...1861988842024-03-02 1:59:5127 mins ago0x92c3028eaaae46995889a14acdc1ba86774614f7 IN  Camelot: Router0 ETH0.00022223 0.1
0xb4a20c94eea9488b74551b2db22b92b54917f24dfdea2cdb23df83afa6cfffaaSwap Exact ETH F...1861984612024-03-02 1:57:5529 mins ago0x5f1f6c7ae6944ef82966365946c1eeb2ea7a9505 IN  Camelot: Router0.0000032 ETH0.000282440.1
0x6b7bd476dbe904be6b2a374565629496400a50b0381fb6386f7bd6723d44925fSwap Exact Token...1861980402024-03-02 1:56:0131 mins ago0xf60fd90fc72e1eb4d2054a24f5dcf7658f166eda IN  Camelot: Router0 ETH0.0003045 0.1
0x04148399155989edbee00d202728800ae29d5d9d5a8ce966c4b997910f368800Swap Exact Token...1861966572024-03-02 1:49:5137 mins ago0xbae3bad311a211dbc19c14a5d2995a9a4741abc7 IN  Camelot: Router0 ETH0.000297290.1
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x61e4aa9e2aeb158cfda2812cc0aa70c43ca8cee95c17b66bcbef37caa966a7401862050452024-03-02 2:27:1115 secs ago Camelot: Router Wrapped Ether0.000145 ETH
0x61e4aa9e2aeb158cfda2812cc0aa70c43ca8cee95c17b66bcbef37caa966a7401862050452024-03-02 2:27:1115 secs ago 0x5c5e68c363f3d711704916c76277bed679f526b1 Camelot: Router0.000145 ETH
0x246a5ed5a794eae01c55ca335b5b9fc1dba1f391ef4f30d1ca35b2ffc60e972c1862048042024-03-02 2:26:081 min ago Camelot: Router0xe900fc0035f37ddc5d4681f6db9aa875f7581cd80.49705142503397364 ETH
0x246a5ed5a794eae01c55ca335b5b9fc1dba1f391ef4f30d1ca35b2ffc60e972c1862048042024-03-02 2:26:081 min ago Wrapped Ether Camelot: Router0.49705142503397364 ETH
0x8613144cdc80ba3614bdf30898ea6404d464d64fa01c7127d08cf1cc75f9114e1862047202024-03-02 2:25:451 min ago Camelot: Router Wrapped Ether0.001445075078173463 ETH
0x8613144cdc80ba3614bdf30898ea6404d464d64fa01c7127d08cf1cc75f9114e1862047202024-03-02 2:25:451 min ago ArbDoge AI: AIDOGE Token Camelot: Router0.001445075078173463 ETH
0x8613144cdc80ba3614bdf30898ea6404d464d64fa01c7127d08cf1cc75f9114e1862047202024-03-02 2:25:451 min ago Camelot: Router ArbDoge AI: AIDOGE Token0.001445075078173463 ETH
0x8613144cdc80ba3614bdf30898ea6404d464d64fa01c7127d08cf1cc75f9114e1862047202024-03-02 2:25:451 min ago Wrapped Ether Camelot: Router0.001445075078173463 ETH
0xd35fdede87bd88297d250aee7274e75740a501af3fc29aeba5ebc272d19bf7be1862046742024-03-02 2:25:331 min ago Camelot: Router Wrapped Ether0.022675308764779973 ETH
0xd35fdede87bd88297d250aee7274e75740a501af3fc29aeba5ebc272d19bf7be1862046742024-03-02 2:25:331 min ago ArbDoge AI: AIDOGE Token Camelot: Router0.022675308764779973 ETH
0xd35fdede87bd88297d250aee7274e75740a501af3fc29aeba5ebc272d19bf7be1862046742024-03-02 2:25:331 min ago Camelot: Router ArbDoge AI: AIDOGE Token0.022675308764779973 ETH
0xd35fdede87bd88297d250aee7274e75740a501af3fc29aeba5ebc272d19bf7be1862046742024-03-02 2:25:331 min ago Wrapped Ether Camelot: Router0.022675308764779973 ETH
0x691c8466eaadb5206a4180f8bacb614a84a294fc3e68eb770a57252375a311ae1862046482024-03-02 2:25:262 mins ago Camelot: Router Wrapped Ether0.5 ETH
0xd9a617a00630b08329cc3b95f1eae52e83a167e7cb6fe4b374e59e069366cd231862044382024-03-02 2:24:312 mins ago Camelot: Router Wrapped Ether0.000025 ETH
0xd9a617a00630b08329cc3b95f1eae52e83a167e7cb6fe4b374e59e069366cd231862044382024-03-02 2:24:312 mins ago 0x5c5e68c363f3d711704916c76277bed679f526b1 Camelot: Router0.000025 ETH
0x3d78f996c524b684e2276e885e8977e31f2e5c4548b66e4f319b8d9c674120721862042582024-03-02 2:23:413 mins ago Camelot: Router0xe9072625bb804fffe1e5838ac6d7907ed01e275a0.002293020926640728 ETH
0x3d78f996c524b684e2276e885e8977e31f2e5c4548b66e4f319b8d9c674120721862042582024-03-02 2:23:413 mins ago Wrapped Ether Camelot: Router0.002293020926640728 ETH
0xe8a08ec8d7bdfbc402ecf9114198064ca1f65581ea49a340b2660b8c8653cb501862041342024-03-02 2:23:084 mins ago Camelot: Router Wrapped Ether0.000000000000004333 ETH
0xe8a08ec8d7bdfbc402ecf9114198064ca1f65581ea49a340b2660b8c8653cb501862041342024-03-02 2:23:084 mins ago ArbDoge AI: AIDOGE Token Camelot: Router0.000000000000004333 ETH
0xe8a08ec8d7bdfbc402ecf9114198064ca1f65581ea49a340b2660b8c8653cb501862041342024-03-02 2:23:084 mins ago Camelot: Router ArbDoge AI: AIDOGE Token0.000000000000004333 ETH
0xe8a08ec8d7bdfbc402ecf9114198064ca1f65581ea49a340b2660b8c8653cb501862041342024-03-02 2:23:084 mins ago Wrapped Ether Camelot: Router0.000000000000004333 ETH
0x0be332e42f47f512bd3e6431797c1ed1199f6359a7dde57b658348b784cac7651862041162024-03-02 2:23:034 mins ago Camelot: Router0xcc4f1cb6064a69ac83a5133ffcf09217ae33c2cf0.001031876966253697 ETH
0x0be332e42f47f512bd3e6431797c1ed1199f6359a7dde57b658348b784cac7651862041162024-03-02 2:23:034 mins ago Wrapped Ether Camelot: Router0.001031876966253697 ETH
0xac247c89c85dc20b0736fabadfb7510ab537bcc5e6d2e1fe23c316de858057831862040662024-03-02 2:22:504 mins ago Camelot: Router Wrapped Ether0.000025 ETH
0xac247c89c85dc20b0736fabadfb7510ab537bcc5e6d2e1fe23c316de858057831862040662024-03-02 2:22:504 mins ago 0x5c5e68c363f3d711704916c76277bed679f526b1 Camelot: Router0.000025 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CamelotRouter

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 99999 runs

Other Settings:
default evmVersion
File 1 of 10 : CamelotRouter.sol
pragma solidity =0.6.6;

import '@uniswap/lib/contracts/libraries/TransferHelper.sol';

import 'excalibur-core/contracts/interfaces/ICamelotFactory.sol';
import 'excalibur-core/contracts/interfaces/ICamelotPair.sol';
import 'excalibur-core/contracts/interfaces/IERC20.sol';

import './interfaces/ICamelotRouter.sol';
import './libraries/UniswapV2Library.sol';
import './libraries/SafeMath.sol';
import './interfaces/IWETH.sol';

contract CamelotRouter is ICamelotRouter {
  using SafeMath for uint;
  address public immutable override factory;
  address public immutable override WETH;

  modifier ensure(uint deadline) {
    require(deadline >= block.timestamp, 'CamelotRouter: EXPIRED');
    _;
  }

  constructor(address _factory, address _WETH) public {
    factory = _factory;
    WETH = _WETH;
  }

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

  function getPair(address token1, address token2) external view returns (address){
    return UniswapV2Library.pairFor(factory, token1, token2);
  }

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

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

  function addLiquidityETH(
    address token,
    uint amountTokenDesired,
    uint amountTokenMin,
    uint amountETHMin,
    address to,
    uint deadline
  ) external override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
    (amountToken, amountETH) = _addLiquidity(
      token,
      WETH,
      amountTokenDesired,
      msg.value,
      amountTokenMin,
      amountETHMin
    );
    address pair = UniswapV2Library.pairFor(factory, token, WETH);
    TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
    IWETH(WETH).deposit{value : amountETH}();
    assert(IWETH(WETH).transfer(pair, amountETH));
    liquidity = ICamelotPair(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,
    uint liquidity,
    uint amountAMin,
    uint amountBMin,
    address to,
    uint deadline
  ) public override ensure(deadline) returns (uint amountA, uint amountB) {
    address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
    ICamelotPair(pair).transferFrom(msg.sender, pair, liquidity);
    // send liquidity to pair
    (uint amount0, uint amount1) = ICamelotPair(pair).burn(to);
    (address token0,) = UniswapV2Library.sortTokens(tokenA, tokenB);
    (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
    require(amountA >= amountAMin, 'CamelotRouter: INSUFFICIENT_A_AMOUNT');
    require(amountB >= amountBMin, 'CamelotRouter: INSUFFICIENT_B_AMOUNT');
  }

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

  function removeLiquidityWithPermit(
    address tokenA,
    address tokenB,
    uint liquidity,
    uint amountAMin,
    uint amountBMin,
    address to,
    uint deadline,
    bool approveMax, uint8 v, bytes32 r, bytes32 s
  ) external override returns (uint amountA, uint amountB) {
    address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
    uint value = approveMax ? uint(- 1) : liquidity;
    ICamelotPair(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,
    uint liquidity,
    uint amountTokenMin,
    uint amountETHMin,
    address to,
    uint deadline,
    bool approveMax, uint8 v, bytes32 r, bytes32 s
  ) external override returns (uint amountToken, uint amountETH) {
    address pair = UniswapV2Library.pairFor(factory, token, WETH);
    uint value = approveMax ? uint(- 1) : liquidity;
    ICamelotPair(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,
    uint liquidity,
    uint amountTokenMin,
    uint amountETHMin,
    address to,
    uint deadline
  ) public override ensure(deadline) returns (uint amountETH) {
    (, amountETH) = removeLiquidity(
      token,
      WETH,
      liquidity,
      amountTokenMin,
      amountETHMin,
      address(this),
      deadline
    );
    TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
    IWETH(WETH).withdraw(amountETH);
    TransferHelper.safeTransferETH(to, amountETH);
  }

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

  // **** SWAP ****

  // **** 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, address referrer) internal {
    for (uint i; i < path.length - 1; i++) {
      (address input, address output) = (path[i], path[i + 1]);
      (address token0,) = UniswapV2Library.sortTokens(input, output);
      ICamelotPair pair = ICamelotPair(UniswapV2Library.pairFor(factory, input, output));
      uint amountOutput;
      {// scope to avoid stack too deep errors
        (uint reserve0, uint reserve1,,) = pair.getReserves();
        // permute values to force reserve0 == inputReserve
        if (input != token0) (reserve0, reserve1) = (reserve1, reserve0);
        uint amountInput = IERC20(input).balanceOf(address(pair)).sub(reserve0);
        amountOutput = pair.getAmountOut(amountInput, input);
      }

      (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
      address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;
      pair.swap(amount0Out, amount1Out, to, new bytes(0), referrer);
    }
  }

  function swapExactTokensForTokensSupportingFeeOnTransferTokens(
    uint amountIn,
    uint amountOutMin,
    address[] calldata path,
    address to,
    address referrer,
    uint deadline
  ) external override ensure(deadline) {
    TransferHelper.safeTransferFrom(
      path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn
    );
    uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
    _swapSupportingFeeOnTransferTokens(path, to, referrer);
    require(
      IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
      'CamelotRouter: INSUFFICIENT_OUTPUT_AMOUNT'
    );
  }

  function swapExactETHForTokensSupportingFeeOnTransferTokens(
    uint amountOutMin,
    address[] calldata path,
    address to,
    address referrer,
    uint deadline
  )
  external
  override
  payable
  ensure(deadline)
  {
    require(path[0] == WETH, 'CamelotRouter: INVALID_PATH');
    uint amountIn = msg.value;
    IWETH(WETH).deposit{value : amountIn}();
    assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn));

    uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
    _swapSupportingFeeOnTransferTokens(path, to, referrer);
    require(
      IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
      'CamelotRouter: INSUFFICIENT_OUTPUT_AMOUNT'
    );
  }

  function swapExactTokensForETHSupportingFeeOnTransferTokens(
    uint amountIn,
    uint amountOutMin,
    address[] calldata path,
    address to,
    address referrer,
    uint deadline
  )
  external
  override
  ensure(deadline)
  {
    require(path[path.length - 1] == WETH, 'CamelotRouter: INVALID_PATH');
    TransferHelper.safeTransferFrom(
      path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn
    );
    _swapSupportingFeeOnTransferTokens(path, address(this), referrer);
    uint amountOut = IERC20(WETH).balanceOf(address(this));
    require(amountOut >= amountOutMin, 'CamelotRouter: INSUFFICIENT_OUTPUT_AMOUNT');
    IWETH(WETH).withdraw(amountOut);
    TransferHelper.safeTransferETH(to, amountOut);
  }


  // **** LIBRARY FUNCTIONS ****
  // given some amount of an asset and pair reserves, returns the quote of the other asset's reserve ratio
  function quote(uint amountA, uint reserveA, uint reserveB) external pure override returns (uint amountB) {
    return UniswapV2Library.quote(amountA, reserveA, reserveB);
  }

  function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts) {
    return UniswapV2Library.getAmountsOut(factory, amountIn, path);
  }
}

File 2 of 10 : UniswapV2Library.sol
pragma solidity >=0.5.0;

import "./SafeMath.sol";

import 'excalibur-core/contracts/interfaces/ICamelotPair.sol';

library UniswapV2Library {
    using SafeMath for uint;

    // 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, 'UniswapV2Library: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'UniswapV2Library: 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(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'a856464ae65f7619087bc369daaf7e387dae1e5af69cfa7935850ebf754b04c1' // init code hash
            ))));
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,,) = ICamelotPair(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(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'UniswapV2Library: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
        amountB = amountA.mul(reserveB) / reserveA;
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'UniswapV2Library: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[0] = amountIn;
        for (uint i; i < path.length - 1; i++) {
            ICamelotPair pair = ICamelotPair(pairFor(factory, path[i], path[i + 1]));
            amounts[i + 1] = pair.getAmountOut(amounts[i], path[i]);
        }
    }
}

File 3 of 10 : SafeMath.sol
pragma solidity =0.6.6;

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

library SafeMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'ds-math-sub-underflow');
    }

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

File 4 of 10 : IWETH.sol
pragma solidity >=0.5.0;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

File 5 of 10 : IUniswapV2Router01.sol
pragma solidity >=0.6.2;

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

  function WETH() external pure returns (address);

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

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

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

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

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

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

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

}

File 6 of 10 : ICamelotRouter.sol
pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

interface ICamelotRouter is IUniswapV2Router01 {
  function removeLiquidityETHSupportingFeeOnTransferTokens(
    address token,
    uint liquidity,
    uint amountTokenMin,
    uint amountETHMin,
    address to,
    uint deadline
  ) external returns (uint amountETH);

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

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

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

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


}

File 7 of 10 : IERC20.sol
pragma solidity >=0.5.0;

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint 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 (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}

File 8 of 10 : ICamelotPair.sol
pragma solidity >=0.5.0;

interface ICamelotPair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint 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 (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint 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 (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    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, uint16 token0feePercent, uint16 token1FeePercent);
    function getAmountOut(uint amountIn, address tokenIn) external view returns (uint);
    function kLast() external view returns (uint);

    function setFeePercent(uint16 token0FeePercent, uint16 token1FeePercent) external;
    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data, address referrer) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

File 9 of 10 : ICamelotFactory.sol
pragma solidity >=0.5.0;

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

    function owner() external view returns (address);
    function feePercentOwner() external view returns (address);
    function setStableOwner() external view returns (address);
    function feeTo() external view returns (address);

    function ownerFeeShare() external view returns (uint256);
    function referrersFeeShare(address) external view returns (uint256);

    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 feeInfo() external view returns (uint _ownerFeeShare, address _feeTo);
}

File 10 of 10 : TransferHelper.sol
// SPDX-License-Identifier: GPL-3.0-or-later

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::transferFrom: transferFrom failed'
        );
    }

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

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 99999
  },
  "evmVersion": "istanbul",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","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":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token1","type":"address"},{"internalType":"address","name":"token2","type":"address"}],"name":"getPair","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"referrer","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":"address","name":"referrer","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":"address","name":"referrer","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801561001057600080fd5b50604051613ab1380380613ab18339818101604052604081101561003357600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c61399361011e60003980610114528061091b52806109565280610bba5280610de15280610eb15280610f7952806113b5528061146452806115395280611649528061173152806117b25280611e7652806121e25280612238528061226c52806122ed5250806109ff5280610cda5280610f5752806117f15280611b365280611dc85280611df15280611e545280611fa9528061206752806122165280612aa95280612d1052806133d052806134b1528061353152506139936000f3fe6080604052600436106100f75760003560e01c8063b4822be31161008a578063ded9382a11610059578063ded9382a146106fa578063e6a439051461077a578063e8e33700146107c2578063f305d7191461084f5761013d565b8063b4822be31461050a578063baa2abde146105a7578063c45a015514610611578063d06ca61f146106265761013d565b8063ac3893ba116100c6578063ac3893ba14610387578063ad5c464814610436578063ad615dec14610474578063af2979eb146104aa5761013d565b806302751cec146101425780632195995c146101bb57806352aa4c22146102465780635b0d5984146102f55761013d565b3661013d573373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461013b57fe5b005b600080fd5b34801561014e57600080fd5b506101a2600480360360c081101561016557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356108a2565b6040805192835260208301919091528051918290030190f35b3480156101c757600080fd5b506101a260048036036101608110156101df57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff61010082013516906101208101359061014001356109f5565b34801561025257600080fd5b5061013b600480360360c081101561026957600080fd5b81359160208101359181019060608101604082013564010000000081111561029057600080fd5b8201836020820111156102a257600080fd5b803590602001918460208302840111640100000000831117156102c457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610b33565b34801561030157600080fd5b50610375600480360361014081101561031957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135610f4f565b60408051918252519081900360200190f35b34801561039357600080fd5b5061013b600480360360c08110156103aa57600080fd5b8135916020810135918101906060810160408201356401000000008111156103d157600080fd5b8201836020820111156103e357600080fd5b8035906020019184602083028401116401000000008311171561040557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356110a1565b34801561044257600080fd5b5061044b6113b3565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561048057600080fd5b506103756004803603606081101561049757600080fd5b50803590602081013590604001356113d7565b3480156104b657600080fd5b50610375600480360360c08110156104cd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356113ec565b61013b600480360360a081101561052057600080fd5b8135919081019060408101602082013564010000000081111561054257600080fd5b82018360208201111561055457600080fd5b8035906020019184602083028401116401000000008311171561057657600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356115d7565b3480156105b357600080fd5b506101a2600480360360e08110156105ca57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135611abc565b34801561061d57600080fd5b5061044b611dc6565b34801561063257600080fd5b506106aa6004803603604081101561064957600080fd5b8135919081019060408101602082013564010000000081111561066b57600080fd5b82018360208201111561067d57600080fd5b8035906020019184602083028401116401000000008311171561069f57600080fd5b509092509050611dea565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106e65781810151838201526020016106ce565b505050509050019250505060405180910390f35b34801561070657600080fd5b506101a2600480360361014081101561071e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611e4a565b34801561078657600080fd5b5061044b6004803603604081101561079d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611fa2565b3480156107ce57600080fd5b5061083160048036036101008110156107e657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135611fd8565b60408051938452602084019290925282820152519081900360600190f35b610831600480360360c081101561086557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135612167565b600080824281101561091557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616d656c6f74526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b610944897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a611abc565b9093509150610954898685612493565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156109c757600080fd5b505af11580156109db573d6000803e3d6000fd5b505050506109e9858361265a565b50965096945050505050565b6000806000610a257f00000000000000000000000000000000000000000000000000000000000000008f8f612797565b9050600087610a34578c610a56565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b158015610af257600080fd5b505af1158015610b06573d6000803e3d6000fd5b50505050610b198f8f8f8f8f8f8f611abc565b809450819550505050509b509b9950505050505050505050565b8042811015610ba357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616d656c6f74526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110610c0857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ca757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f43616d656c6f74526f757465723a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b610d5886866000818110610cb757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633610d527f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610d0657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b6001818110610d3057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16612797565b8b612882565b610d98868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250879150612a529050565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015610e2857600080fd5b505afa158015610e3c573d6000803e3d6000fd5b505050506040513d6020811015610e5257600080fd5b5051905087811015610eaf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806138e36029913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f2257600080fd5b505af1158015610f36573d6000803e3d6000fd5b50505050610f44858261265a565b505050505050505050565b600080610f9d7f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000612797565b9050600086610fac578b610fce565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561106a57600080fd5b505af115801561107e573d6000803e3d6000fd5b505050506110908d8d8d8d8d8d6113ec565b9d9c50505050505050505050505050565b804281101561111157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616d656c6f74526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b61112186866000818110610cb757fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061115157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156111ea57600080fd5b505afa1580156111fe573d6000803e3d6000fd5b505050506040513d602081101561121457600080fd5b505160408051602089810282810182019093528982529293506112589290918a918a918291850190849080828437600092019190915250899250889150612a529050565b8761135c8289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061128b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561132457600080fd5b505afa158015611338573d6000803e3d6000fd5b505050506040513d602081101561134e57600080fd5b50519063ffffffff612ec416565b1015610f44576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806138e36029913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b60006113e4848484612f36565b949350505050565b6000814281101561145e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616d656c6f74526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b61148d887f00000000000000000000000000000000000000000000000000000000000000008989893089611abc565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191945061153792508a91879173ffffffffffffffffffffffffffffffffffffffff8416916370a0823191602480820192602092909190829003018186803b15801561150657600080fd5b505afa15801561151a573d6000803e3d6000fd5b505050506040513d602081101561153057600080fd5b5051612493565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156115aa57600080fd5b505af11580156115be573d6000803e3d6000fd5b505050506115cc848361265a565b509695505050505050565b804281101561164757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616d656c6f74526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168686600081811061168b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461172a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f43616d656c6f74526f757465723a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561179757600080fd5b505af11580156117ab573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61181d7f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610d0657fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561188757600080fd5b505af115801561189b573d6000803e3d6000fd5b505050506040513d60208110156118b157600080fd5b50516118b957fe5b600087877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181106118e957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561198257600080fd5b505afa158015611996573d6000803e3d6000fd5b505050506040513d60208110156119ac57600080fd5b50516040805160208a810282810182019093528a82529293506119f09290918b918b9182918501908490808284376000920191909152508a9250899150612a529050565b8861135c828a8a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611a2357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561132457600080fd5b6000808242811015611b2f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616d656c6f74526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b6000611b5c7f00000000000000000000000000000000000000000000000000000000000000008c8c612797565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015611bdd57600080fd5b505af1158015611bf1573d6000803e3d6000fd5b505050506040513d6020811015611c0757600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015611c7a57600080fd5b505af1158015611c8e573d6000803e3d6000fd5b505050506040513d6040811015611ca457600080fd5b50805160209091015190925090506000611cbe8e8e613016565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614611cfb578183611cfe565b82825b90975095508a871015611d5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061384e6024913960400191505060405180910390fd5b89861015611db5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806138bf6024913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606113e47f00000000000000000000000000000000000000000000000000000000000000008585858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061316992505050565b6000806000611e9a7f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000612797565b9050600087611ea9578c611ecb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b158015611f6757600080fd5b505af1158015611f7b573d6000803e3d6000fd5b50505050611f8d8e8e8e8e8e8e6108a2565b909f909e509c50505050505050505050505050565b6000611fcf7f00000000000000000000000000000000000000000000000000000000000000008484612797565b90505b92915050565b6000806000834281101561204d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616d656c6f74526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b61205b8c8c8c8c8c8c613379565b9094509250600061208d7f00000000000000000000000000000000000000000000000000000000000000008e8e612797565b905061209b8d338388612882565b6120a78c338387612882565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561212657600080fd5b505af115801561213a573d6000803e3d6000fd5b505050506040513d602081101561215057600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156121dc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616d656c6f74526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b61220a8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613379565b9094509250600061225c7f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000612797565b905061226a8b338388612882565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122d257600080fd5b505af11580156122e6573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561239257600080fd5b505af11580156123a6573d6000803e3d6000fd5b505050506040513d60208110156123bc57600080fd5b50516123c457fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561244357600080fd5b505af1158015612457573d6000803e3d6000fd5b505050506040513d602081101561246d57600080fd5b5051925034841015612485576124853385340361265a565b505096509650969350505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b6020831061256957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161252c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146125cb576040519150601f19603f3d011682016040523d82523d6000602084013e6125d0565b606091505b50915091508180156125fe5750805115806125fe57508080602001905160208110156125fb57600080fd5b50515b612653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180613931602d913960400191505060405180910390fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b602083106126d157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612694565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612733576040519150601f19603f3d011682016040523d82523d6000602084013e612738565b606091505b5050905080612792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061381a6034913960400191505060405180910390fd5b505050565b60008060006127a68585613016565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527fa856464ae65f7619087bc369daaf7e387dae1e5af69cfa7935850ebf754b04c1609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061296057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612923565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146129c2576040519150601f19603f3d011682016040523d82523d6000602084013e6129c7565b606091505b50915091508180156129f55750805115806129f557508080602001905160208110156129f257600080fd5b50515b612a4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806137e96031913960400191505060405180910390fd5b505050505050565b60005b6001845103811015612ebe57600080858381518110612a7057fe5b6020026020010151868460010181518110612a8757fe5b6020026020010151915091506000612a9f8383613016565b5090506000612acf7f00000000000000000000000000000000000000000000000000000000000000008585612797565b905060008060008373ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160806040518083038186803b158015612b1c57600080fd5b505afa158015612b30573d6000803e3d6000fd5b505050506040513d6080811015612b4657600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff87811690861614612b8857905b6000612c0b838973ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561132457600080fd5b90508473ffffffffffffffffffffffffffffffffffffffff1663f140a35a828a6040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015612c9257600080fd5b505afa158015612ca6573d6000803e3d6000fd5b505050506040513d6020811015612cbc57600080fd5b50519350600092508291505073ffffffffffffffffffffffffffffffffffffffff87811690861614612cf057826000612cf4565b6000835b91509150600060028c51038910612d0b578a612d4c565b612d4c7f0000000000000000000000000000000000000000000000000000000000000000888e8c60020181518110612d3f57fe5b6020026020010151612797565b6040805160008082526020820190925291925073ffffffffffffffffffffffffffffffffffffffff871691636e1fdd7f9186918691869190508f6040518663ffffffff1660e01b8152600401808681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015612e42578181015183820152602001612e2a565b50505050905090810190601f168015612e6f5780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b158015612e9257600080fd5b505af1158015612ea6573d6000803e3d6000fd5b50506001909a019950612a5598505050505050505050565b50505050565b80820382811115611fd257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411612f90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061390c6025913960400191505060405180910390fd5b600083118015612fa05750600082115b612ff5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806138976028913960400191505060405180910390fd5b82613006858463ffffffff61367a16565b8161300d57fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561309e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806138726025913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16106130d85782846130db565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff821661316257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b60606002825110156131dc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff811180156131f457600080fd5b5060405190808252806020026020018201604052801561321e578160200160208202803683370190505b509050828160008151811061322f57fe5b60200260200101818152505060005b60018351038110156133715760006132738685848151811061325c57fe5b6020026020010151868560010181518110612d3f57fe5b90508073ffffffffffffffffffffffffffffffffffffffff1663f140a35a84848151811061329d57fe5b60200260200101518685815181106132b157fe5b60200260200101516040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561332057600080fd5b505afa158015613334573d6000803e3d6000fd5b505050506040513d602081101561334a57600080fd5b5051835184906001850190811061335d57fe5b60209081029190910101525060010161323e565b509392505050565b604080517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b15801561341957600080fd5b505afa15801561342d573d6000803e3d6000fd5b505050506040513d602081101561344357600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16141561352957604080517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b1580156134fc57600080fd5b505af1158015613510573d6000803e3d6000fd5b505050506040513d602081101561352657600080fd5b50505b6000806135577f00000000000000000000000000000000000000000000000000000000000000008b8b613700565b91509150816000148015613569575080155b156135795787935086925061366d565b6000613586898484612f36565b90508781116135f357858110156135e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806138bf6024913960400191505060405180910390fd5b88945092508261366b565b6000613600898486612f36565b90508981111561360c57fe5b87811015613665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061384e6024913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806136955750508082028282828161369257fe5b04145b611fd257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b600080600061370f8585613016565b509050600080613720888888612797565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160806040518083038186803b15801561376557600080fd5b505afa158015613779573d6000803e3d6000fd5b505050506040513d608081101561378f57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff878116908416146137d65780826137d9565b81815b9099909850965050505050505056fe5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c656443616d656c6f74526f757465723a20494e53554646494349454e545f415f414d4f554e54556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e697377617056324c6962726172793a20494e53554646494349454e545f4c495155494449545943616d656c6f74526f757465723a20494e53554646494349454e545f425f414d4f554e5443616d656c6f74526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564a2646970667358221220291b82981eac749ac27e93bae4adc7fc47d2ed83354b5577a7ccb4fe7509541f64736f6c634300060600330000000000000000000000006eccab422d763ac031210895c81787e87b43a65200000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

Deployed Bytecode

0x6080604052600436106100f75760003560e01c8063b4822be31161008a578063ded9382a11610059578063ded9382a146106fa578063e6a439051461077a578063e8e33700146107c2578063f305d7191461084f5761013d565b8063b4822be31461050a578063baa2abde146105a7578063c45a015514610611578063d06ca61f146106265761013d565b8063ac3893ba116100c6578063ac3893ba14610387578063ad5c464814610436578063ad615dec14610474578063af2979eb146104aa5761013d565b806302751cec146101425780632195995c146101bb57806352aa4c22146102465780635b0d5984146102f55761013d565b3661013d573373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1161461013b57fe5b005b600080fd5b34801561014e57600080fd5b506101a2600480360360c081101561016557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356108a2565b6040805192835260208301919091528051918290030190f35b3480156101c757600080fd5b506101a260048036036101608110156101df57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff61010082013516906101208101359061014001356109f5565b34801561025257600080fd5b5061013b600480360360c081101561026957600080fd5b81359160208101359181019060608101604082013564010000000081111561029057600080fd5b8201836020820111156102a257600080fd5b803590602001918460208302840111640100000000831117156102c457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610b33565b34801561030157600080fd5b50610375600480360361014081101561031957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135610f4f565b60408051918252519081900360200190f35b34801561039357600080fd5b5061013b600480360360c08110156103aa57600080fd5b8135916020810135918101906060810160408201356401000000008111156103d157600080fd5b8201836020820111156103e357600080fd5b8035906020019184602083028401116401000000008311171561040557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356110a1565b34801561044257600080fd5b5061044b6113b3565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561048057600080fd5b506103756004803603606081101561049757600080fd5b50803590602081013590604001356113d7565b3480156104b657600080fd5b50610375600480360360c08110156104cd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356113ec565b61013b600480360360a081101561052057600080fd5b8135919081019060408101602082013564010000000081111561054257600080fd5b82018360208201111561055457600080fd5b8035906020019184602083028401116401000000008311171561057657600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356115d7565b3480156105b357600080fd5b506101a2600480360360e08110156105ca57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135611abc565b34801561061d57600080fd5b5061044b611dc6565b34801561063257600080fd5b506106aa6004803603604081101561064957600080fd5b8135919081019060408101602082013564010000000081111561066b57600080fd5b82018360208201111561067d57600080fd5b8035906020019184602083028401116401000000008311171561069f57600080fd5b509092509050611dea565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106e65781810151838201526020016106ce565b505050509050019250505060405180910390f35b34801561070657600080fd5b506101a2600480360361014081101561071e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611e4a565b34801561078657600080fd5b5061044b6004803603604081101561079d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611fa2565b3480156107ce57600080fd5b5061083160048036036101008110156107e657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135611fd8565b60408051938452602084019290925282820152519081900360600190f35b610831600480360360c081101561086557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135612167565b600080824281101561091557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616d656c6f74526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b610944897f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab18a8a8a308a611abc565b9093509150610954898685612493565b7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156109c757600080fd5b505af11580156109db573d6000803e3d6000fd5b505050506109e9858361265a565b50965096945050505050565b6000806000610a257f0000000000000000000000006eccab422d763ac031210895c81787e87b43a6528f8f612797565b9050600087610a34578c610a56565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b158015610af257600080fd5b505af1158015610b06573d6000803e3d6000fd5b50505050610b198f8f8f8f8f8f8f611abc565b809450819550505050509b509b9950505050505050505050565b8042811015610ba357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616d656c6f74526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab11686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110610c0857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ca757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f43616d656c6f74526f757465723a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b610d5886866000818110610cb757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633610d527f0000000000000000000000006eccab422d763ac031210895c81787e87b43a6528a8a6000818110610d0657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b6001818110610d3057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16612797565b8b612882565b610d98868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250879150612a529050565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab116916370a0823191602480820192602092909190829003018186803b158015610e2857600080fd5b505afa158015610e3c573d6000803e3d6000fd5b505050506040513d6020811015610e5257600080fd5b5051905087811015610eaf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806138e36029913960400191505060405180910390fd5b7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f2257600080fd5b505af1158015610f36573d6000803e3d6000fd5b50505050610f44858261265a565b505050505050505050565b600080610f9d7f0000000000000000000000006eccab422d763ac031210895c81787e87b43a6528d7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1612797565b9050600086610fac578b610fce565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561106a57600080fd5b505af115801561107e573d6000803e3d6000fd5b505050506110908d8d8d8d8d8d6113ec565b9d9c50505050505050505050505050565b804281101561111157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616d656c6f74526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b61112186866000818110610cb757fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061115157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156111ea57600080fd5b505afa1580156111fe573d6000803e3d6000fd5b505050506040513d602081101561121457600080fd5b505160408051602089810282810182019093528982529293506112589290918a918a918291850190849080828437600092019190915250899250889150612a529050565b8761135c8289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061128b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561132457600080fd5b505afa158015611338573d6000803e3d6000fd5b505050506040513d602081101561134e57600080fd5b50519063ffffffff612ec416565b1015610f44576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806138e36029913960400191505060405180910390fd5b7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab181565b60006113e4848484612f36565b949350505050565b6000814281101561145e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616d656c6f74526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b61148d887f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab18989893089611abc565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191945061153792508a91879173ffffffffffffffffffffffffffffffffffffffff8416916370a0823191602480820192602092909190829003018186803b15801561150657600080fd5b505afa15801561151a573d6000803e3d6000fd5b505050506040513d602081101561153057600080fd5b5051612493565b7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156115aa57600080fd5b505af11580156115be573d6000803e3d6000fd5b505050506115cc848361265a565b509695505050505050565b804281101561164757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616d656c6f74526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab173ffffffffffffffffffffffffffffffffffffffff168686600081811061168b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461172a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f43616d656c6f74526f757465723a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b60003490507f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab173ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561179757600080fd5b505af11580156117ab573d6000803e3d6000fd5b50505050507f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61181d7f0000000000000000000000006eccab422d763ac031210895c81787e87b43a6528a8a6000818110610d0657fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561188757600080fd5b505af115801561189b573d6000803e3d6000fd5b505050506040513d60208110156118b157600080fd5b50516118b957fe5b600087877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181106118e957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561198257600080fd5b505afa158015611996573d6000803e3d6000fd5b505050506040513d60208110156119ac57600080fd5b50516040805160208a810282810182019093528a82529293506119f09290918b918b9182918501908490808284376000920191909152508a9250899150612a529050565b8861135c828a8a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611a2357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561132457600080fd5b6000808242811015611b2f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616d656c6f74526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b6000611b5c7f0000000000000000000000006eccab422d763ac031210895c81787e87b43a6528c8c612797565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015611bdd57600080fd5b505af1158015611bf1573d6000803e3d6000fd5b505050506040513d6020811015611c0757600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015611c7a57600080fd5b505af1158015611c8e573d6000803e3d6000fd5b505050506040513d6040811015611ca457600080fd5b50805160209091015190925090506000611cbe8e8e613016565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614611cfb578183611cfe565b82825b90975095508a871015611d5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061384e6024913960400191505060405180910390fd5b89861015611db5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806138bf6024913960400191505060405180910390fd5b505050505097509795505050505050565b7f0000000000000000000000006eccab422d763ac031210895c81787e87b43a65281565b60606113e47f0000000000000000000000006eccab422d763ac031210895c81787e87b43a6528585858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061316992505050565b6000806000611e9a7f0000000000000000000000006eccab422d763ac031210895c81787e87b43a6528e7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1612797565b9050600087611ea9578c611ecb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b158015611f6757600080fd5b505af1158015611f7b573d6000803e3d6000fd5b50505050611f8d8e8e8e8e8e8e6108a2565b909f909e509c50505050505050505050505050565b6000611fcf7f0000000000000000000000006eccab422d763ac031210895c81787e87b43a6528484612797565b90505b92915050565b6000806000834281101561204d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616d656c6f74526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b61205b8c8c8c8c8c8c613379565b9094509250600061208d7f0000000000000000000000006eccab422d763ac031210895c81787e87b43a6528e8e612797565b905061209b8d338388612882565b6120a78c338387612882565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561212657600080fd5b505af115801561213a573d6000803e3d6000fd5b505050506040513d602081101561215057600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156121dc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616d656c6f74526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b61220a8a7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab18b348c8c613379565b9094509250600061225c7f0000000000000000000000006eccab422d763ac031210895c81787e87b43a6528c7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1612797565b905061226a8b338388612882565b7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab173ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122d257600080fd5b505af11580156122e6573d6000803e3d6000fd5b50505050507f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561239257600080fd5b505af11580156123a6573d6000803e3d6000fd5b505050506040513d60208110156123bc57600080fd5b50516123c457fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561244357600080fd5b505af1158015612457573d6000803e3d6000fd5b505050506040513d602081101561246d57600080fd5b5051925034841015612485576124853385340361265a565b505096509650969350505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b6020831061256957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161252c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146125cb576040519150601f19603f3d011682016040523d82523d6000602084013e6125d0565b606091505b50915091508180156125fe5750805115806125fe57508080602001905160208110156125fb57600080fd5b50515b612653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180613931602d913960400191505060405180910390fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b602083106126d157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612694565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612733576040519150601f19603f3d011682016040523d82523d6000602084013e612738565b606091505b5050905080612792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061381a6034913960400191505060405180910390fd5b505050565b60008060006127a68585613016565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527fa856464ae65f7619087bc369daaf7e387dae1e5af69cfa7935850ebf754b04c1609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061296057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612923565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146129c2576040519150601f19603f3d011682016040523d82523d6000602084013e6129c7565b606091505b50915091508180156129f55750805115806129f557508080602001905160208110156129f257600080fd5b50515b612a4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806137e96031913960400191505060405180910390fd5b505050505050565b60005b6001845103811015612ebe57600080858381518110612a7057fe5b6020026020010151868460010181518110612a8757fe5b6020026020010151915091506000612a9f8383613016565b5090506000612acf7f0000000000000000000000006eccab422d763ac031210895c81787e87b43a6528585612797565b905060008060008373ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160806040518083038186803b158015612b1c57600080fd5b505afa158015612b30573d6000803e3d6000fd5b505050506040513d6080811015612b4657600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff87811690861614612b8857905b6000612c0b838973ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561132457600080fd5b90508473ffffffffffffffffffffffffffffffffffffffff1663f140a35a828a6040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015612c9257600080fd5b505afa158015612ca6573d6000803e3d6000fd5b505050506040513d6020811015612cbc57600080fd5b50519350600092508291505073ffffffffffffffffffffffffffffffffffffffff87811690861614612cf057826000612cf4565b6000835b91509150600060028c51038910612d0b578a612d4c565b612d4c7f0000000000000000000000006eccab422d763ac031210895c81787e87b43a652888e8c60020181518110612d3f57fe5b6020026020010151612797565b6040805160008082526020820190925291925073ffffffffffffffffffffffffffffffffffffffff871691636e1fdd7f9186918691869190508f6040518663ffffffff1660e01b8152600401808681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015612e42578181015183820152602001612e2a565b50505050905090810190601f168015612e6f5780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b158015612e9257600080fd5b505af1158015612ea6573d6000803e3d6000fd5b50506001909a019950612a5598505050505050505050565b50505050565b80820382811115611fd257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411612f90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061390c6025913960400191505060405180910390fd5b600083118015612fa05750600082115b612ff5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806138976028913960400191505060405180910390fd5b82613006858463ffffffff61367a16565b8161300d57fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561309e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806138726025913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16106130d85782846130db565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff821661316257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b60606002825110156131dc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff811180156131f457600080fd5b5060405190808252806020026020018201604052801561321e578160200160208202803683370190505b509050828160008151811061322f57fe5b60200260200101818152505060005b60018351038110156133715760006132738685848151811061325c57fe5b6020026020010151868560010181518110612d3f57fe5b90508073ffffffffffffffffffffffffffffffffffffffff1663f140a35a84848151811061329d57fe5b60200260200101518685815181106132b157fe5b60200260200101516040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561332057600080fd5b505afa158015613334573d6000803e3d6000fd5b505050506040513d602081101561334a57600080fd5b5051835184906001850190811061335d57fe5b60209081029190910101525060010161323e565b509392505050565b604080517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301529151600092839283927f0000000000000000000000006eccab422d763ac031210895c81787e87b43a6529092169163e6a4390591604480820192602092909190829003018186803b15801561341957600080fd5b505afa15801561342d573d6000803e3d6000fd5b505050506040513d602081101561344357600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16141561352957604080517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152898116602483015291517f0000000000000000000000006eccab422d763ac031210895c81787e87b43a6529092169163c9c65396916044808201926020929091908290030181600087803b1580156134fc57600080fd5b505af1158015613510573d6000803e3d6000fd5b505050506040513d602081101561352657600080fd5b50505b6000806135577f0000000000000000000000006eccab422d763ac031210895c81787e87b43a6528b8b613700565b91509150816000148015613569575080155b156135795787935086925061366d565b6000613586898484612f36565b90508781116135f357858110156135e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806138bf6024913960400191505060405180910390fd5b88945092508261366b565b6000613600898486612f36565b90508981111561360c57fe5b87811015613665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061384e6024913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806136955750508082028282828161369257fe5b04145b611fd257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b600080600061370f8585613016565b509050600080613720888888612797565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160806040518083038186803b15801561376557600080fd5b505afa158015613779573d6000803e3d6000fd5b505050506040513d608081101561378f57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff878116908416146137d65780826137d9565b81815b9099909850965050505050505056fe5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c656443616d656c6f74526f757465723a20494e53554646494349454e545f415f414d4f554e54556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e697377617056324c6962726172793a20494e53554646494349454e545f4c495155494449545943616d656c6f74526f757465723a20494e53554646494349454e545f425f414d4f554e5443616d656c6f74526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564a2646970667358221220291b82981eac749ac27e93bae4adc7fc47d2ed83354b5577a7ccb4fe7509541f64736f6c63430006060033

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

0000000000000000000000006eccab422d763ac031210895c81787e87b43a65200000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

-----Decoded View---------------
Arg [0] : _factory (address): 0x6EcCab422D763aC031210895C81787E87B43A652
Arg [1] : _WETH (address): 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000006eccab422d763ac031210895c81787e87b43a652
Arg [1] : 00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.