Contract 0x46ab221ac1e51968f4c05e57137011c27696d137 1

Contract Overview

Balance:
0 DEV
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x799e9cacc48304bc0e601dbd673b3b1b002ead6459e89bc7f71c93ec566f447cSwap Exact ETH F...40022042023-03-24 4:37:188 days 5 hrs ago0x03ab1e266bbc527b5b80808d466aa71d09c95f0a IN 0x46ab221ac1e51968f4c05e57137011c27696d1370.1 DEV0.00019981975
0x68a9ba149bd0d0425fd9676f0dffe3fa0583188695edeefc424b0871ba0a60f8Swap Exact ETH F...39777622023-03-20 14:10:0011 days 19 hrs ago0x2bf1dfbd37807e8e5ffb91ce11345622bcef1d13 IN 0x46ab221ac1e51968f4c05e57137011c27696d1370.001 DEV0.000198547375
0x4b02bde82cf07755db54f83ab2f9a3ffc5579e25ba14747514746009d5b70e48Add Liquidity ET...35664162023-01-17 11:54:1873 days 21 hrs ago0x248d90e82b5b37d731d9a72bf151ec5f935dae86 IN 0x46ab221ac1e51968f4c05e57137011c27696d1370.192344937870362 DEV0.0003776575
0x9a860608168f142cb5f5c8d6f9dadaea8bea6119382f9f7b43b34f32f029477cSwap Exact ETH F...35664152023-01-17 11:54:0073 days 21 hrs ago0x248d90e82b5b37d731d9a72bf151ec5f935dae86 IN 0x46ab221ac1e51968f4c05e57137011c27696d1370.01 DEV0.0002658875
0x2209034714bd1a1fbdcb6b46d0c0f9e5ddc7d11cb88f167423ab19646b865dacSwap Exact Token...34986722023-01-06 10:18:3084 days 23 hrs ago0x9bdbdb4a8f7f816c87a67f5281484ed902c6b942 IN 0x46ab221ac1e51968f4c05e57137011c27696d1370 DEV0.000349902
0xea844aed3c886d3d54f8a2428cb334c0e941487de596d5fcaf387045eadf8b39Swap Exact Token...34986712023-01-06 10:18:1884 days 23 hrs ago0x9bdbdb4a8f7f816c87a67f5281484ed902c6b942 IN 0x46ab221ac1e51968f4c05e57137011c27696d1370 DEV0.000337296
0x10378a4f21b598abb7537ae48897f8a5e4580c4a6bfd851f3879ecb70c46dfe3Remove Liquidity...34986642023-01-06 10:16:4884 days 23 hrs ago0x9bdbdb4a8f7f816c87a67f5281484ed902c6b942 IN 0x46ab221ac1e51968f4c05e57137011c27696d1370 DEV0.000540996
0xf02a710286690971501354d77f04880328ddeb4648ca39bb0b942b7adbb35298Swap Exact ETH F...34883112023-01-04 19:14:4286 days 14 hrs ago0x1f73615816ae436c1fd3afa741ebd037c622f3b6 IN 0x46ab221ac1e51968f4c05e57137011c27696d13720 DEV0.0002627675
0x16a059c3973757ac151fb3d22e9ec5f96264fe2fb08bf0b3dd8422113d73b967Add Liquidity32809882022-12-01 14:50:48120 days 18 hrs ago0x1f73615816ae436c1fd3afa741ebd037c622f3b6 IN 0x46ab221ac1e51968f4c05e57137011c27696d1370 DEV0.0003329425
0x05616cc95e247e96b3dc984cf80c03d9232bc643e5a89ac37198cec0e073f81aSwap Exact ETH F...32809842022-12-01 14:49:48120 days 18 hrs ago0x1f73615816ae436c1fd3afa741ebd037c622f3b6 IN 0x46ab221ac1e51968f4c05e57137011c27696d1374.9 DEV0.0002627375
0x40e55a8ebd90fda21aab18b96af8aaded8d815e4075e4d9ce3e63953ec213161Swap Exact ETH F...32809812022-12-01 14:49:06120 days 18 hrs ago0x1f73615816ae436c1fd3afa741ebd037c622f3b6 IN 0x46ab221ac1e51968f4c05e57137011c27696d13710 DEV0.0003086975
0x74a2bf8a8cbbd2e760e1fdfbf359c237e5185d2176ad557e25dd632b0b3f64eaSwap Exact ETH F...32809782022-12-01 14:48:30120 days 18 hrs ago0x1f73615816ae436c1fd3afa741ebd037c622f3b6 IN 0x46ab221ac1e51968f4c05e57137011c27696d13710 DEV0.0003086675
0xc3f24a1c50d7ec9f3886d17c8efcdaa27a56deb1ef0d1e5be520ab9220465fd5Add Liquidity ET...32809762022-12-01 14:47:42120 days 19 hrs ago0x1f73615816ae436c1fd3afa741ebd037c622f3b6 IN 0x46ab221ac1e51968f4c05e57137011c27696d1373.688006461270643 DEV0.0003221775
0x9d74a2259d40638be6fbfd1fdd3e3e526a136b0426b80476921b3f64b153a512Swap Exact ETH F...31595082022-11-11 14:33:30140 days 19 hrs ago0x592085833b9d6900337e3da5b18b28c834625f3b IN 0x46ab221ac1e51968f4c05e57137011c27696d1371 DEV0.00030759
0xbbcdb797b00067030b06813635a183bb488872123472e89bc097968f0d52659eSwap Exact ETH F...31294232022-11-06 9:28:48146 days 19 mins ago0x4de72d0cd584aef3dfb3cb5ead2a7fa8071dc745 IN 0x46ab221ac1e51968f4c05e57137011c27696d1371.09 DEV0.0003086675
0x5c4d131f157514db71943f8a4ff925b2a717edffb6a153b9bf2bcd72046feb02Swap Exact ETH F...31293822022-11-06 9:18:30146 days 29 mins ago0x775b6876f0b312bb0ca05310c28c9117f27ccf6b IN 0x46ab221ac1e51968f4c05e57137011c27696d1371.09 DEV0.0003086675
0xc886b6c943ee91ce38ce0c9c52a3f412b66232d011d688606284339b955d29eeAdd Liquidity30665512022-10-25 8:12:00158 days 1 hr ago0x1f73615816ae436c1fd3afa741ebd037c622f3b6 IN 0x46ab221ac1e51968f4c05e57137011c27696d1370 DEV0.0002541075
0x5211bbf980d5d57611b074038251f92bb48b591cf763a512d76ea20d183f611bSwap Exact ETH F...30665492022-10-25 8:11:18158 days 1 hr ago0x1f73615816ae436c1fd3afa741ebd037c622f3b6 IN 0x46ab221ac1e51968f4c05e57137011c27696d1372.9 DEV0.00029856
0xf5372dbb794982a88805d226756f0ed9c44ecb6c41fb1141eaa2fef594f08b65Swap Exact ETH F...30665452022-10-25 8:10:06158 days 1 hr ago0x1f73615816ae436c1fd3afa741ebd037c622f3b6 IN 0x46ab221ac1e51968f4c05e57137011c27696d1375 DEV0.000298535
0x6c4fc2e4347e8ad517080afe48afc17d13ef6cf84243117761809418e4e7e590Add Liquidity ET...30665412022-10-25 8:09:12158 days 1 hr ago0x1f73615816ae436c1fd3afa741ebd037c622f3b6 IN 0x46ab221ac1e51968f4c05e57137011c27696d1374.993227274245677 DEV0.0002965425
0x3104d06800cd09e1859232aa26bbab7ecc820d58a8d3e6b4bd3aa8792636787aSwap Exact ETH F...30665372022-10-25 8:08:12158 days 1 hr ago0x1f73615816ae436c1fd3afa741ebd037c622f3b6 IN 0x46ab221ac1e51968f4c05e57137011c27696d1375 DEV0.000298535
0x2f449d836aa48a50ca39bf79aec9f3cb622dd37561595d1584c249d605679992Swap Exact ETH F...30665342022-10-25 8:07:24158 days 1 hr ago0x1f73615816ae436c1fd3afa741ebd037c622f3b6 IN 0x46ab221ac1e51968f4c05e57137011c27696d1375 DEV0.00029599
0x547d2ab26f97f5a799b6a56766d6e957533ee9a5c7b961c461e5341d2c3a7f12Swap Exact ETH F...29162882022-09-28 10:27:12184 days 23 hrs ago0x378367eb35a793817ad92ae055394e4a6cf1a0ff IN 0x46ab221ac1e51968f4c05e57137011c27696d1375.6755 DEV0.0002975575
0x41506345164ba970e69988ce0021e2577606df18ea7c8d6e2f488b9c9554b045Swap Exact ETH F...29121912022-09-27 17:40:42185 days 16 hrs ago0x9597749b802009a6d44a0e8fff364efc0ade65f7 IN 0x46ab221ac1e51968f4c05e57137011c27696d13770.6 DEV0.000296015
0x84b0aecc6a4a3c936815d8c7714f46c59e00ba280c36a5b50e8060019f970612Swap Exact ETH F...29102422022-09-27 9:35:42186 days 12 mins ago0x07da6f47ce038359f02bff73b36de1ac3afad86d IN 0x46ab221ac1e51968f4c05e57137011c27696d1371 DEV0.00029599
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x799e9cacc48304bc0e601dbd673b3b1b002ead6459e89bc7f71c93ec566f447c40022042023-03-24 4:37:188 days 5 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d137 0xeb8801cbe1c22da3f503bd2ddb92ac98eb336e520 DEV
0x799e9cacc48304bc0e601dbd673b3b1b002ead6459e89bc7f71c93ec566f447c40022042023-03-24 4:37:188 days 5 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d1370xa5fd1f6e7980fd5ca9d062a762030d449990bbbf0 DEV
0x799e9cacc48304bc0e601dbd673b3b1b002ead6459e89bc7f71c93ec566f447c40022042023-03-24 4:37:188 days 5 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d1370xa5fd1f6e7980fd5ca9d062a762030d449990bbbf0.1 DEV
0x799e9cacc48304bc0e601dbd673b3b1b002ead6459e89bc7f71c93ec566f447c40022042023-03-24 4:37:188 days 5 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d137 0xeb8801cbe1c22da3f503bd2ddb92ac98eb336e520 DEV
0x68a9ba149bd0d0425fd9676f0dffe3fa0583188695edeefc424b0871ba0a60f839777622023-03-20 14:10:0011 days 19 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d137 0xe418d94dd0ead33e4edc1b34b111a11158ac1bdf0 DEV
0x68a9ba149bd0d0425fd9676f0dffe3fa0583188695edeefc424b0871ba0a60f839777622023-03-20 14:10:0011 days 19 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d1370xa5fd1f6e7980fd5ca9d062a762030d449990bbbf0 DEV
0x68a9ba149bd0d0425fd9676f0dffe3fa0583188695edeefc424b0871ba0a60f839777622023-03-20 14:10:0011 days 19 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d1370xa5fd1f6e7980fd5ca9d062a762030d449990bbbf0.001 DEV
0x68a9ba149bd0d0425fd9676f0dffe3fa0583188695edeefc424b0871ba0a60f839777622023-03-20 14:10:0011 days 19 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d137 0xe418d94dd0ead33e4edc1b34b111a11158ac1bdf0 DEV
0x4b02bde82cf07755db54f83ab2f9a3ffc5579e25ba14747514746009d5b70e4835664162023-01-17 11:54:1873 days 21 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d137 0x3a9c9484e0e82596fb4c2e7fec97106c4c2310fa0 DEV
0x4b02bde82cf07755db54f83ab2f9a3ffc5579e25ba14747514746009d5b70e4835664162023-01-17 11:54:1873 days 21 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d1370xa5fd1f6e7980fd5ca9d062a762030d449990bbbf0 DEV
0x4b02bde82cf07755db54f83ab2f9a3ffc5579e25ba14747514746009d5b70e4835664162023-01-17 11:54:1873 days 21 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d1370xa5fd1f6e7980fd5ca9d062a762030d449990bbbf0.192344937870362807 DEV
0x4b02bde82cf07755db54f83ab2f9a3ffc5579e25ba14747514746009d5b70e4835664162023-01-17 11:54:1873 days 21 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d1370x81eeaf8f98e9dfb48923cab9d234013fcd8c4b8d0 DEV
0x4b02bde82cf07755db54f83ab2f9a3ffc5579e25ba14747514746009d5b70e4835664162023-01-17 11:54:1873 days 21 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d137 0x3a9c9484e0e82596fb4c2e7fec97106c4c2310fa0 DEV
0x4b02bde82cf07755db54f83ab2f9a3ffc5579e25ba14747514746009d5b70e4835664162023-01-17 11:54:1873 days 21 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d1370xf6899c78240f9055f6a896d63df4dbfbbaa4eace0 DEV
0x9a860608168f142cb5f5c8d6f9dadaea8bea6119382f9f7b43b34f32f029477c35664152023-01-17 11:54:0073 days 21 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d137 0x3a9c9484e0e82596fb4c2e7fec97106c4c2310fa0 DEV
0x9a860608168f142cb5f5c8d6f9dadaea8bea6119382f9f7b43b34f32f029477c35664152023-01-17 11:54:0073 days 21 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d1370xa5fd1f6e7980fd5ca9d062a762030d449990bbbf0 DEV
0x9a860608168f142cb5f5c8d6f9dadaea8bea6119382f9f7b43b34f32f029477c35664152023-01-17 11:54:0073 days 21 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d1370xa5fd1f6e7980fd5ca9d062a762030d449990bbbf0.01 DEV
0x9a860608168f142cb5f5c8d6f9dadaea8bea6119382f9f7b43b34f32f029477c35664152023-01-17 11:54:0073 days 21 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d137 0x3a9c9484e0e82596fb4c2e7fec97106c4c2310fa0 DEV
0x2209034714bd1a1fbdcb6b46d0c0f9e5ddc7d11cb88f167423ab19646b865dac34986722023-01-06 10:18:3084 days 23 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d1370x9bdbdb4a8f7f816c87a67f5281484ed902c6b9421.92501784223192426 DEV
0x2209034714bd1a1fbdcb6b46d0c0f9e5ddc7d11cb88f167423ab19646b865dac34986722023-01-06 10:18:3084 days 23 hrs ago 0xa5fd1f6e7980fd5ca9d062a762030d449990bbbf0x46ab221ac1e51968f4c05e57137011c27696d1371.92501784223192426 DEV
0x2209034714bd1a1fbdcb6b46d0c0f9e5ddc7d11cb88f167423ab19646b865dac34986722023-01-06 10:18:3084 days 23 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d1370xa5fd1f6e7980fd5ca9d062a762030d449990bbbf0 DEV
0x2209034714bd1a1fbdcb6b46d0c0f9e5ddc7d11cb88f167423ab19646b865dac34986722023-01-06 10:18:3084 days 23 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d137 0xe418d94dd0ead33e4edc1b34b111a11158ac1bdf0 DEV
0x2209034714bd1a1fbdcb6b46d0c0f9e5ddc7d11cb88f167423ab19646b865dac34986722023-01-06 10:18:3084 days 23 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d1370x9f6e0e615585a8248de15362393565415e71de3d0 DEV
0x2209034714bd1a1fbdcb6b46d0c0f9e5ddc7d11cb88f167423ab19646b865dac34986722023-01-06 10:18:3084 days 23 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d137 0xe418d94dd0ead33e4edc1b34b111a11158ac1bdf0 DEV
0xea844aed3c886d3d54f8a2428cb334c0e941487de596d5fcaf387045eadf8b3934986712023-01-06 10:18:1884 days 23 hrs ago 0x46ab221ac1e51968f4c05e57137011c27696d1370x9bdbdb4a8f7f816c87a67f5281484ed902c6b9421.596893843847801205 DEV
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UniswapV2Router02

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at moonbase.moonscan.io on 2022-04-25
*/

/**
 *Submitted for verification at moonbase.moonscan.io on 2022-03-25
*/

// Sources flattened with hardhat v2.6.8 https://hardhat.org

// File contracts/uniswapv2/interfaces/IUniswapV2Pair.sol


// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    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, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    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 skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}


// File contracts/uniswapv2/libraries/SafeMath.sol



pragma solidity =0.6.12;

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

library SafeMathUniswap {
    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 contracts/uniswapv2/libraries/UniswapV2Library.sol



pragma solidity >=0.5.0;

library UniswapV2Library {
    using SafeMathUniswap 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'63b34ef62996dbb5d4710d546f9b2612c77544b2dc001ebecd5287378d17a904' // 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,) = IUniswapV2Pair(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;
    }

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

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

    // 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++) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]);
            amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
        }
    }

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


// File contracts/uniswapv2/libraries/TransferHelper.sol



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, uint 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: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint 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: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint 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: TRANSFER_FROM_FAILED');
    }

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


// File contracts/uniswapv2/interfaces/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 swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}


// File contracts/uniswapv2/interfaces/IUniswapV2Router02.sol



pragma solidity >=0.6.2;

interface IUniswapV2Router02 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,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}


// File contracts/uniswapv2/interfaces/IUniswapV2Factory.sol



pragma solidity >=0.5.0;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function migrator() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
    function setMigrator(address) external;
}


// File contracts/uniswapv2/interfaces/IERC20.sol



pragma solidity >=0.5.0;

interface IERC20Uniswap {
    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 contracts/uniswapv2/interfaces/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 contracts/uniswapv2/UniswapV2Router02.sol



pragma solidity =0.6.12;







contract UniswapV2Router02 is IUniswapV2Router02 {
    using SafeMathUniswap for uint;

    address public immutable override factory;
    address public immutable override WETH;

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'UniswapV2Router: 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
    }

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {
            IUniswapV2Factory(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, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'UniswapV2Router: 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 virtual 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 = IUniswapV2Pair(pair).mint(to);
    }
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external virtual 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 = IUniswapV2Pair(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 virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IUniswapV2Pair(pair).burn(to);
        (address token0,) = UniswapV2Library.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT');
    }
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual 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 virtual override returns (uint amountA, uint amountB) {
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IUniswapV2Pair(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 virtual override returns (uint amountToken, uint amountETH) {
        address pair = UniswapV2Library.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IUniswapV2Pair(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 virtual override ensure(deadline) returns (uint amountETH) {
        (, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IERC20Uniswap(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 virtual override returns (uint amountETH) {
        address pair = UniswapV2Library.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token, liquidity, amountTokenMin, amountETHMin, to, deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = UniswapV2Library.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;
            IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = UniswapV2Library.sortTokens(input, output);
            IUniswapV2Pair pair = IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
            (uint reserve0, uint reserve1,) = pair.getReserves();
            (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
            amountInput = IERC20Uniswap(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = UniswapV2Library.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (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));
        }
    }
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20Uniswap(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20Uniswap(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'UniswapV2Router: 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 = IERC20Uniswap(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20Uniswap(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
    {
        require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20Uniswap(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }

    // **** LIBRARY FUNCTIONS ****
    function quote(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) {
        return UniswapV2Library.quote(amountA, reserveA, reserveB);
    }

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut)
        public
        pure
        virtual
        override
        returns (uint amountOut)
    {
        return UniswapV2Library.getAmountOut(amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut)
        public
        pure
        virtual
        override
        returns (uint amountIn)
    {
        return UniswapV2Library.getAmountIn(amountOut, reserveIn, reserveOut);
    }

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

    function getAmountsIn(uint amountOut, address[] memory path)
        public
        view
        virtual
        override
        returns (uint[] memory amounts)
    {
        return UniswapV2Library.getAmountsIn(factory, amountOut, path);
    }
}

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

60c060405234801561001057600080fd5b50604051620046e7380380620046e78339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614562620001856000398061015f5280610ce45280610d1f5280610e16528061103452806113be528061152452806118d352806119ae5280611a885280611b565280611c9c5280611d245280611f605280611fdb528061208f528061215b52806121f05280612264528061274752806129b15280612a075280612a3b5280612aaf5280612c3d5280612d805280612e08525080610ea45280610f7b52806110fa5280611133528061126e528061144c528061150252806116725280611be95280611d565280611eb0528061229652806124d452806126cc52806126f55280612725528061289252806129e55280612cd05280612e3a52806136c0528061370352806139dd5280613b535280613f445280613ffd52806140b052506145626000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110f3945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611129565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b038135169060200135611223565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561136e565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356114fa565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611608565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b038135169060200135611885565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b0e565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611e58565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611e65565b34801561088157600080fd5b5061088a611f5e565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611f82565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611f8f565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b038135169060200135612115565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612486565b348015610a1c57600080fd5b5061088a6126ca565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506126ee945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561271b565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e0013561282f565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612962565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612bf5565b6000808242811015610cde576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612486565b9093509150610d1d898685612f6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da585836130d8565b50965096945050505050565b6000610dbe8484846131d0565b949350505050565b60608142811015610e0c576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9f576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b610efd7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b91508682600184510381518110610f1057fe5b60200260200101511015610f555760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b610ff386866000818110610f6557fe5b905060200201356001600160a01b031633610fd97f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fa757fe5b905060200201356001600160a01b03168b8b6001818110610fc457fe5b905060200201356001600160a01b03166133f4565b85600081518110610fe657fe5b60200260200101516134b4565b61103282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613611915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061107157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110af57600080fd5b505af11580156110c3573d6000803e3d6000fd5b505050506110e884836001855103815181106110db57fe5b60200260200101516130d8565b509695505050505050565b60606111207f0000000000000000000000000000000000000000000000000000000000000000848461384e565b90505b92915050565b60008060006111597f00000000000000000000000000000000000000000000000000000000000000008f8f6133f4565b9050600087611168578c61116c565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111e257600080fd5b505af11580156111f6573d6000803e3d6000fd5b505050506112098f8f8f8f8f8f8f612486565b809450819550505050509b509b9950505050505050505050565b60608142811015611269576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6112c77f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b915086826001845103815181106112da57fe5b6020026020010151101561131f5760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b61132f86866000818110610f6557fe5b6110e882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b606081428110156113b4576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106113ee57fe5b905060200201356001600160a01b03166001600160a01b031614611447576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b6114a57f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b915086826000815181106114b557fe5b60200260200101511115610f555760405162461bcd60e51b81526004018080602001828103825260278152602001806144036027913960400191505060405180910390fd5b6000806115487f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006133f4565b9050600086611557578b61155b565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115d157600080fd5b505af11580156115e5573d6000803e3d6000fd5b505050506115f78d8d8d8d8d8d611f8f565b9d9c50505050505050505050505050565b804281101561164c576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6116c18585600081811061165c57fe5b905060200201356001600160a01b0316336116bb7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b905060200201356001600160a01b03168a8a6001818110610fc457fe5b8a6134b4565b6000858560001981018181106116d357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561172f57600080fd5b505afa158015611743573d6000803e3d6000fd5b505050506040513d602081101561175957600080fd5b5051604080516020888102828101820190935288825292935061179b929091899189918291850190849080828437600092019190915250889250613986915050565b8661183e82888860001981018181106117b057fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b505afa158015611820573d6000803e3d6000fd5b505050506040513d602081101561183657600080fd5b505190613c88565b101561187b5760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b5050505050505050565b80428110156118c9576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061190357fe5b905060200201356001600160a01b03166001600160a01b03161461195c576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b61196c8585600081811061165c57fe5b6119aa858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613986915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a1957600080fd5b505afa158015611a2d573d6000803e3d6000fd5b505050506040513d6020811015611a4357600080fd5b5051905086811015611a865760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611aec57600080fd5b505af1158015611b00573d6000803e3d6000fd5b5050505061187b84826130d8565b60608142811015611b54576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611b8b57fe5b905060200201356001600160a01b03166001600160a01b031614611be4576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b611c427f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b91508682600184510381518110611c5557fe5b60200260200101511015611c9a5760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611cd657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d0957600080fd5b505af1158015611d1d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d827f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110611d8f57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611ddd57600080fd5b505af1158015611df1573d6000803e3d6000fd5b505050506040513d6020811015611e0757600080fd5b5051611e0f57fe5b611e4e82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b5095945050505050565b6000610dbe848484613cd8565b60608142811015611eab576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b611f097f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b91508682600081518110611f1957fe5b6020026020010151111561131f5760405162461bcd60e51b81526004018080602001828103825260278152602001806144036027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe848484613db0565b60008142811015611fd5576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b612004887f00000000000000000000000000000000000000000000000000000000000000008989893089612486565b90508092505061208d88858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561205c57600080fd5b505afa158015612070573d6000803e3d6000fd5b505050506040513d602081101561208657600080fd5b5051612f6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120f357600080fd5b505af1158015612107573d6000803e3d6000fd5b505050506110e884836130d8565b8042811015612159576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061219057fe5b905060200201356001600160a01b03166001600160a01b0316146121e9576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561224957600080fd5b505af115801561225d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122c27f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561230957600080fd5b505af115801561231d573d6000803e3d6000fd5b505050506040513d602081101561233357600080fd5b505161233b57fe5b60008686600019810181811061234d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156123a957600080fd5b505afa1580156123bd573d6000803e3d6000fd5b505050506040513d60208110156123d357600080fd5b505160408051602089810282810182019093528982529293506124159290918a918a918291850190849080828437600092019190915250899250613986915050565b8761183e828989600019810181811061242a57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b60008082428110156124cd576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b60006124fa7f00000000000000000000000000000000000000000000000000000000000000008c8c6133f4565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561255557600080fd5b505af1158015612569573d6000803e3d6000fd5b505050506040513d602081101561257f57600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156125cc57600080fd5b505af11580156125e0573d6000803e3d6000fd5b505050506040513d60408110156125f657600080fd5b508051602090910151909250905060006126108e8e613e56565b509050806001600160a01b03168e6001600160a01b031614612633578183612636565b82825b90975095508a87101561267a5760405162461bcd60e51b815260040180806020018281038252602681526020018061444a6026913960400191505060405180910390fd5b898610156126b95760405162461bcd60e51b81526004018080602001828103825260268152602001806143906026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111207f000000000000000000000000000000000000000000000000000000000000000084846132a8565b600080600061276b7f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006133f4565b905060008761277a578c61277e565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156127f457600080fd5b505af1158015612808573d6000803e3d6000fd5b5050505061281a8e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b60008060008342811015612878576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6128868c8c8c8c8c8c613f34565b909450925060006128b87f00000000000000000000000000000000000000000000000000000000000000008e8e6133f4565b90506128c68d3383886134b4565b6128d28c3383876134b4565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561292157600080fd5b505af1158015612935573d6000803e3d6000fd5b505050506040513d602081101561294b57600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156129ab576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6129d98a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613f34565b90945092506000612a2b7f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006133f4565b9050612a398b3383886134b4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a9457600080fd5b505af1158015612aa8573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b2457600080fd5b505af1158015612b38573d6000803e3d6000fd5b505050506040513d6020811015612b4e57600080fd5b5051612b5657fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612ba557600080fd5b505af1158015612bb9573d6000803e3d6000fd5b505050506040513d6020811015612bcf57600080fd5b5051925034841015612be757612be7338534036130d8565b505096509650969350505050565b60608142811015612c3b576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612c7257fe5b905060200201356001600160a01b03166001600160a01b031614612ccb576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b612d297f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b91503482600081518110612d3957fe5b60200260200101511115612d7e5760405162461bcd60e51b81526004018080602001828103825260278152602001806144036027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612dba57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612ded57600080fd5b505af1158015612e01573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612e667f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110612e7357fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ec157600080fd5b505af1158015612ed5573d6000803e3d6000fd5b505050506040513d6020811015612eeb57600080fd5b5051612ef357fe5b612f3282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b81600081518110612f3f57fe5b6020026020010151341115611e4e57611e4e3383600081518110612f5f57fe5b602002602001015134036130d8565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310612feb5780518252601f199092019160209182019101612fcc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461304d576040519150601f19603f3d011682016040523d82523d6000602084013e613052565b606091505b5091509150818015613080575080511580613080575080806020019051602081101561307d57600080fd5b50515b6130d1576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131245780518252601f199092019160209182019101613105565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613186576040519150601f19603f3d011682016040523d82523d6000602084013e61318b565b606091505b50509050806131cb5760405162461bcd60e51b81526004018080602001828103825260238152602001806144706023913960400191505060405180910390fd5b505050565b60008084116132105760405162461bcd60e51b815260040180806020018281038252602b8152602001806144e2602b913960400191505060405180910390fd5b6000831180156132205750600082115b61325b5760405162461bcd60e51b81526004018080602001828103825260288152602001806143b66028913960400191505060405180910390fd5b6000613269856103e56141c5565b9050600061327782856141c5565b905060006132918361328b886103e86141c5565b90614228565b905080828161329c57fe5b04979650505050505050565b6060600282511015613301576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561331957600080fd5b50604051908082528060200260200182016040528015613343578160200160208202803683370190505b509050828160008151811061335457fe5b60200260200101818152505060005b60018351038110156133ec576000806133a68786858151811061338257fe5b602002602001015187866001018151811061339957fe5b6020026020010151614277565b915091506133c88484815181106133b957fe5b602002602001015183836131d0565b8484600101815181106133d757fe5b60209081029190910101525050600101613363565b509392505050565b60008060006134038585613e56565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f63b34ef62996dbb5d4710d546f9b2612c77544b2dc001ebecd5287378d17a904609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106135395780518252601f19909201916020918201910161351a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461359b576040519150601f19603f3d011682016040523d82523d6000602084013e6135a0565b606091505b50915091508180156135ce5750805115806135ce57508080602001905160208110156135cb57600080fd5b50515b6136095760405162461bcd60e51b81526004018080602001828103825260248152602001806144be6024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156138485760008084838151811061362f57fe5b602002602001015185846001018151811061364657fe5b602002602001015191509150600061365e8383613e56565b509050600087856001018151811061367257fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146136a0578260006136a4565b6000835b91509150600060028a510388106136bb57886136fc565b6136fc7f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106136ef57fe5b60200260200101516133f4565b90506137297f000000000000000000000000000000000000000000000000000000000000000088886133f4565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613766576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156137ce5781810151838201526020016137b6565b50505050905090810190601f1680156137fb5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561381d57600080fd5b505af1158015613831573d6000803e3d6000fd5b505060019099019850613614975050505050505050565b50505050565b60606002825110156138a7576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff811180156138bf57600080fd5b506040519080825280602002602001820160405280156138e9578160200160208202803683370190505b50905082816001835103815181106138fd57fe5b60209081029190910101528151600019015b80156133ec5760008061393f8786600186038151811061392b57fe5b602002602001015187868151811061339957fe5b9150915061396184848151811061395257fe5b60200260200101518383613cd8565b84600185038151811061397057fe5b602090810291909101015250506000190161390f565b60005b60018351038110156131cb576000808483815181106139a457fe5b60200260200101518584600101815181106139bb57fe5b60200260200101519150915060006139d38383613e56565b5090506000613a037f000000000000000000000000000000000000000000000000000000000000000085856133f4565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613a4457600080fd5b505afa158015613a58573d6000803e3d6000fd5b505050506040513d6060811015613a6e57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613aa4578284613aa7565b83835b91509150613afc828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b9550613b098683836131d0565b945050505050600080856001600160a01b0316886001600160a01b031614613b3357826000613b37565b6000835b91509150600060028c51038a10613b4e578a613b82565b613b827f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106136ef57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613c0c578181015183820152602001613bf4565b50505050905090810190601f168015613c395780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613c5b57600080fd5b505af1158015613c6f573d6000803e3d6000fd5b50506001909b019a506139899950505050505050505050565b80820382811115611123576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6000808411613d185760405162461bcd60e51b815260040180806020018281038252602c81526020018061433f602c913960400191505060405180910390fd5b600083118015613d285750600082115b613d635760405162461bcd60e51b81526004018080602001828103825260288152602001806143b66028913960400191505060405180910390fd5b6000613d7b6103e8613d7586886141c5565b906141c5565b90506000613d8f6103e5613d758689613c88565b9050613da66001828481613d9f57fe5b0490614228565b9695505050505050565b6000808411613df05760405162461bcd60e51b81526004018080602001828103825260258152602001806143de6025913960400191505060405180910390fd5b600083118015613e005750600082115b613e3b5760405162461bcd60e51b81526004018080602001828103825260288152602001806143b66028913960400191505060405180910390fd5b82613e4685846141c5565b81613e4d57fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613eaa5760405162461bcd60e51b815260040180806020018281038252602581526020018061436b6025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613eca578284613ecd565b83835b90925090506001600160a01b038216613f2d576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015613fc057600080fd5b505afa158015613fd4573d6000803e3d6000fd5b505050506040513d6020811015613fea57600080fd5b50516001600160a01b031614156140a8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b15801561407b57600080fd5b505af115801561408f573d6000803e3d6000fd5b505050506040513d60208110156140a557600080fd5b50505b6000806140d67f00000000000000000000000000000000000000000000000000000000000000008b8b614277565b915091508160001480156140e8575080155b156140f8578793508692506141b8565b6000614105898484613db0565b9050878111614158578581101561414d5760405162461bcd60e51b81526004018080602001828103825260268152602001806143906026913960400191505060405180910390fd5b8894509250826141b6565b6000614165898486613db0565b90508981111561417157fe5b878110156141b05760405162461bcd60e51b815260040180806020018281038252602681526020018061444a6026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806141e0575050808202828282816141dd57fe5b04145b611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006142868585613e56565b5090506000806142978888886133f4565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156142cf57600080fd5b505afa1580156142e3573d6000803e3d6000fd5b505050506040513d60608110156142f957600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461432c57808261432f565b81815b9099909850965050505050505056fe556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e56414c49445f50415448000000556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c4544556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54556e69737761705632526f757465723a20455850495245440000000000000000a26469706673582212209a118d8fcf8c765f37a834f2d93c4eaec6a6b7ffacaacf2d7164d2472f7e4b2a64736f6c634300060c0033000000000000000000000000f6899c78240f9055f6a896d63df4dbfbbaa4eace000000000000000000000000a5fd1f6e7980fd5ca9d062a762030d449990bbbf

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

000000000000000000000000f6899c78240f9055f6a896d63df4dbfbbaa4eace000000000000000000000000a5fd1f6e7980fd5ca9d062a762030d449990bbbf

-----Decoded View---------------
Arg [0] : _factory (address): 0xf6899c78240f9055f6a896d63df4dbfbbaa4eace
Arg [1] : _WETH (address): 0xa5fd1f6e7980fd5ca9d062a762030d449990bbbf

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f6899c78240f9055f6a896d63df4dbfbbaa4eace
Arg [1] : 000000000000000000000000a5fd1f6e7980fd5ca9d062a762030d449990bbbf


Deployed ByteCode Sourcemap

16650:18605:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17139:10;-1:-1:-1;;;;;17153:4:0;17139:18;;17132:26;;;;16650:18605;;;;;21289:673;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21289:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34199:262;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34199:262:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;28465:850;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28465:850:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28465:850:0;;;;;;;;;;;;-1:-1:-1;28465:850:0;-1:-1:-1;;;;;;28465:850:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34999:253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34999:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34999:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34999:253:0;;-1:-1:-1;34999:253:0;;-1:-1:-1;;;;;34999:253:0:i;21968:677::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21968:677:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25682:628::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25682:628:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25682:628:0;;;;;;;;;;;;-1:-1:-1;25682:628:0;-1:-1:-1;;;;;;25682:628:0;;;;;;;;:::i;27631:828::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27631:828:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27631:828:0;;;;;;;;;;;;-1:-1:-1;27631:828:0;-1:-1:-1;;;;;;27631:828:0;;;;;;;;:::i;24112:718::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24112:718:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31505:728::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31505:728:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31505:728:0;;;;;;;;;;;;-1:-1:-1;31505:728:0;-1:-1:-1;;;;;;31505:728:0;;;;;;;;:::i;33109:850::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33109:850:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33109:850:0;;;;;;;;;;;;-1:-1:-1;33109:850:0;-1:-1:-1;;;;;;33109:850:0;;;;;;;;:::i;26928:697::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26928:697:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26928:697:0;;;;;;;;;;;;-1:-1:-1;26928:697:0;-1:-1:-1;;;;;;26928:697:0;;;;;;;;:::i;34469:261::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34469:261:0;;;;;;;;;;;;:::i;26316:606::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26316:606:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26316:606:0;;;;;;;;;;;;-1:-1:-1;26316:606:0;-1:-1:-1;;;;;;26316:606:0;;;;;;;;:::i;16793:38::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;16793:38:0;;;;;;;;;;;;;;34003:188;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34003:188:0;;;;;;;;;;;;:::i;23399:707::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23399:707:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32239:864::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32239:864:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32239:864:0;;;;;;;;;;;;-1:-1:-1;32239:864:0;-1:-1:-1;;;;;;32239:864:0;;;;;;;;:::i;20418:865::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20418:865:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16745:41::-;;;;;;;;;;;;;:::i;34738:253::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34738:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34738:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34738:253:0;;-1:-1:-1;34738:253:0;;-1:-1:-1;;;;;34738:253:0:i;22651:669::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22651:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18657:738::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18657:738:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;19401:974;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19401:974:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29321:810::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29321:810:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29321:810:0;;;;;;;;;;;;-1:-1:-1;29321:810:0;-1:-1:-1;;;;;;29321:810:0;;;;;;;;:::i;21289:673::-;21526:16;21544:14;21507:8;16902:15;16890:8;:27;;16882:64;;;;;-1:-1:-1;;;16882:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16882:64:0;;;;;;;;;;;;;;;21598:196:::1;21628:5;21648:4;21667:9;21691:14;21720:12;21755:4;21775:8;21598:15;:196::i;:::-;21571:223:::0;;-1:-1:-1;21571:223:0;-1:-1:-1;21805:51:0::1;21833:5:::0;21840:2;21571:223;21805:27:::1;:51::i;:::-;21873:4;-1:-1:-1::0;;;;;21867:20:0::1;;21888:9;21867:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21909:45;21940:2;21944:9;21909:30;:45::i;:::-;21289:673:::0;;;;;;;;;;:::o;34199:262::-;34352:14;34391:62;34421:8;34431:9;34442:10;34391:29;:62::i;:::-;34384:69;34199:262;-1:-1:-1;;;;34199:262:0:o;28465:850::-;28679:21;28651:8;16902:15;16890:8;:27;;16882:64;;;;;-1:-1:-1;;;16882:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16882:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28751:4:0::1;28726:29;:4:::0;;-1:-1:-1;;28731:15:0;;28726:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;28726:21:0::1;-1:-1:-1::0;;;;;28726:29:0::1;;28718:71;;;::::0;;-1:-1:-1;;;28718:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;28718:71:0;;;;;;;;;;;;;::::1;;28810:55;28841:7;28850:8;28860:4;;28810:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28810:30:0::1;::::0;-1:-1:-1;;;28810:55:0:i:1;:::-;28800:65;;28915:12;28884:7;28909:1;28892:7;:14;:18;28884:27;;;;;;;;;;;;;;:43;;28876:99;;;;-1:-1:-1::0;;;28876:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28986:141;29032:4;;29037:1;29032:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29032:7:0::1;29041:10;29053:51;29078:7;29087:4;;29092:1;29087:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29087:7:0::1;29096:4;;29101:1;29096:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29096:7:0::1;29053:24;:51::i;:::-;29106:7;29114:1;29106:10;;;;;;;;;;;;;;28986:31;:141::i;:::-;29138:35;29144:7;29153:4;;29138:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29167:4:0::1;::::0;-1:-1:-1;29138:5:0::1;::::0;-1:-1:-1;;29138:35:0:i:1;:::-;29190:4;-1:-1:-1::0;;;;;29184:20:0::1;;29205:7;29230:1;29213:7;:14;:18;29205:27;;;;;;;;;;;;;;29184:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29244:63;29275:2;29279:7;29304:1;29287:7;:14;:18;29279:27;;;;;;;;;;;;;;29244:30;:63::i;:::-;28465:850:::0;;;;;;;;;:::o;34999:253::-;35143:21;35189:55;35219:7;35228:9;35239:4;35189:29;:55::i;:::-;35182:62;;34999:253;;;;;:::o;21968:677::-;22274:12;22288;22313;22328:49;22353:7;22362:6;22370;22328:24;:49::i;:::-;22313:64;;22388:10;22401;:33;;22425:9;22401:33;;;-1:-1:-1;;22401:33:0;22445:80;;;-1:-1:-1;;;22445:80:0;;22473:10;22445:80;;;;22493:4;22445:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22388:46;;-1:-1:-1;;;;;;22445:27:0;;;;;:80;;;;;-1:-1:-1;;22445:80:0;;;;;;;;-1:-1:-1;22445:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22557;22573:6;22581;22589:9;22600:10;22612;22624:2;22628:8;22557:15;:80::i;:::-;22536:101;;;;;;;;21968:677;;;;;;;;;;;;;;;;:::o;25682:628::-;25906:21;25887:8;16902:15;16890:8;:27;;16882:64;;;;;-1:-1:-1;;;16882:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16882:64:0;;;;;;;;;;;;;;;25950:55:::1;25981:7;25990:8;26000:4;;25950:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25950:30:0::1;::::0;-1:-1:-1;;;25950:55:0:i:1;:::-;25940:65;;26055:12;26024:7;26049:1;26032:7;:14;:18;26024:27;;;;;;;;;;;;;;:43;;26016:99;;;;-1:-1:-1::0;;;26016:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26126:141;26172:4;;26177:1;26172:7;;;;;;26126:141;26278:24;26284:7;26293:4;;26278:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26299:2:0;;-1:-1:-1;26278:5:0::1;::::0;-1:-1:-1;;26278:24:0:i:1;27631:828::-:0;27845:21;27817:8;16902:15;16890:8;:27;;16882:64;;;;;-1:-1:-1;;;16882:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16882:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27917:4:0::1;27892:29;:4:::0;;-1:-1:-1;;27897:15:0;;27892:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27892:21:0::1;-1:-1:-1::0;;;;;27892:29:0::1;;27884:71;;;::::0;;-1:-1:-1;;;27884:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27884:71:0;;;;;;;;;;;;;::::1;;27976:55;28006:7;28015:9;28026:4;;27976:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27976:29:0::1;::::0;-1:-1:-1;;;27976:55:0:i:1;:::-;27966:65;;28064:11;28050:7;28058:1;28050:10;;;;;;;;;;;;;;:25;;28042:77;;;;-1:-1:-1::0;;;28042:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24112:718:::0;24430:14;24457:12;24472:46;24497:7;24506:5;24513:4;24472:24;:46::i;:::-;24457:61;;24529:10;24542;:33;;24566:9;24542:33;;;-1:-1:-1;;24542:33:0;24586:80;;;-1:-1:-1;;;24586:80:0;;24614:10;24586:80;;;;24634:4;24586:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24529:46;;-1:-1:-1;;;;;;24586:27:0;;;;;:80;;;;;-1:-1:-1;;24586:80:0;;;;;;;;-1:-1:-1;24586:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24689:133;24751:5;24758:9;24769:14;24785:12;24799:2;24803:8;24689:47;:133::i;:::-;24677:145;24112:718;-1:-1:-1;;;;;;;;;;;;;24112:718:0:o;31505:728::-;31739:8;16902:15;16890:8;:27;;16882:64;;;;;-1:-1:-1;;;16882:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16882:64:0;;;;;;;;;;;;;;;31760:139:::1;31806:4;;31811:1;31806:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31806:7:0::1;31815:10;31827:51;31852:7;31861:4;;31866:1;31861:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31861:7:0::1;31870:4;;31875:1;31870:7;;;;;;31827:51;31880:8;31760:31;:139::i;:::-;31910:18;31945:4:::0;;-1:-1:-1;;31950:15:0;;31945:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31945:21:0::1;-1:-1:-1::0;;;;;31931:46:0::1;;31978:2;31931:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;31931:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31931:50:0;31992:44:::1;::::0;;31931:50:::1;31992:44:::0;;::::1;::::0;;;;;;;;;;;31931:50;;-1:-1:-1;31992:44:0::1;::::0;;;32027:4;;;;;;31992:44;::::1;::::0;32027:4;;31992:44;32027:4;31992:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;32033:2:0;;-1:-1:-1;31992:34:0::1;::::0;-1:-1:-1;;31992:44:0:i:1;:::-;32142:12:::0;32069:69:::1;32124:13:::0;32083:4;;-1:-1:-1;;32088:15:0;;32083:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32083:21:0::1;-1:-1:-1::0;;;;;32069:46:0::1;;32116:2;32069:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;32069:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32069:50:0;;:54:::1;:69::i;:::-;:85;;32047:178;;;;-1:-1:-1::0;;;32047:178:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16957:1;31505:728:::0;;;;;;;:::o;33109:850::-;33376:8;16902:15;16890:8;:27;;16882:64;;;;;-1:-1:-1;;;16882:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16882:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33435:4:0::1;33410:29;:4:::0;;-1:-1:-1;;33415:15:0;;33410:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33410:21:0::1;-1:-1:-1::0;;;;;33410:29:0::1;;33402:71;;;::::0;;-1:-1:-1;;;33402:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33402:71:0;;;;;;;;;;;;;::::1;;33484:139;33530:4;;33535:1;33530:7;;;;;;33484:139;33634:55;33669:4;;33634:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33683:4:0::1;::::0;-1:-1:-1;33634:34:0::1;::::0;-1:-1:-1;;33634:55:0:i:1;:::-;33700:14;33731:4;-1:-1:-1::0;;;;;33717:29:0::1;;33755:4;33717:44;;;;;;;;;;;;;-1:-1:-1::0;;;;;33717:44:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33717:44:0;;-1:-1:-1;33780:25:0;;::::1;;33772:81;;;;-1:-1:-1::0;;;33772:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33870:4;-1:-1:-1::0;;;;;33864:20:0::1;;33885:9;33864:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33906:45;33937:2;33941:9;33906:30;:45::i;26928:697::-:0;27144:21;27116:8;16902:15;16890:8;:27;;16882:64;;;;;-1:-1:-1;;;16882:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16882:64:0;;;;;;;;;;;;;;;27202:4:::1;-1:-1:-1::0;;;;;27191:15:0::1;:4;;27196:1;27191:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27191:7:0::1;-1:-1:-1::0;;;;;27191:15:0::1;;27183:57;;;::::0;;-1:-1:-1;;;27183:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27183:57:0;;;;;;;;;;;;;::::1;;27261:56;27292:7;27301:9;27312:4;;27261:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27261:30:0::1;::::0;-1:-1:-1;;;27261:56:0:i:1;:::-;27251:66;;27367:12;27336:7;27361:1;27344:7;:14;:18;27336:27;;;;;;;;;;;;;;:43;;27328:99;;;;-1:-1:-1::0;;;27328:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27444:4;-1:-1:-1::0;;;;;27438:19:0::1;;27465:7;27473:1;27465:10;;;;;;;;;;;;;;27438:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;27502:4;-1:-1:-1::0;;;;;27496:20:0::1;;27517:51;27542:7;27551:4;;27556:1;27551:7;;;;;;27517:51;27570:7;27578:1;27570:10;;;;;;;;;;;;;;27496:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;27496:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27496:85:0;27489:93:::1;;;;27593:24;27599:7;27608:4;;27593:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27614:2:0;;-1:-1:-1;27593:5:0::1;::::0;-1:-1:-1;;27593:24:0:i:1;:::-;26928:697:::0;;;;;;;;:::o;34469:261::-;34622:13;34660:62;34689:9;34700;34711:10;34660:28;:62::i;26316:606::-;26540:21;26521:8;16902:15;16890:8;:27;;16882:64;;;;;-1:-1:-1;;;16882:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16882:64:0;;;;;;;;;;;;;;;26584:55:::1;26614:7;26623:9;26634:4;;26584:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26584:29:0::1;::::0;-1:-1:-1;;;26584:55:0:i:1;:::-;26574:65;;26672:11;26658:7;26666:1;26658:10;;;;;;;;;;;;;;:25;;26650:77;;;;-1:-1:-1::0;;;26650:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16793:38:::0;;;:::o;34003:188::-;34100:12;34132:51;34155:7;34164:8;34174;34132:22;:51::i;23399:707::-;23665:14;23646:8;16902:15;16890:8;:27;;16882:64;;;;;-1:-1:-1;;;16882:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16882:64:0;;;;;;;;;;;;;;;23708:196:::1;23738:5;23758:4;23777:9;23801:14;23830:12;23865:4;23885:8;23708:15;:196::i;:::-;23692:212;;;;;;23915:85;23943:5;23950:2;23968:5;-1:-1:-1::0;;;;;23954:30:0::1;;23993:4;23954:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;23954:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23954:45:0;23915:27:::1;:85::i;:::-;24017:4;-1:-1:-1::0;;;;;24011:20:0::1;;24032:9;24011:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24053:45;24084:2;24088:9;24053:30;:45::i;32239:864::-:0;32499:8;16902:15;16890:8;:27;;16882:64;;;;;-1:-1:-1;;;16882:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16882:64:0;;;;;;;;;;;;;;;32544:4:::1;-1:-1:-1::0;;;;;32533:15:0::1;:4;;32538:1;32533:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32533:7:0::1;-1:-1:-1::0;;;;;32533:15:0::1;;32525:57;;;::::0;;-1:-1:-1;;;32525:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;32525:57:0;;;;;;;;;;;;;::::1;;32593:13;32609:9;32593:25;;32635:4;-1:-1:-1::0;;;;;32629:19:0::1;;32656:8;32629:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;32691:4;-1:-1:-1::0;;;;;32685:20:0::1;;32706:51;32731:7;32740:4;;32745:1;32740:7;;;;;;32706:51;32759:8;32685:83;;;;;;;;;;;;;-1:-1:-1::0;;;;;32685:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32685:83:0;32678:91:::1;;;;32780:18;32815:4:::0;;-1:-1:-1;;32820:15:0;;32815:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32815:21:0::1;-1:-1:-1::0;;;;;32801:46:0::1;;32848:2;32801:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;32801:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32801:50:0;32862:44:::1;::::0;;32801:50:::1;32862:44:::0;;::::1;::::0;;;;;;;;;;;32801:50;;-1:-1:-1;32862:44:0::1;::::0;;;32897:4;;;;;;32862:44;::::1;::::0;32897:4;;32862:44;32897:4;32862:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;32903:2:0;;-1:-1:-1;32862:34:0::1;::::0;-1:-1:-1;;32862:44:0:i:1;:::-;33012:12:::0;32939:69:::1;32994:13:::0;32953:4;;-1:-1:-1;;32958:15:0;;32953:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32953:21:0::1;-1:-1:-1::0;;;;;32939:46:0::1;;32986:2;32939:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;32939:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;20418:865:::0;20672:12;20686;20653:8;16902:15;16890:8;:27;;16882:64;;;;;-1:-1:-1;;;16882:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16882:64:0;;;;;;;;;;;;;;;20711:12:::1;20726:49;20751:7;20760:6;20768;20726:24;:49::i;:::-;20786:62;::::0;;-1:-1:-1;;;20786:62:0;;20820:10:::1;20786:62;::::0;::::1;::::0;-1:-1:-1;;;;;20786:33:0;::::1;:62:::0;;;;;;;;;;;;;;20711:64;;-1:-1:-1;20786:33:0;;::::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;20786:33:0;:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;20916:29:0::1;::::0;;-1:-1:-1;;;20916:29:0;;-1:-1:-1;;;;;20916:29:0;;::::1;;::::0;::::1;::::0;;;20886:12:::1;::::0;;;20916:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;20886:12;20916:25;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20916:29:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20916:29:0;-1:-1:-1;20957:14:0::1;20976:43;21004:6:::0;21012;20976:27:::1;:43::i;:::-;20956:63;;;21061:6;-1:-1:-1::0;;;;;21051:16:0::1;:6;-1:-1:-1::0;;;;;21051:16:0::1;;:58;;21092:7;21101;21051:58;;;21071:7;21080;21051:58;21030:79:::0;;-1:-1:-1;21030:79:0;-1:-1:-1;21128:21:0;;::::1;;21120:72;;;;-1:-1:-1::0;;;21120:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21222:10;21211:7;:21;;21203:72;;;;-1:-1:-1::0;;;21203:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16957:1;;;;20418:865:::0;;;;;;;;;;;:::o;16745:41::-;;;:::o;34738:253::-;34882:21;34928:55;34959:7;34968:8;34978:4;34928:30;:55::i;22651:669::-;22940:16;22958:14;22985:12;23000:46;23025:7;23034:5;23041:4;23000:24;:46::i;:::-;22985:61;;23057:10;23070;:33;;23094:9;23070:33;;;-1:-1:-1;;23070:33:0;23114:80;;;-1:-1:-1;;;23114:80:0;;23142:10;23114:80;;;;23162:4;23114:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23057:46;;-1:-1:-1;;;;;;23114:27:0;;;;;:80;;;;;-1:-1:-1;;23114:80:0;;;;;;;;-1:-1:-1;23114:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23232;23251:5;23258:9;23269:14;23285:12;23299:2;23303:8;23232:18;:80::i;:::-;23205:107;;;;-1:-1:-1;22651:669:0;-1:-1:-1;;;;;;;;;;;;;22651:669:0:o;18657:738::-;18945:12;18959;18973:14;18926:8;16902:15;16890:8;:27;;16882:64;;;;;-1:-1:-1;;;16882:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16882:64:0;;;;;;;;;;;;;;;19021:85:::1;19035:6;19043;19051:14;19067;19083:10;19095;19021:13;:85::i;:::-;19000:106:::0;;-1:-1:-1;19000:106:0;-1:-1:-1;19117:12:0::1;19132:49;19157:7;19166:6:::0;19174;19132:24:::1;:49::i;:::-;19117:64;;19192:66;19224:6;19232:10;19244:4;19250:7;19192:31;:66::i;:::-;19269;19301:6;19309:10;19321:4;19327:7;19269:31;:66::i;:::-;19373:4;-1:-1:-1::0;;;;;19358:25:0::1;;19384:2;19358:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;19358:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19358:29:0;18657:738;;;;-1:-1:-1;19358:29:0;;-1:-1:-1;18657:738:0;;-1:-1:-1;;;;;;;;;18657:738:0:o;19401:974::-;19654:16;19672:14;19688;19635:8;16902:15;16890:8;:27;;16882:64;;;;;-1:-1:-1;;;16882:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16882:64:0;;;;;;;;;;;;;;;19742:176:::1;19770:5;19790:4;19809:18;19842:9;19866:14;19895:12;19742:13;:176::i;:::-;19715:203:::0;;-1:-1:-1;19715:203:0;-1:-1:-1;19929:12:0::1;19944:46;19969:7;19978:5:::0;19985:4:::1;19944:24;:46::i;:::-;19929:61;;20001:69;20033:5;20040:10;20052:4;20058:11;20001:31;:69::i;:::-;20087:4;-1:-1:-1::0;;;;;20081:19:0::1;;20108:9;20081:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;20144:4;-1:-1:-1::0;;;;;20138:20:0::1;;20159:4;20165:9;20138:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;20138:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20138:37:0;20131:45:::1;;;;20214:4;-1:-1:-1::0;;;;;20199:25:0::1;;20225:2;20199:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;20199:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20199:29:0;;-1:-1:-1;20279:9:0::1;:21:::0;-1:-1:-1;20275:92:0::1;;;20302:65;20333:10;20357:9;20345;:21;20302:30;:65::i;:::-;16957:1;19401:974:::0;;;;;;;;;;;:::o;29321:810::-;29534:21;29506:8;16902:15;16890:8;:27;;16882:64;;;;;-1:-1:-1;;;16882:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16882:64:0;;;;;;;;;;;;;;;29592:4:::1;-1:-1:-1::0;;;;;29581:15:0::1;:4;;29586:1;29581:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29581:7:0::1;-1:-1:-1::0;;;;;29581:15:0::1;;29573:57;;;::::0;;-1:-1:-1;;;29573:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;29573:57:0;;;;;;;;;;;;;::::1;;29651:55;29681:7;29690:9;29701:4;;29651:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29651:29:0::1;::::0;-1:-1:-1;;;29651:55:0:i:1;:::-;29641:65;;29739:9;29725:7;29733:1;29725:10;;;;;;;;;;;;;;:23;;29717:75;;;;-1:-1:-1::0;;;29717:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29809:4;-1:-1:-1::0;;;;;29803:19:0::1;;29830:7;29838:1;29830:10;;;;;;;;;;;;;;29803:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;29867:4;-1:-1:-1::0;;;;;29861:20:0::1;;29882:51;29907:7;29916:4;;29921:1;29916:7;;;;;;29882:51;29935:7;29943:1;29935:10;;;;;;;;;;;;;;29861:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;29861:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;29861:85:0;29854:93:::1;;;;29958:24;29964:7;29973:4;;29958:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29979:2:0;;-1:-1:-1;29958:5:0::1;::::0;-1:-1:-1;;29958:24:0:i:1;:::-;30045:7;30053:1;30045:10;;;;;;;;;;;;;;30033:9;:22;30029:94;;;30057:66;30088:10;30112:7;30120:1;30112:10;;;;;;;;;;;;;;30100:9;:22;30057:30;:66::i;8487:361::-:0;8682:45;;;-1:-1:-1;;;;;8682:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8682:45:0;-1:-1:-1;;;8682:45:0;;;8671:57;;;;8636:12;;8650:17;;8671:10;;;;8682:45;8671:57;;;8682:45;8671:57;;8682:45;8671:57;;;;;;;;;;-1:-1:-1;;8671:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8635:93;;;;8747:7;:57;;;;-1:-1:-1;8759:11:0;;:16;;:44;;;8790:4;8779:24;;;;;;;;;;;;;;;-1:-1:-1;8779:24:0;8759:44;8739:101;;;;;-1:-1:-1;;;8739:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8487:361;;;;;:::o;9266:195::-;9374:12;;;9336;9374;;;;;;;;;-1:-1:-1;;;;;9353:7:0;;;9367:5;;9353:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9353:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9335:52;;;9406:7;9398:55;;;;-1:-1:-1;;;9398:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9266:195;;;:::o;5562:517::-;5655:14;5701:1;5690:8;:12;5682:68;;;;-1:-1:-1;;;5682:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5781:1;5769:9;:13;:31;;;;;5799:1;5786:10;:14;5769:31;5761:84;;;;-1:-1:-1;;;5761:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5856:20;5879:17;:8;5892:3;5879:12;:17::i;:::-;5856:40;-1:-1:-1;5907:14:0;5924:31;5856:40;5944:10;5924:19;:31::i;:::-;5907:48;-1:-1:-1;5966:16:0;5985:40;6009:15;5985:19;:9;5999:4;5985:13;:19::i;:::-;:23;;:40::i;:::-;5966:59;;6060:11;6048:9;:23;;;;;;;5562:517;-1:-1:-1;;;;;;;5562:517:0:o;6754:511::-;6855:21;6912:1;6897:4;:11;:16;;6889:59;;;;;-1:-1:-1;;;6889:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6980:4;:11;6969:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6969:23:0;;6959:33;;7016:8;7003:7;7011:1;7003:10;;;;;;;;;;;;;:21;;;;;7040:6;7035:223;7066:1;7052:4;:11;:15;7048:1;:19;7035:223;;;7090:14;7106:15;7125:42;7137:7;7146:4;7151:1;7146:7;;;;;;;;;;;;;;7155:4;7160:1;7164;7160:5;7155:11;;;;;;;;;;;;;;7125;:42::i;:::-;7089:78;;;;7199:47;7212:7;7220:1;7212:10;;;;;;;;;;;;;;7224:9;7235:10;7199:12;:47::i;:::-;7182:7;7190:1;7194;7190:5;7182:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;7069:3:0;;7035:223;;;;6754:511;;;;;:::o;4079:478::-;4168:12;4194:14;4210;4228:26;4239:6;4247;4228:10;:26::i;:::-;4392:32;;;-1:-1:-1;;4392:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4382:43;;;;;;-1:-1:-1;;;;;;4295:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4285:262;;;;;;;;;4079:478;-1:-1:-1;;;;;4079:478:0:o;8856:402::-;9081:51;;;-1:-1:-1;;;;;9081:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9081:51:0;-1:-1:-1;;;9081:51:0;;;9070:63;;;;9035:12;;9049:17;;9070:10;;;;9081:51;9070:63;;;9081:51;9070:63;;9081:51;9070:63;;;;;;;;;;-1:-1:-1;;9070:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9034:99;;;;9152:7;:57;;;;-1:-1:-1;9164:11:0;;:16;;:44;;;9195:4;9184:24;;;;;;;;;;;;;;;-1:-1:-1;9184:24:0;9164:44;9144:106;;;;-1:-1:-1;;;9144:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8856:402;;;;;;:::o;24941:735::-;25048:6;25043:626;25074:1;25060:4;:11;:15;25056:1;:19;25043:626;;;25098:13;25113:14;25132:4;25137:1;25132:7;;;;;;;;;;;;;;25141:4;25146:1;25150;25146:5;25141:11;;;;;;;;;;;;;;25097:56;;;;25169:14;25188:42;25216:5;25223:6;25188:27;:42::i;:::-;25168:62;;;25245:14;25262:7;25270:1;25274;25270:5;25262:14;;;;;;;;;;;;;;25245:31;;25292:15;25309;25337:6;-1:-1:-1;;;;;25328:15:0;:5;-1:-1:-1;;;;;25328:15:0;;:61;;25370:9;25386:1;25328:61;;;25352:1;25356:9;25328:61;25291:98;;;;25404:10;25435:1;25421:4;:11;:15;25417:1;:19;:82;;25496:3;25417:82;;;25439:54;25464:7;25473:6;25481:4;25486:1;25490;25486:5;25481:11;;;;;;;;;;;;;;25439:24;:54::i;:::-;25404:95;;25529:48;25554:7;25563:5;25570:6;25529:24;:48::i;:::-;-1:-1:-1;;;;;25514:69:0;;25602:10;25614;25626:2;25640:1;25630:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25630:12:0;;25514:143;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25514:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25077:3:0;;;;;-1:-1:-1;25043:626:0;;-1:-1:-1;;;;;;;;25043:626:0;;;24941:735;;;:::o;7346:532::-;7447:21;7504:1;7489:4;:11;:16;;7481:59;;;;;-1:-1:-1;;;7481:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7572:4;:11;7561:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7561:23:0;;7551:33;;7625:9;7595:7;7620:1;7603:7;:14;:18;7595:27;;;;;;;;;;;;;;;;;:39;7659:11;;-1:-1:-1;;7659:15:0;7645:226;7676:5;;7645:226;;7704:14;7720:15;7739:42;7751:7;7760:4;7769:1;7765;:5;7760:11;;;;;;;;;;;;;;7773:4;7778:1;7773:7;;;;;;;7739:42;7703:78;;;;7813:46;7825:7;7833:1;7825:10;;;;;;;;;;;;;;7837:9;7848:10;7813:11;:46::i;:::-;7796:7;7808:1;7804;:5;7796:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;7683:3:0;7645:226;;30278:1221;30391:6;30386:1106;30417:1;30403:4;:11;:15;30399:1;:19;30386:1106;;;30441:13;30456:14;30475:4;30480:1;30475:7;;;;;;;;;;;;;;30484:4;30489:1;30493;30489:5;30484:11;;;;;;;;;;;;;;30440:56;;;;30512:14;30531:42;30559:5;30566:6;30531:27;:42::i;:::-;30511:62;;;30588:19;30625:48;30650:7;30659:5;30666:6;30625:24;:48::i;:::-;30588:86;;30689:16;30720:17;30808:13;30823;30841:4;-1:-1:-1;;;;;30841:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30841:18:0;;;;;;;-1:-1:-1;;;;;30807:52:0;;;;-1:-1:-1;30807:52:0;;-1:-1:-1;30875:17:0;;-1:-1:-1;;;;;30916:15:0;;;;;;;:61;;30958:8;30968;30916:61;;;30935:8;30945;30916:61;30874:103;;;;31006:63;31056:12;31020:5;-1:-1:-1;;;;;31006:30:0;;31045:4;31006:45;;;;;;;;;;;;;-1:-1:-1;;;;;31006:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;:63;30992:77;;31099:71;31129:11;31142:12;31156:13;31099:29;:71::i;:::-;31084:86;;30386:1106;;;;31201:15;31218;31246:6;-1:-1:-1;;;;;31237:15:0;:5;-1:-1:-1;;;;;31237:15:0;;:67;;31282:12;31301:1;31237:67;;;31261:1;31265:12;31237:67;31200:104;;;;31319:10;31350:1;31336:4;:11;:15;31332:1;:19;:82;;31411:3;31332:82;;;31354:54;31379:7;31388:6;31396:4;31401:1;31405;31401:5;31396:11;;;;;;;31354:54;31467:12;;;31477:1;31467:12;;;;;;;;;;-1:-1:-1;;;31429:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;31429:51:0;;;;;;;;;;;;;;;;;;;;;;31319:95;;-1:-1:-1;31429:9:0;;;;;;31439:10;;31451;;31319:95;;31467:12;;31429:51;;;;;;;;31467:12;;31429:51;;;;31467:12;;31429:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30420:3:0;;;;;-1:-1:-1;30386:1106:0;;-1:-1:-1;;;;;;;;;;30386:1106:0;3084:129;3168:5;;;3163:16;;;;3155:50;;;;;-1:-1:-1;;;3155:50:0;;;;;;;;;;;;-1:-1:-1;;;3155:50:0;;;;;;;;;;;;;;6200:472;6293:13;6339:1;6327:9;:13;6319:70;;;;-1:-1:-1;;;6319:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6420:1;6408:9;:13;:31;;;;;6438:1;6425:10;:14;6408:31;6400:84;;;;-1:-1:-1;;;6400:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6495:14;6512:34;6541:4;6512:24;:9;6526;6512:13;:24::i;:::-;:28;;:34::i;:::-;6495:51;-1:-1:-1;6557:16:0;6576:34;6606:3;6576:25;:10;6591:9;6576:14;:25::i;:34::-;6557:53;;6632:32;6662:1;6645:11;6633:9;:23;;;;;;;6632:29;:32::i;:::-;6621:43;6200:472;-1:-1:-1;;;;;;6200:472:0:o;5119:321::-;5201:12;5244:1;5234:7;:11;5226:61;;;;-1:-1:-1;;;5226:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5317:1;5306:8;:12;:28;;;;;5333:1;5322:8;:12;5306:28;5298:81;;;;-1:-1:-1;;;5298:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5424:8;5400:21;:7;5412:8;5400:11;:21::i;:::-;:32;;;;;;;5119:321;-1:-1:-1;;;;5119:321:0:o;3638:349::-;3713:14;3729;3774:6;-1:-1:-1;;;;;3764:16:0;:6;-1:-1:-1;;;;;3764:16:0;;;3756:66;;;;-1:-1:-1;;;3756:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3861:6;-1:-1:-1;;;;;3852:15:0;:6;-1:-1:-1;;;;;3852:15:0;;:53;;3890:6;3898;3852:53;;;3871:6;3879;3852:53;3833:72;;-1:-1:-1;3833:72:0;-1:-1:-1;;;;;;3924:20:0;;3916:63;;;;;-1:-1:-1;;;3916:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3638:349;;;;;:::o;17261:1390::-;17479:12;17493;17636:1;-1:-1:-1;;;;;17574:64:0;17592:7;-1:-1:-1;;;;;17574:34:0;;17609:6;17617;17574:50;;;;;;;;;;;;;-1:-1:-1;;;;;17574:50:0;;;;;;-1:-1:-1;;;;;17574:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17574:50:0;-1:-1:-1;;;;;17574:64:0;;17570:150;;;17673:7;-1:-1:-1;;;;;17655:37:0;;17693:6;17701;17655:53;;;;;;;;;;;;;-1:-1:-1;;;;;17655:53:0;;;;;;-1:-1:-1;;;;;17655:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17570:150:0;17731:13;17746;17763:53;17792:7;17801:6;17809;17763:28;:53::i;:::-;17730:86;;;;17831:8;17843:1;17831:13;:30;;;;-1:-1:-1;17848:13:0;;17831:30;17827:817;;;17900:14;;-1:-1:-1;17916:14:0;;-1:-1:-1;17827:817:0;;;17964:19;17986:58;18009:14;18025:8;18035;17986:22;:58::i;:::-;17964:80;;18081:14;18063;:32;18059:574;;18142:10;18124:14;:28;;18116:79;;;;-1:-1:-1;;;18116:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18236:14;;-1:-1:-1;18252:14:0;-1:-1:-1;18252:14:0;18059:574;;;18308:19;18330:58;18353:14;18369:8;18379;18330:22;:58::i;:::-;18308:80;;18432:14;18414;:32;;18407:40;;;;18492:10;18474:14;:28;;18466:79;;;;-1:-1:-1;;;18466:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18586:14;-1:-1:-1;18602:14:0;;-1:-1:-1;18059:574:0;17827:817;;17261:1390;;;;;;;;;;;:::o;3221:142::-;3273:6;3300;;;:30;;-1:-1:-1;;3315:5:0;;;3329:1;3324;3315:5;3324:1;3310:15;;;;;:20;3300:30;3292:63;;;;;-1:-1:-1;;;3292:63:0;;;;;;;;;;;;-1:-1:-1;;;3292:63:0;;;;;;;;;;;;;;2948:128;3032:5;;;3027:16;;;;3019:49;;;;;-1:-1:-1;;;3019:49:0;;;;;;;;;;;;-1:-1:-1;;;3019:49:0;;;;;;;;;;;;;;4615:391;4708:13;4723;4750:14;4769:26;4780:6;4788;4769:10;:26::i;:::-;4749:46;;;4807:13;4822;4855:32;4863:7;4872:6;4880;4855:7;:32::i;:::-;-1:-1:-1;;;;;4840:60:0;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4840:62:0;;;;;;;-1:-1:-1;;;;;4806:96:0;;;;-1:-1:-1;4806:96:0;;-1:-1:-1;;;;;;4936:16:0;;;;;;;:62;;4979:8;4989;4936:62;;;4956:8;4966;4936:62;4913:85;;;;-1:-1:-1;4615:391:0;-1:-1:-1;;;;;;;4615:391:0:o

Swarm Source

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