Contract 0x61934f31ee682a8dd43844ff20a4d51531127b8b 3

 

Contract Overview

Balance:
0 BNB

BNB Value:
$0.00

Token:
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x0fcd59cf2fd26913fc2c24eed698d42dee715b72b87ff5550fea585ddc0e2c87Remove Liquidity...101339382021-08-18 10:15:3630 days 22 hrs ago0x60ed07d99d0d6856f5fbf6a8823d8f96dda32f33 IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0 BNB0.001079505
0x571ad8a7b1cc046c9d401757cdf64016706e3d43e52ca61ba234b7512e87ed42Remove Liquidity...101257052021-08-18 3:23:4331 days 5 hrs ago0x60ed07d99d0d6856f5fbf6a8823d8f96dda32f33 IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0 BNB0.001074485
0x90040ffb73a9a93edf1e18362004eebbea0984b511bd9cd60a2c6999f5db1136Swap ETH For Exa...95366382021-07-28 2:31:2352 days 6 hrs ago0xf1a35243286cc9749072b5c024ae8ba14ad2efd6 IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0.003023900910899 BNB0.000712575
0x73c4b1c42b3504f52bdcde571d575bf60efd242f4fcc562aee6efb5b49a81726Swap Exact Token...94698142021-07-25 16:12:3154 days 16 hrs ago0xbe676a680343de114f7e71df9397bdeabe77551e IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0 BNB0.00061427
0x48a199ec22322a268967d2f0aa2e9f2675328b394c1bec09a69af1c30dbb4286Swap ETH For Exa...93773242021-07-22 10:37:1157 days 22 hrs ago0x196efa227d36bdb11b0f764d1aa80c19c91466c1 IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0.000684518532245 BNB0.000637635
0x0409b602ab52fe093c5deb1e8ec1424f17339126c5301113b4e705f0219172f8Swap ETH For Exa...93773112021-07-22 10:36:3257 days 22 hrs ago0x196efa227d36bdb11b0f764d1aa80c19c91466c1 IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0.000673073889636 BNB0.000637635
0xb3e1b92ce2519cc3459d76e5a56f1da7af234a7faf27ef70e136056ab2c31845Swap ETH For Exa...93772722021-07-22 10:34:3557 days 22 hrs ago0x196efa227d36bdb11b0f764d1aa80c19c91466c1 IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0.00053041260476 BNB0.000637575
0xac24884735b76aab2466f7a7a814bcb534edfe463423d445b927486ecb41fda1Swap ETH For Exa...93772662021-07-22 10:34:1757 days 22 hrs ago0x196efa227d36bdb11b0f764d1aa80c19c91466c1 IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0.001295669965889 BNB0.000637635
0x28d1b6274418d3eba47a63d5a2a0289c4e6068b3f9874907e3e978ea8a5ecca8Swap ETH For Exa...93772592021-07-22 10:33:5657 days 22 hrs ago0x196efa227d36bdb11b0f764d1aa80c19c91466c1 IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0.000630048032782 BNB0.000637635
0x2331e48d90cca3f98e77345385c4fe1c27a6022e48b31d478bf7e6805fe92cb0Swap ETH For Exa...93772562021-07-22 10:33:4757 days 22 hrs ago0x196efa227d36bdb11b0f764d1aa80c19c91466c1 IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0.000125194788697 BNB0.000712575
0x11daa290794f231b1d2998166350186f9fca7fefcc565cfe5a9a2539f280e998Swap Exact Token...93485532021-07-21 10:37:5858 days 22 hrs ago0xa216d71bda39af1aefd9664b79b21053bc821c3c IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0 BNB0.000613785
0xbefd927323a2ee3a20f8057be9d3d7766609a59e93034f5e9e6052a9c0bf6f0dSwap Exact ETH F...93353902021-07-20 23:39:4959 days 9 hrs ago0x3ad1beeba96468c93399f0c3e7beb4145eaedb58 IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0.003 BNB0.00059768
0x77b073cd15634ffb565c54e07b6ed4a0564844206a385ab069b63b9710a57ad7Swap Exact ETH F...93353712021-07-20 23:38:5259 days 9 hrs ago0x3ad1beeba96468c93399f0c3e7beb4145eaedb58 IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0.003 BNB0.00059768
0xe18e82444ac1eeb88a4bfe47a9e7236da807f2348c737d0e87268999b1a8572cSwap Exact Token...93298852021-07-20 19:04:3359 days 14 hrs ago0x76ba7ab1c46acd2afec5f8a19ab466c698efd77d IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0 BNB0.000527855
0xdb40e4900aa75b8141532f787b9393e7bb322649e8eb221a033325198ca74717Swap Exact Token...93298612021-07-20 19:03:2159 days 14 hrs ago0x76ba7ab1c46acd2afec5f8a19ab466c698efd77d IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0 BNB0.000602735
0x4f7ba1a86df23fe229a560745630fe68fe49a9979289bc3d274cfdaf13c026e4Swap Exact Token...93298262021-07-20 19:01:3659 days 14 hrs ago0x76ba7ab1c46acd2afec5f8a19ab466c698efd77d IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0 BNB0.000602735
0xd9d71a27baf5dc20edaeecaedad6fdf73edb560095a3ba958b93d7dd35d26b1fSwap Exact Token...93297952021-07-20 19:00:0359 days 14 hrs ago0x76ba7ab1c46acd2afec5f8a19ab466c698efd77d IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0 BNB0.000602735
0xdf2d947c9c9d325ae66445ff315368af16140e2db5a42505cd2d0f5a3242cf60Swap Exact Token...93297652021-07-20 18:58:3359 days 14 hrs ago0x76ba7ab1c46acd2afec5f8a19ab466c698efd77d IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0 BNB0.000602735
0x6d76b97eec53e030d1577067d633d73e1c06ccbf8dac9558f402e072a7d81a66Swap Exact Token...93297302021-07-20 18:56:4859 days 14 hrs ago0x76ba7ab1c46acd2afec5f8a19ab466c698efd77d IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0 BNB0.000602735
0x11885b42369fc25e13390f88ce87d60b51b429ee5e1080e31262633eaeb515f2Swap Exact Token...93296662021-07-20 18:53:3659 days 14 hrs ago0x76ba7ab1c46acd2afec5f8a19ab466c698efd77d IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0 BNB0.000602735
0x4aa9635eeee1b02eafcb1ccb94720cf1e6f5d8c8797d36972df79653136c97efSwap Exact Token...93295922021-07-20 18:49:5459 days 14 hrs ago0x76ba7ab1c46acd2afec5f8a19ab466c698efd77d IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0 BNB0.000602735
0x45250a38a02209d869ecad6d602fe1848954b6826278e4f118c0f6df6200bf0eSwap Exact Token...93295422021-07-20 18:47:2459 days 14 hrs ago0x76ba7ab1c46acd2afec5f8a19ab466c698efd77d IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0 BNB0.000677735
0x24bd73c676739cc218eead329ea89e3194f729dfbdeb94dab6610d2232e5e963Remove Liquidity...93250742021-07-20 15:04:0059 days 18 hrs ago0x17b1d9a1a8f0363e04bccdf2839cb107b2297774 IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0 BNB0.001027735
0x30105e11b496fb1b155d79b71caf02605fbcc3247a6523bf12e30c6564cbe3beSwap Exact Token...93214982021-07-20 12:04:5259 days 21 hrs ago0xf638fdacd17b13494ed38014765c575111fcfd75 IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0 BNB0.00061452
0x96eca4c65d24a04ff7dddda263863f74022ec0bcc537d34758a62e3571717589Remove Liquidity...93214672021-07-20 12:03:1959 days 21 hrs ago0xf638fdacd17b13494ed38014765c575111fcfd75 IN  0x61934f31ee682a8dd43844ff20a4d51531127b8b0 BNB0.001079385
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x0fcd59cf2fd26913fc2c24eed698d42dee715b72b87ff5550fea585ddc0e2c87101339382021-08-18 10:15:3630 days 22 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b0x60ed07d99d0d6856f5fbf6a8823d8f96dda32f330.841082847401260974 BNB
0x0fcd59cf2fd26913fc2c24eed698d42dee715b72b87ff5550fea585ddc0e2c87101339382021-08-18 10:15:3630 days 22 hrs ago Binance: WBNB Token 0x61934f31ee682a8dd43844ff20a4d51531127b8b0.841082847401260974 BNB
0x571ad8a7b1cc046c9d401757cdf64016706e3d43e52ca61ba234b7512e87ed42101257052021-08-18 3:23:4331 days 5 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b0x60ed07d99d0d6856f5fbf6a8823d8f96dda32f330.713338516842058596 BNB
0x571ad8a7b1cc046c9d401757cdf64016706e3d43e52ca61ba234b7512e87ed42101257052021-08-18 3:23:4331 days 5 hrs ago Binance: WBNB Token 0x61934f31ee682a8dd43844ff20a4d51531127b8b0.713338516842058596 BNB
0x90040ffb73a9a93edf1e18362004eebbea0984b511bd9cd60a2c6999f5db113695366382021-07-28 2:31:2352 days 6 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b0xf1a35243286cc9749072b5c024ae8ba14ad2efd60.000023999213578565 BNB
0x90040ffb73a9a93edf1e18362004eebbea0984b511bd9cd60a2c6999f5db113695366382021-07-28 2:31:2352 days 6 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b Binance: WBNB Token0.002999901697320666 BNB
0x73c4b1c42b3504f52bdcde571d575bf60efd242f4fcc562aee6efb5b49a8172694698142021-07-25 16:12:3154 days 16 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b0xbe676a680343de114f7e71df9397bdeabe77551e0.00198390544339595 BNB
0x73c4b1c42b3504f52bdcde571d575bf60efd242f4fcc562aee6efb5b49a8172694698142021-07-25 16:12:3154 days 16 hrs ago Binance: WBNB Token 0x61934f31ee682a8dd43844ff20a4d51531127b8b0.00198390544339595 BNB
0x48a199ec22322a268967d2f0aa2e9f2675328b394c1bec09a69af1c30dbb428693773242021-07-22 10:37:1157 days 22 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b0x196efa227d36bdb11b0f764d1aa80c19c91466c10.000005432686763853 BNB
0x48a199ec22322a268967d2f0aa2e9f2675328b394c1bec09a69af1c30dbb428693773242021-07-22 10:37:1157 days 22 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b Binance: WBNB Token0.000679085845481742 BNB
0x0409b602ab52fe093c5deb1e8ec1424f17339126c5301113b4e705f0219172f893773112021-07-22 10:36:3257 days 22 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b0x196efa227d36bdb11b0f764d1aa80c19c91466c10.000005341856266959 BNB
0x0409b602ab52fe093c5deb1e8ec1424f17339126c5301113b4e705f0219172f893773112021-07-22 10:36:3257 days 22 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b Binance: WBNB Token0.000667732033369959 BNB
0xb3e1b92ce2519cc3459d76e5a56f1da7af234a7faf27ef70e136056ab2c3184593772722021-07-22 10:34:3557 days 22 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b0x196efa227d36bdb11b0f764d1aa80c19c91466c10.000004209623847308 BNB
0xb3e1b92ce2519cc3459d76e5a56f1da7af234a7faf27ef70e136056ab2c3184593772722021-07-22 10:34:3557 days 22 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b Binance: WBNB Token0.000526202980913604 BNB
0xac24884735b76aab2466f7a7a814bcb534edfe463423d445b927486ecb41fda193772662021-07-22 10:34:1757 days 22 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b0x196efa227d36bdb11b0f764d1aa80c19c91466c10.000010283094967378 BNB
0xac24884735b76aab2466f7a7a814bcb534edfe463423d445b927486ecb41fda193772662021-07-22 10:34:1757 days 22 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b Binance: WBNB Token0.001285386870922291 BNB
0x28d1b6274418d3eba47a63d5a2a0289c4e6068b3f9874907e3e978ea8a5ecca893772592021-07-22 10:33:5657 days 22 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b0x196efa227d36bdb11b0f764d1aa80c19c91466c10.000002964537140528 BNB
0x28d1b6274418d3eba47a63d5a2a0289c4e6068b3f9874907e3e978ea8a5ecca893772592021-07-22 10:33:5657 days 22 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b Binance: WBNB Token0.000627083495642244 BNB
0x2331e48d90cca3f98e77345385c4fe1c27a6022e48b31d478bf7e6805fe92cb093772562021-07-22 10:33:4757 days 22 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b0x196efa227d36bdb11b0f764d1aa80c19c91466c10.000000993609434105 BNB
0x2331e48d90cca3f98e77345385c4fe1c27a6022e48b31d478bf7e6805fe92cb093772562021-07-22 10:33:4757 days 22 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b Binance: WBNB Token0.000124201179263234 BNB
0x11daa290794f231b1d2998166350186f9fca7fefcc565cfe5a9a2539f280e99893485532021-07-21 10:37:5858 days 22 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b0xa216d71bda39af1aefd9664b79b21053bc821c3c0.087497277321218491 BNB
0x11daa290794f231b1d2998166350186f9fca7fefcc565cfe5a9a2539f280e99893485532021-07-21 10:37:5858 days 22 hrs ago Binance: WBNB Token 0x61934f31ee682a8dd43844ff20a4d51531127b8b0.087497277321218491 BNB
0xbefd927323a2ee3a20f8057be9d3d7766609a59e93034f5e9e6052a9c0bf6f0d93353902021-07-20 23:39:4959 days 9 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b Binance: WBNB Token0.003 BNB
0x77b073cd15634ffb565c54e07b6ed4a0564844206a385ab069b63b9710a57ad793353712021-07-20 23:38:5259 days 9 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b Binance: WBNB Token0.003 BNB
0x30105e11b496fb1b155d79b71caf02605fbcc3247a6523bf12e30c6564cbe3be93214982021-07-20 12:04:5259 days 21 hrs ago 0x61934f31ee682a8dd43844ff20a4d51531127b8b0xf638fdacd17b13494ed38014765c575111fcfd750.061246595015813026 BNB
[ 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, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-07-04
*/

/**
TG: https://t.me/satoroswap
*/

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

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'd2dfba4a3b5b96172e69c02e667a5b23a11c626dd3dace9c4fce97bb5884c002' // 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(995);
        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(995);
        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

// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.6.0;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, 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 Security Audit

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"}]

60c060405234801561001057600080fd5b50604051620046e7380380620046e78339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614562620001856000398061015f5280610ce45280610d1f5280610e16528061103452806113be528061152452806118d352806119ae5280611a885280611b565280611c9c5280611d245280611f605280611fdb528061208f528061215b52806121f05280612264528061274752806129b15280612a075280612a3b5280612aaf5280612c3d5280612d805280612e08525080610ea45280610f7b52806110fa5280611133528061126e528061144c528061150252806116725280611be95280611d565280611eb0528061229652806124d452806126cc52806126f55280612725528061289252806129e55280612cd05280612e3a52806136c0528061370352806139dd5280613b535280613f445280613ffd52806140b052506145626000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110f3945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611129565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b038135169060200135611223565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561136e565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356114fa565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611608565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b038135169060200135611885565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b0e565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611e58565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611e65565b34801561088157600080fd5b5061088a611f5e565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611f82565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611f8f565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b038135169060200135612115565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612486565b348015610a1c57600080fd5b5061088a6126ca565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506126ee945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561271b565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e0013561282f565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612962565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612bf5565b6000808242811015610cde576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612486565b9093509150610d1d898685612f6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da585836130d8565b50965096945050505050565b6000610dbe8484846131d0565b949350505050565b60608142811015610e0c576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9f576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b610efd7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b91508682600184510381518110610f1057fe5b60200260200101511015610f555760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b610ff386866000818110610f6557fe5b905060200201356001600160a01b031633610fd97f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fa757fe5b905060200201356001600160a01b03168b8b6001818110610fc457fe5b905060200201356001600160a01b03166133f4565b85600081518110610fe657fe5b60200260200101516134b4565b61103282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613611915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061107157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110af57600080fd5b505af11580156110c3573d6000803e3d6000fd5b505050506110e884836001855103815181106110db57fe5b60200260200101516130d8565b509695505050505050565b60606111207f0000000000000000000000000000000000000000000000000000000000000000848461384e565b90505b92915050565b60008060006111597f00000000000000000000000000000000000000000000000000000000000000008f8f6133f4565b9050600087611168578c61116c565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111e257600080fd5b505af11580156111f6573d6000803e3d6000fd5b505050506112098f8f8f8f8f8f8f612486565b809450819550505050509b509b9950505050505050505050565b60608142811015611269576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6112c77f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b915086826001845103815181106112da57fe5b6020026020010151101561131f5760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b61132f86866000818110610f6557fe5b6110e882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b606081428110156113b4576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106113ee57fe5b905060200201356001600160a01b03166001600160a01b031614611447576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b6114a57f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b915086826000815181106114b557fe5b60200260200101511115610f555760405162461bcd60e51b81526004018080602001828103825260278152602001806144036027913960400191505060405180910390fd5b6000806115487f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006133f4565b9050600086611557578b61155b565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115d157600080fd5b505af11580156115e5573d6000803e3d6000fd5b505050506115f78d8d8d8d8d8d611f8f565b9d9c50505050505050505050505050565b804281101561164c576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6116c18585600081811061165c57fe5b905060200201356001600160a01b0316336116bb7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b905060200201356001600160a01b03168a8a6001818110610fc457fe5b8a6134b4565b6000858560001981018181106116d357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561172f57600080fd5b505afa158015611743573d6000803e3d6000fd5b505050506040513d602081101561175957600080fd5b5051604080516020888102828101820190935288825292935061179b929091899189918291850190849080828437600092019190915250889250613986915050565b8661183e82888860001981018181106117b057fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b505afa158015611820573d6000803e3d6000fd5b505050506040513d602081101561183657600080fd5b505190613c88565b101561187b5760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b5050505050505050565b80428110156118c9576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061190357fe5b905060200201356001600160a01b03166001600160a01b03161461195c576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b61196c8585600081811061165c57fe5b6119aa858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613986915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a1957600080fd5b505afa158015611a2d573d6000803e3d6000fd5b505050506040513d6020811015611a4357600080fd5b5051905086811015611a865760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611aec57600080fd5b505af1158015611b00573d6000803e3d6000fd5b5050505061187b84826130d8565b60608142811015611b54576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611b8b57fe5b905060200201356001600160a01b03166001600160a01b031614611be4576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b611c427f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b91508682600184510381518110611c5557fe5b60200260200101511015611c9a5760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611cd657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d0957600080fd5b505af1158015611d1d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d827f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110611d8f57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611ddd57600080fd5b505af1158015611df1573d6000803e3d6000fd5b505050506040513d6020811015611e0757600080fd5b5051611e0f57fe5b611e4e82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b5095945050505050565b6000610dbe848484613cd8565b60608142811015611eab576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b611f097f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b91508682600081518110611f1957fe5b6020026020010151111561131f5760405162461bcd60e51b81526004018080602001828103825260278152602001806144036027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe848484613db0565b60008142811015611fd5576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b612004887f00000000000000000000000000000000000000000000000000000000000000008989893089612486565b90508092505061208d88858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561205c57600080fd5b505afa158015612070573d6000803e3d6000fd5b505050506040513d602081101561208657600080fd5b5051612f6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120f357600080fd5b505af1158015612107573d6000803e3d6000fd5b505050506110e884836130d8565b8042811015612159576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061219057fe5b905060200201356001600160a01b03166001600160a01b0316146121e9576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561224957600080fd5b505af115801561225d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122c27f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561230957600080fd5b505af115801561231d573d6000803e3d6000fd5b505050506040513d602081101561233357600080fd5b505161233b57fe5b60008686600019810181811061234d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156123a957600080fd5b505afa1580156123bd573d6000803e3d6000fd5b505050506040513d60208110156123d357600080fd5b505160408051602089810282810182019093528982529293506124159290918a918a918291850190849080828437600092019190915250899250613986915050565b8761183e828989600019810181811061242a57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b60008082428110156124cd576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b60006124fa7f00000000000000000000000000000000000000000000000000000000000000008c8c6133f4565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561255557600080fd5b505af1158015612569573d6000803e3d6000fd5b505050506040513d602081101561257f57600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156125cc57600080fd5b505af11580156125e0573d6000803e3d6000fd5b505050506040513d60408110156125f657600080fd5b508051602090910151909250905060006126108e8e613e56565b509050806001600160a01b03168e6001600160a01b031614612633578183612636565b82825b90975095508a87101561267a5760405162461bcd60e51b815260040180806020018281038252602681526020018061444a6026913960400191505060405180910390fd5b898610156126b95760405162461bcd60e51b81526004018080602001828103825260268152602001806143906026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111207f000000000000000000000000000000000000000000000000000000000000000084846132a8565b600080600061276b7f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006133f4565b905060008761277a578c61277e565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156127f457600080fd5b505af1158015612808573d6000803e3d6000fd5b5050505061281a8e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b60008060008342811015612878576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6128868c8c8c8c8c8c613f34565b909450925060006128b87f00000000000000000000000000000000000000000000000000000000000000008e8e6133f4565b90506128c68d3383886134b4565b6128d28c3383876134b4565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561292157600080fd5b505af1158015612935573d6000803e3d6000fd5b505050506040513d602081101561294b57600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156129ab576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6129d98a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613f34565b90945092506000612a2b7f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006133f4565b9050612a398b3383886134b4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a9457600080fd5b505af1158015612aa8573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b2457600080fd5b505af1158015612b38573d6000803e3d6000fd5b505050506040513d6020811015612b4e57600080fd5b5051612b5657fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612ba557600080fd5b505af1158015612bb9573d6000803e3d6000fd5b505050506040513d6020811015612bcf57600080fd5b5051925034841015612be757612be7338534036130d8565b505096509650969350505050565b60608142811015612c3b576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612c7257fe5b905060200201356001600160a01b03166001600160a01b031614612ccb576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b612d297f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b91503482600081518110612d3957fe5b60200260200101511115612d7e5760405162461bcd60e51b81526004018080602001828103825260278152602001806144036027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612dba57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612ded57600080fd5b505af1158015612e01573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612e667f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110612e7357fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ec157600080fd5b505af1158015612ed5573d6000803e3d6000fd5b505050506040513d6020811015612eeb57600080fd5b5051612ef357fe5b612f3282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b81600081518110612f3f57fe5b6020026020010151341115611e4e57611e4e3383600081518110612f5f57fe5b602002602001015134036130d8565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310612feb5780518252601f199092019160209182019101612fcc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461304d576040519150601f19603f3d011682016040523d82523d6000602084013e613052565b606091505b5091509150818015613080575080511580613080575080806020019051602081101561307d57600080fd5b50515b6130d1576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131245780518252601f199092019160209182019101613105565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613186576040519150601f19603f3d011682016040523d82523d6000602084013e61318b565b606091505b50509050806131cb5760405162461bcd60e51b81526004018080602001828103825260238152602001806144706023913960400191505060405180910390fd5b505050565b60008084116132105760405162461bcd60e51b815260040180806020018281038252602b8152602001806144e2602b913960400191505060405180910390fd5b6000831180156132205750600082115b61325b5760405162461bcd60e51b81526004018080602001828103825260288152602001806143b66028913960400191505060405180910390fd5b6000613269856103e36141c5565b9050600061327782856141c5565b905060006132918361328b886103e86141c5565b90614228565b905080828161329c57fe5b04979650505050505050565b6060600282511015613301576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561331957600080fd5b50604051908082528060200260200182016040528015613343578160200160208202803683370190505b509050828160008151811061335457fe5b60200260200101818152505060005b60018351038110156133ec576000806133a68786858151811061338257fe5b602002602001015187866001018151811061339957fe5b6020026020010151614277565b915091506133c88484815181106133b957fe5b602002602001015183836131d0565b8484600101815181106133d757fe5b60209081029190910101525050600101613363565b509392505050565b60008060006134038585613e56565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527fd2dfba4a3b5b96172e69c02e667a5b23a11c626dd3dace9c4fce97bb5884c002609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106135395780518252601f19909201916020918201910161351a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461359b576040519150601f19603f3d011682016040523d82523d6000602084013e6135a0565b606091505b50915091508180156135ce5750805115806135ce57508080602001905160208110156135cb57600080fd5b50515b6136095760405162461bcd60e51b81526004018080602001828103825260248152602001806144be6024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156138485760008084838151811061362f57fe5b602002602001015185846001018151811061364657fe5b602002602001015191509150600061365e8383613e56565b509050600087856001018151811061367257fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146136a0578260006136a4565b6000835b91509150600060028a510388106136bb57886136fc565b6136fc7f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106136ef57fe5b60200260200101516133f4565b90506137297f000000000000000000000000000000000000000000000000000000000000000088886133f4565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613766576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156137ce5781810151838201526020016137b6565b50505050905090810190601f1680156137fb5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561381d57600080fd5b505af1158015613831573d6000803e3d6000fd5b505060019099019850613614975050505050505050565b50505050565b60606002825110156138a7576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff811180156138bf57600080fd5b506040519080825280602002602001820160405280156138e9578160200160208202803683370190505b50905082816001835103815181106138fd57fe5b60209081029190910101528151600019015b80156133ec5760008061393f8786600186038151811061392b57fe5b602002602001015187868151811061339957fe5b9150915061396184848151811061395257fe5b60200260200101518383613cd8565b84600185038151811061397057fe5b602090810291909101015250506000190161390f565b60005b60018351038110156131cb576000808483815181106139a457fe5b60200260200101518584600101815181106139bb57fe5b60200260200101519150915060006139d38383613e56565b5090506000613a037f000000000000000000000000000000000000000000000000000000000000000085856133f4565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613a4457600080fd5b505afa158015613a58573d6000803e3d6000fd5b505050506040513d6060811015613a6e57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613aa4578284613aa7565b83835b91509150613afc828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b9550613b098683836131d0565b945050505050600080856001600160a01b0316886001600160a01b031614613b3357826000613b37565b6000835b91509150600060028c51038a10613b4e578a613b82565b613b827f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106136ef57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613c0c578181015183820152602001613bf4565b50505050905090810190601f168015613c395780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613c5b57600080fd5b505af1158015613c6f573d6000803e3d6000fd5b50506001909b019a506139899950505050505050505050565b80820382811115611123576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6000808411613d185760405162461bcd60e51b815260040180806020018281038252602c81526020018061433f602c913960400191505060405180910390fd5b600083118015613d285750600082115b613d635760405162461bcd60e51b81526004018080602001828103825260288152602001806143b66028913960400191505060405180910390fd5b6000613d7b6103e8613d7586886141c5565b906141c5565b90506000613d8f6103e3613d758689613c88565b9050613da66001828481613d9f57fe5b0490614228565b9695505050505050565b6000808411613df05760405162461bcd60e51b81526004018080602001828103825260258152602001806143de6025913960400191505060405180910390fd5b600083118015613e005750600082115b613e3b5760405162461bcd60e51b81526004018080602001828103825260288152602001806143b66028913960400191505060405180910390fd5b82613e4685846141c5565b81613e4d57fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613eaa5760405162461bcd60e51b815260040180806020018281038252602581526020018061436b6025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613eca578284613ecd565b83835b90925090506001600160a01b038216613f2d576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015613fc057600080fd5b505afa158015613fd4573d6000803e3d6000fd5b505050506040513d6020811015613fea57600080fd5b50516001600160a01b031614156140a8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b15801561407b57600080fd5b505af115801561408f573d6000803e3d6000fd5b505050506040513d60208110156140a557600080fd5b50505b6000806140d67f00000000000000000000000000000000000000000000000000000000000000008b8b614277565b915091508160001480156140e8575080155b156140f8578793508692506141b8565b6000614105898484613db0565b9050878111614158578581101561414d5760405162461bcd60e51b81526004018080602001828103825260268152602001806143906026913960400191505060405180910390fd5b8894509250826141b6565b6000614165898486613db0565b90508981111561417157fe5b878110156141b05760405162461bcd60e51b815260040180806020018281038252602681526020018061444a6026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806141e0575050808202828282816141dd57fe5b04145b611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006142868585613e56565b5090506000806142978888886133f4565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156142cf57600080fd5b505afa1580156142e3573d6000803e3d6000fd5b505050506040513d60608110156142f957600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461432c57808261432f565b81815b9099909850965050505050505056fe556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e56414c49445f50415448000000556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c4544556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54556e69737761705632526f757465723a20455850495245440000000000000000a264697066735822122092d599b0e621f859728ab58ca1becb8608a5a1b0e73e9768ed9bf80c9b9fb8c364736f6c634300060c003300000000000000000000000012b577130ffa2e8ad15d928c512f2dd2b3192d53000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

00000000000000000000000012b577130ffa2e8ad15d928c512f2dd2b3192d53000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Decoded View---------------
Arg [0] : _factory (address): 0x12b577130ffa2e8ad15d928c512f2dd2b3192d53
Arg [1] : _WETH (address): 0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000012b577130ffa2e8ad15d928c512f2dd2b3192d53
Arg [1] : 000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c


Deployed ByteCode Sourcemap

16508:18605:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16997:10;-1:-1:-1;;;;;17011:4:0;16997:18;;16990:26;;;;16508:18605;;;;;21147:673;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21147:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34057:262;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34057:262:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;28323:850;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28323:850:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28323:850:0;;;;;;;;;;;;-1:-1:-1;28323:850:0;-1:-1:-1;;;;;;28323:850:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34857:253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34857:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34857:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34857:253:0;;-1:-1:-1;34857:253:0;;-1:-1:-1;;;;;34857:253:0:i;21826:677::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21826:677:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25540:628::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25540:628:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25540:628:0;;;;;;;;;;;;-1:-1:-1;25540:628:0;-1:-1:-1;;;;;;25540:628:0;;;;;;;;:::i;27489:828::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27489:828:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27489:828:0;;;;;;;;;;;;-1:-1:-1;27489:828:0;-1:-1:-1;;;;;;27489:828:0;;;;;;;;:::i;23970:718::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23970:718:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31363:728::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31363:728:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31363:728:0;;;;;;;;;;;;-1:-1:-1;31363:728:0;-1:-1:-1;;;;;;31363:728:0;;;;;;;;:::i;32967:850::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32967:850:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32967:850:0;;;;;;;;;;;;-1:-1:-1;32967:850:0;-1:-1:-1;;;;;;32967:850:0;;;;;;;;:::i;26786:697::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26786:697:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26786:697:0;;;;;;;;;;;;-1:-1:-1;26786:697:0;-1:-1:-1;;;;;;26786:697:0;;;;;;;;:::i;34327:261::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34327:261:0;;;;;;;;;;;;:::i;26174:606::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26174:606:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26174:606:0;;;;;;;;;;;;-1:-1:-1;26174:606:0;-1:-1:-1;;;;;;26174:606:0;;;;;;;;:::i;16651:38::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;16651:38:0;;;;;;;;;;;;;;33861:188;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33861:188:0;;;;;;;;;;;;:::i;23257:707::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23257:707:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32097:864::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32097:864:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32097:864:0;;;;;;;;;;;;-1:-1:-1;32097:864:0;-1:-1:-1;;;;;;32097:864:0;;;;;;;;:::i;20276:865::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20276:865:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16603:41::-;;;;;;;;;;;;;:::i;34596:253::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34596:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34596:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34596:253:0;;-1:-1:-1;34596:253:0;;-1:-1:-1;;;;;34596:253:0:i;22509:669::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22509:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18515:738::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18515:738:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;19259:974;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19259:974:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29179:810::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29179:810:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29179:810:0;;;;;;;;;;;;-1:-1:-1;29179:810:0;-1:-1:-1;;;;;;29179:810:0;;;;;;;;:::i;21147:673::-;21384:16;21402:14;21365:8;16760:15;16748:8;:27;;16740:64;;;;;-1:-1:-1;;;16740:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16740:64:0;;;;;;;;;;;;;;;21456:196:::1;21486:5;21506:4;21525:9;21549:14;21578:12;21613:4;21633:8;21456:15;:196::i;:::-;21429:223:::0;;-1:-1:-1;21429:223:0;-1:-1:-1;21663:51:0::1;21691:5:::0;21698:2;21429:223;21663:27:::1;:51::i;:::-;21731:4;-1:-1:-1::0;;;;;21725:20:0::1;;21746:9;21725:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21767:45;21798:2;21802:9;21767:30;:45::i;:::-;21147:673:::0;;;;;;;;;;:::o;34057:262::-;34210:14;34249:62;34279:8;34289:9;34300:10;34249:29;:62::i;:::-;34242:69;34057:262;-1:-1:-1;;;;34057:262:0:o;28323:850::-;28537:21;28509:8;16760:15;16748:8;:27;;16740:64;;;;;-1:-1:-1;;;16740:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16740:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28609:4:0::1;28584:29;:4:::0;;-1:-1:-1;;28589:15:0;;28584:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;28584:21:0::1;-1:-1:-1::0;;;;;28584:29:0::1;;28576:71;;;::::0;;-1:-1:-1;;;28576:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;28576:71:0;;;;;;;;;;;;;::::1;;28668:55;28699:7;28708:8;28718:4;;28668:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28668:30:0::1;::::0;-1:-1:-1;;;28668:55:0:i:1;:::-;28658:65;;28773:12;28742:7;28767:1;28750:7;:14;:18;28742:27;;;;;;;;;;;;;;:43;;28734:99;;;;-1:-1:-1::0;;;28734:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28844:141;28890:4;;28895:1;28890:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28890:7:0::1;28899:10;28911:51;28936:7;28945:4;;28950:1;28945:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28945:7:0::1;28954:4;;28959:1;28954:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28954:7:0::1;28911:24;:51::i;:::-;28964:7;28972:1;28964:10;;;;;;;;;;;;;;28844:31;:141::i;:::-;28996:35;29002:7;29011:4;;28996:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29025:4:0::1;::::0;-1:-1:-1;28996:5:0::1;::::0;-1:-1:-1;;28996:35:0:i:1;:::-;29048:4;-1:-1:-1::0;;;;;29042:20:0::1;;29063:7;29088:1;29071:7;:14;:18;29063:27;;;;;;;;;;;;;;29042:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29102:63;29133:2;29137:7;29162:1;29145:7;:14;:18;29137:27;;;;;;;;;;;;;;29102:30;:63::i;:::-;28323:850:::0;;;;;;;;;:::o;34857:253::-;35001:21;35047:55;35077:7;35086:9;35097:4;35047:29;:55::i;:::-;35040:62;;34857:253;;;;;:::o;21826:677::-;22132:12;22146;22171;22186:49;22211:7;22220:6;22228;22186:24;:49::i;:::-;22171:64;;22246:10;22259;:33;;22283:9;22259:33;;;-1:-1:-1;;22259:33:0;22303:80;;;-1:-1:-1;;;22303:80:0;;22331:10;22303:80;;;;22351:4;22303:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22246:46;;-1:-1:-1;;;;;;22303:27:0;;;;;:80;;;;;-1:-1:-1;;22303:80:0;;;;;;;;-1:-1:-1;22303:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22415;22431:6;22439;22447:9;22458:10;22470;22482:2;22486:8;22415:15;:80::i;:::-;22394:101;;;;;;;;21826:677;;;;;;;;;;;;;;;;:::o;25540:628::-;25764:21;25745:8;16760:15;16748:8;:27;;16740:64;;;;;-1:-1:-1;;;16740:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16740:64:0;;;;;;;;;;;;;;;25808:55:::1;25839:7;25848:8;25858:4;;25808:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25808:30:0::1;::::0;-1:-1:-1;;;25808:55:0:i:1;:::-;25798:65;;25913:12;25882:7;25907:1;25890:7;:14;:18;25882:27;;;;;;;;;;;;;;:43;;25874:99;;;;-1:-1:-1::0;;;25874:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25984:141;26030:4;;26035:1;26030:7;;;;;;25984:141;26136:24;26142:7;26151:4;;26136:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26157:2:0;;-1:-1:-1;26136:5:0::1;::::0;-1:-1:-1;;26136:24:0:i:1;27489:828::-:0;27703:21;27675:8;16760:15;16748:8;:27;;16740:64;;;;;-1:-1:-1;;;16740:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16740:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27775:4:0::1;27750:29;:4:::0;;-1:-1:-1;;27755:15:0;;27750:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27750:21:0::1;-1:-1:-1::0;;;;;27750:29:0::1;;27742:71;;;::::0;;-1:-1:-1;;;27742:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27742:71:0;;;;;;;;;;;;;::::1;;27834:55;27864:7;27873:9;27884:4;;27834:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27834:29:0::1;::::0;-1:-1:-1;;;27834:55:0:i:1;:::-;27824:65;;27922:11;27908:7;27916:1;27908:10;;;;;;;;;;;;;;:25;;27900:77;;;;-1:-1:-1::0;;;27900:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23970:718:::0;24288:14;24315:12;24330:46;24355:7;24364:5;24371:4;24330:24;:46::i;:::-;24315:61;;24387:10;24400;:33;;24424:9;24400:33;;;-1:-1:-1;;24400:33:0;24444:80;;;-1:-1:-1;;;24444:80:0;;24472:10;24444:80;;;;24492:4;24444:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24387:46;;-1:-1:-1;;;;;;24444:27:0;;;;;:80;;;;;-1:-1:-1;;24444:80:0;;;;;;;;-1:-1:-1;24444:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24547:133;24609:5;24616:9;24627:14;24643:12;24657:2;24661:8;24547:47;:133::i;:::-;24535:145;23970:718;-1:-1:-1;;;;;;;;;;;;;23970:718:0:o;31363:728::-;31597:8;16760:15;16748:8;:27;;16740:64;;;;;-1:-1:-1;;;16740:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16740:64:0;;;;;;;;;;;;;;;31618:139:::1;31664:4;;31669:1;31664:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31664:7:0::1;31673:10;31685:51;31710:7;31719:4;;31724:1;31719:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31719:7:0::1;31728:4;;31733:1;31728:7;;;;;;31685:51;31738:8;31618:31;:139::i;:::-;31768:18;31803:4:::0;;-1:-1:-1;;31808:15:0;;31803:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31803:21:0::1;-1:-1:-1::0;;;;;31789:46:0::1;;31836:2;31789:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;31789:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31789:50:0;31850:44:::1;::::0;;31789:50:::1;31850:44:::0;;::::1;::::0;;;;;;;;;;;31789:50;;-1:-1:-1;31850:44:0::1;::::0;;;31885:4;;;;;;31850:44;::::1;::::0;31885:4;;31850:44;31885:4;31850:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;31891:2:0;;-1:-1:-1;31850:34:0::1;::::0;-1:-1:-1;;31850:44:0:i:1;:::-;32000:12:::0;31927:69:::1;31982:13:::0;31941:4;;-1:-1:-1;;31946:15:0;;31941:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31941:21:0::1;-1:-1:-1::0;;;;;31927:46:0::1;;31974:2;31927:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;31927:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31927:50:0;;:54:::1;:69::i;:::-;:85;;31905:178;;;;-1:-1:-1::0;;;31905:178:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16815:1;31363:728:::0;;;;;;;:::o;32967:850::-;33234:8;16760:15;16748:8;:27;;16740:64;;;;;-1:-1:-1;;;16740:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16740:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33293:4:0::1;33268:29;:4:::0;;-1:-1:-1;;33273:15:0;;33268:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33268:21:0::1;-1:-1:-1::0;;;;;33268:29:0::1;;33260:71;;;::::0;;-1:-1:-1;;;33260:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33260:71:0;;;;;;;;;;;;;::::1;;33342:139;33388:4;;33393:1;33388:7;;;;;;33342:139;33492:55;33527:4;;33492:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33541:4:0::1;::::0;-1:-1:-1;33492:34:0::1;::::0;-1:-1:-1;;33492:55:0:i:1;:::-;33558:14;33589:4;-1:-1:-1::0;;;;;33575:29:0::1;;33613:4;33575:44;;;;;;;;;;;;;-1:-1:-1::0;;;;;33575:44:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33575:44:0;;-1:-1:-1;33638:25:0;;::::1;;33630:81;;;;-1:-1:-1::0;;;33630:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33728:4;-1:-1:-1::0;;;;;33722:20:0::1;;33743:9;33722:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33764:45;33795:2;33799:9;33764:30;:45::i;26786:697::-:0;27002:21;26974:8;16760:15;16748:8;:27;;16740:64;;;;;-1:-1:-1;;;16740:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16740:64:0;;;;;;;;;;;;;;;27060:4:::1;-1:-1:-1::0;;;;;27049:15:0::1;:4;;27054:1;27049:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27049:7:0::1;-1:-1:-1::0;;;;;27049:15:0::1;;27041:57;;;::::0;;-1:-1:-1;;;27041:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27041:57:0;;;;;;;;;;;;;::::1;;27119:56;27150:7;27159:9;27170:4;;27119:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27119:30:0::1;::::0;-1:-1:-1;;;27119:56:0:i:1;:::-;27109:66;;27225:12;27194:7;27219:1;27202:7;:14;:18;27194:27;;;;;;;;;;;;;;:43;;27186:99;;;;-1:-1:-1::0;;;27186:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27302:4;-1:-1:-1::0;;;;;27296:19:0::1;;27323:7;27331:1;27323:10;;;;;;;;;;;;;;27296:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;27360:4;-1:-1:-1::0;;;;;27354:20:0::1;;27375:51;27400:7;27409:4;;27414:1;27409:7;;;;;;27375:51;27428:7;27436:1;27428:10;;;;;;;;;;;;;;27354:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;27354:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27354:85:0;27347:93:::1;;;;27451:24;27457:7;27466:4;;27451:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27472:2:0;;-1:-1:-1;27451:5:0::1;::::0;-1:-1:-1;;27451:24:0:i:1;:::-;26786:697:::0;;;;;;;;:::o;34327:261::-;34480:13;34518:62;34547:9;34558;34569:10;34518:28;:62::i;26174:606::-;26398:21;26379:8;16760:15;16748:8;:27;;16740:64;;;;;-1:-1:-1;;;16740:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16740:64:0;;;;;;;;;;;;;;;26442:55:::1;26472:7;26481:9;26492:4;;26442:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26442:29:0::1;::::0;-1:-1:-1;;;26442:55:0:i:1;:::-;26432:65;;26530:11;26516:7;26524:1;26516:10;;;;;;;;;;;;;;:25;;26508:77;;;;-1:-1:-1::0;;;26508:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16651:38:::0;;;:::o;33861:188::-;33958:12;33990:51;34013:7;34022:8;34032;33990:22;:51::i;23257:707::-;23523:14;23504:8;16760:15;16748:8;:27;;16740:64;;;;;-1:-1:-1;;;16740:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16740:64:0;;;;;;;;;;;;;;;23566:196:::1;23596:5;23616:4;23635:9;23659:14;23688:12;23723:4;23743:8;23566:15;:196::i;:::-;23550:212;;;;;;23773:85;23801:5;23808:2;23826:5;-1:-1:-1::0;;;;;23812:30:0::1;;23851:4;23812:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;23812:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23812:45:0;23773:27:::1;:85::i;:::-;23875:4;-1:-1:-1::0;;;;;23869:20:0::1;;23890:9;23869:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;23911:45;23942:2;23946:9;23911:30;:45::i;32097:864::-:0;32357:8;16760:15;16748:8;:27;;16740:64;;;;;-1:-1:-1;;;16740:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16740:64:0;;;;;;;;;;;;;;;32402:4:::1;-1:-1:-1::0;;;;;32391:15:0::1;:4;;32396:1;32391:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32391:7:0::1;-1:-1:-1::0;;;;;32391:15:0::1;;32383:57;;;::::0;;-1:-1:-1;;;32383:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;32383:57:0;;;;;;;;;;;;;::::1;;32451:13;32467:9;32451:25;;32493:4;-1:-1:-1::0;;;;;32487:19:0::1;;32514:8;32487:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;32549:4;-1:-1:-1::0;;;;;32543:20:0::1;;32564:51;32589:7;32598:4;;32603:1;32598:7;;;;;;32564:51;32617:8;32543:83;;;;;;;;;;;;;-1:-1:-1::0;;;;;32543:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32543:83:0;32536:91:::1;;;;32638:18;32673:4:::0;;-1:-1:-1;;32678:15:0;;32673:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32673:21:0::1;-1:-1:-1::0;;;;;32659:46:0::1;;32706:2;32659:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;32659:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32659:50:0;32720:44:::1;::::0;;32659:50:::1;32720:44:::0;;::::1;::::0;;;;;;;;;;;32659:50;;-1:-1:-1;32720:44:0::1;::::0;;;32755:4;;;;;;32720:44;::::1;::::0;32755:4;;32720:44;32755:4;32720:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;32761:2:0;;-1:-1:-1;32720:34:0::1;::::0;-1:-1:-1;;32720:44:0:i:1;:::-;32870:12:::0;32797:69:::1;32852:13:::0;32811:4;;-1:-1:-1;;32816:15:0;;32811:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32811:21:0::1;-1:-1:-1::0;;;;;32797:46:0::1;;32844:2;32797:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;32797:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;20276:865:::0;20530:12;20544;20511:8;16760:15;16748:8;:27;;16740:64;;;;;-1:-1:-1;;;16740:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16740:64:0;;;;;;;;;;;;;;;20569:12:::1;20584:49;20609:7;20618:6;20626;20584:24;:49::i;:::-;20644:62;::::0;;-1:-1:-1;;;20644:62:0;;20678:10:::1;20644:62;::::0;::::1;::::0;-1:-1:-1;;;;;20644:33:0;::::1;:62:::0;;;;;;;;;;;;;;20569:64;;-1:-1:-1;20644:33:0;;::::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;20644:33:0;:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;20774:29:0::1;::::0;;-1:-1:-1;;;20774:29:0;;-1:-1:-1;;;;;20774:29:0;;::::1;;::::0;::::1;::::0;;;20744:12:::1;::::0;;;20774:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;20744:12;20774:25;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20774:29:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20774:29:0;-1:-1:-1;20815:14:0::1;20834:43;20862:6:::0;20870;20834:27:::1;:43::i;:::-;20814:63;;;20919:6;-1:-1:-1::0;;;;;20909:16:0::1;:6;-1:-1:-1::0;;;;;20909:16:0::1;;:58;;20950:7;20959;20909:58;;;20929:7;20938;20909:58;20888:79:::0;;-1:-1:-1;20888:79:0;-1:-1:-1;20986:21:0;;::::1;;20978:72;;;;-1:-1:-1::0;;;20978:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21080:10;21069:7;:21;;21061:72;;;;-1:-1:-1::0;;;21061:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16815:1;;;;20276:865:::0;;;;;;;;;;;:::o;16603:41::-;;;:::o;34596:253::-;34740:21;34786:55;34817:7;34826:8;34836:4;34786:30;:55::i;22509:669::-;22798:16;22816:14;22843:12;22858:46;22883:7;22892:5;22899:4;22858:24;:46::i;:::-;22843:61;;22915:10;22928;:33;;22952:9;22928:33;;;-1:-1:-1;;22928:33:0;22972:80;;;-1:-1:-1;;;22972:80:0;;23000:10;22972:80;;;;23020:4;22972:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22915:46;;-1:-1:-1;;;;;;22972:27:0;;;;;:80;;;;;-1:-1:-1;;22972:80:0;;;;;;;;-1:-1:-1;22972:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23090;23109:5;23116:9;23127:14;23143:12;23157:2;23161:8;23090:18;:80::i;:::-;23063:107;;;;-1:-1:-1;22509:669:0;-1:-1:-1;;;;;;;;;;;;;22509:669:0:o;18515:738::-;18803:12;18817;18831:14;18784:8;16760:15;16748:8;:27;;16740:64;;;;;-1:-1:-1;;;16740:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16740:64:0;;;;;;;;;;;;;;;18879:85:::1;18893:6;18901;18909:14;18925;18941:10;18953;18879:13;:85::i;:::-;18858:106:::0;;-1:-1:-1;18858:106:0;-1:-1:-1;18975:12:0::1;18990:49;19015:7;19024:6:::0;19032;18990:24:::1;:49::i;:::-;18975:64;;19050:66;19082:6;19090:10;19102:4;19108:7;19050:31;:66::i;:::-;19127;19159:6;19167:10;19179:4;19185:7;19127:31;:66::i;:::-;19231:4;-1:-1:-1::0;;;;;19216:25:0::1;;19242:2;19216:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;19216:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19216:29:0;18515:738;;;;-1:-1:-1;19216:29:0;;-1:-1:-1;18515:738:0;;-1:-1:-1;;;;;;;;;18515:738:0:o;19259:974::-;19512:16;19530:14;19546;19493:8;16760:15;16748:8;:27;;16740:64;;;;;-1:-1:-1;;;16740:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16740:64:0;;;;;;;;;;;;;;;19600:176:::1;19628:5;19648:4;19667:18;19700:9;19724:14;19753:12;19600:13;:176::i;:::-;19573:203:::0;;-1:-1:-1;19573:203:0;-1:-1:-1;19787:12:0::1;19802:46;19827:7;19836:5:::0;19843:4:::1;19802:24;:46::i;:::-;19787:61;;19859:69;19891:5;19898:10;19910:4;19916:11;19859:31;:69::i;:::-;19945:4;-1:-1:-1::0;;;;;19939:19:0::1;;19966:9;19939:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;20002:4;-1:-1:-1::0;;;;;19996:20:0::1;;20017:4;20023:9;19996:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;19996:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19996:37:0;19989:45:::1;;;;20072:4;-1:-1:-1::0;;;;;20057:25:0::1;;20083:2;20057:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;20057:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20057:29:0;;-1:-1:-1;20137:9:0::1;:21:::0;-1:-1:-1;20133:92:0::1;;;20160:65;20191:10;20215:9;20203;:21;20160:30;:65::i;:::-;16815:1;19259:974:::0;;;;;;;;;;;:::o;29179:810::-;29392:21;29364:8;16760:15;16748:8;:27;;16740:64;;;;;-1:-1:-1;;;16740:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16740:64:0;;;;;;;;;;;;;;;29450:4:::1;-1:-1:-1::0;;;;;29439:15:0::1;:4;;29444:1;29439:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29439:7:0::1;-1:-1:-1::0;;;;;29439:15:0::1;;29431:57;;;::::0;;-1:-1:-1;;;29431:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;29431:57:0;;;;;;;;;;;;;::::1;;29509:55;29539:7;29548:9;29559:4;;29509:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29509:29:0::1;::::0;-1:-1:-1;;;29509:55:0:i:1;:::-;29499:65;;29597:9;29583:7;29591:1;29583:10;;;;;;;;;;;;;;:23;;29575:75;;;;-1:-1:-1::0;;;29575:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29667:4;-1:-1:-1::0;;;;;29661:19:0::1;;29688:7;29696:1;29688:10;;;;;;;;;;;;;;29661:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;29725:4;-1:-1:-1::0;;;;;29719:20:0::1;;29740:51;29765:7;29774:4;;29779:1;29774:7;;;;;;29740:51;29793:7;29801:1;29793:10;;;;;;;;;;;;;;29719:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;29719:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;29719:85:0;29712:93:::1;;;;29816:24;29822:7;29831:4;;29816:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29837:2:0;;-1:-1:-1;29816:5:0::1;::::0;-1:-1:-1;;29816:24:0:i:1;:::-;29903:7;29911:1;29903:10;;;;;;;;;;;;;;29891:9;:22;29887:94;;;29915:66;29946:10;29970:7;29978:1;29970:10;;;;;;;;;;;;;;29958:9;:22;29915:30;:66::i;8383:361::-:0;8578:45;;;-1:-1:-1;;;;;8578:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8578:45:0;-1:-1:-1;;;8578:45:0;;;8567:57;;;;8532:12;;8546:17;;8567:10;;;;8578:45;8567:57;;;8578:45;8567:57;;8578:45;8567:57;;;;;;;;;;-1:-1:-1;;8567:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8531:93;;;;8643:7;:57;;;;-1:-1:-1;8655:11:0;;:16;;:44;;;8686:4;8675:24;;;;;;;;;;;;;;;-1:-1:-1;8675:24:0;8655:44;8635:101;;;;;-1:-1:-1;;;8635:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8383:361;;;;;:::o;9162:195::-;9270:12;;;9232;9270;;;;;;;;;-1:-1:-1;;;;;9249:7:0;;;9263:5;;9249:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9249:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9231:52;;;9302:7;9294:55;;;;-1:-1:-1;;;9294:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9162:195;;;:::o;5415:517::-;5508:14;5554:1;5543:8;:12;5535:68;;;;-1:-1:-1;;;5535:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5634:1;5622:9;:13;:31;;;;;5652:1;5639:10;:14;5622:31;5614:84;;;;-1:-1:-1;;;5614:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5709:20;5732:17;:8;5745:3;5732:12;:17::i;:::-;5709:40;-1:-1:-1;5760:14:0;5777:31;5709:40;5797:10;5777:19;:31::i;:::-;5760:48;-1:-1:-1;5819:16:0;5838:40;5862:15;5838:19;:9;5852:4;5838:13;:19::i;:::-;:23;;:40::i;:::-;5819:59;;5913:11;5901:9;:23;;;;;;;5415:517;-1:-1:-1;;;;;;;5415:517:0:o;6607:511::-;6708:21;6765:1;6750:4;:11;:16;;6742:59;;;;;-1:-1:-1;;;6742:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6833:4;:11;6822:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6822:23:0;;6812:33;;6869:8;6856:7;6864:1;6856:10;;;;;;;;;;;;;:21;;;;;6893:6;6888:223;6919:1;6905:4;:11;:15;6901:1;:19;6888:223;;;6943:14;6959:15;6978:42;6990:7;6999:4;7004:1;6999:7;;;;;;;;;;;;;;7008:4;7013:1;7017;7013:5;7008:11;;;;;;;;;;;;;;6978;:42::i;:::-;6942:78;;;;7052:47;7065:7;7073:1;7065:10;;;;;;;;;;;;;;7077:9;7088:10;7052:12;:47::i;:::-;7035:7;7043:1;7047;7043:5;7035:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;6922:3:0;;6888:223;;;;6607:511;;;;;:::o;3932:478::-;4021:12;4047:14;4063;4081:26;4092:6;4100;4081:10;:26::i;:::-;4245:32;;;-1:-1:-1;;4245:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4235:43;;;;;;-1:-1:-1;;;;;;4148:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4138:262;;;;;;;;;3932:478;-1:-1:-1;;;;;3932:478:0:o;8752:402::-;8977:51;;;-1:-1:-1;;;;;8977:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8977:51:0;-1:-1:-1;;;8977:51:0;;;8966:63;;;;8931:12;;8945:17;;8966:10;;;;8977:51;8966:63;;;8977:51;8966:63;;8977:51;8966:63;;;;;;;;;;-1:-1:-1;;8966:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8930:99;;;;9048:7;:57;;;;-1:-1:-1;9060:11:0;;:16;;:44;;;9091:4;9080:24;;;;;;;;;;;;;;;-1:-1:-1;9080:24:0;9060:44;9040:106;;;;-1:-1:-1;;;9040:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8752:402;;;;;;:::o;24799:735::-;24906:6;24901:626;24932:1;24918:4;:11;:15;24914:1;:19;24901:626;;;24956:13;24971:14;24990:4;24995:1;24990:7;;;;;;;;;;;;;;24999:4;25004:1;25008;25004:5;24999:11;;;;;;;;;;;;;;24955:56;;;;25027:14;25046:42;25074:5;25081:6;25046:27;:42::i;:::-;25026:62;;;25103:14;25120:7;25128:1;25132;25128:5;25120:14;;;;;;;;;;;;;;25103:31;;25150:15;25167;25195:6;-1:-1:-1;;;;;25186:15:0;:5;-1:-1:-1;;;;;25186:15:0;;:61;;25228:9;25244:1;25186:61;;;25210:1;25214:9;25186:61;25149:98;;;;25262:10;25293:1;25279:4;:11;:15;25275:1;:19;:82;;25354:3;25275:82;;;25297:54;25322:7;25331:6;25339:4;25344:1;25348;25344:5;25339:11;;;;;;;;;;;;;;25297:24;:54::i;:::-;25262:95;;25387:48;25412:7;25421:5;25428:6;25387:24;:48::i;:::-;-1:-1:-1;;;;;25372:69:0;;25460:10;25472;25484:2;25498:1;25488:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25488:12:0;;25372:143;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25372:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24935:3:0;;;;;-1:-1:-1;24901:626:0;;-1:-1:-1;;;;;;;;24901:626:0;;;24799:735;;;:::o;7199:532::-;7300:21;7357:1;7342:4;:11;:16;;7334:59;;;;;-1:-1:-1;;;7334:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7425:4;:11;7414:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7414:23:0;;7404:33;;7478:9;7448:7;7473:1;7456:7;:14;:18;7448:27;;;;;;;;;;;;;;;;;:39;7512:11;;-1:-1:-1;;7512:15:0;7498:226;7529:5;;7498:226;;7557:14;7573:15;7592:42;7604:7;7613:4;7622:1;7618;:5;7613:11;;;;;;;;;;;;;;7626:4;7631:1;7626:7;;;;;;;7592:42;7556:78;;;;7666:46;7678:7;7686:1;7678:10;;;;;;;;;;;;;;7690:9;7701:10;7666:11;:46::i;:::-;7649:7;7661:1;7657;:5;7649:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;7536:3:0;7498:226;;30136:1221;30249:6;30244:1106;30275:1;30261:4;:11;:15;30257:1;:19;30244:1106;;;30299:13;30314:14;30333:4;30338:1;30333:7;;;;;;;;;;;;;;30342:4;30347:1;30351;30347:5;30342:11;;;;;;;;;;;;;;30298:56;;;;30370:14;30389:42;30417:5;30424:6;30389:27;:42::i;:::-;30369:62;;;30446:19;30483:48;30508:7;30517:5;30524:6;30483:24;:48::i;:::-;30446:86;;30547:16;30578:17;30666:13;30681;30699:4;-1:-1:-1;;;;;30699:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30699:18:0;;;;;;;-1:-1:-1;;;;;30665:52:0;;;;-1:-1:-1;30665:52:0;;-1:-1:-1;30733:17:0;;-1:-1:-1;;;;;30774:15:0;;;;;;;:61;;30816:8;30826;30774:61;;;30793:8;30803;30774:61;30732:103;;;;30864:63;30914:12;30878:5;-1:-1:-1;;;;;30864:30:0;;30903:4;30864:45;;;;;;;;;;;;;-1:-1:-1;;;;;30864:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;:63;30850:77;;30957:71;30987:11;31000:12;31014:13;30957:29;:71::i;:::-;30942:86;;30244:1106;;;;31059:15;31076;31104:6;-1:-1:-1;;;;;31095:15:0;:5;-1:-1:-1;;;;;31095:15:0;;:67;;31140:12;31159:1;31095:67;;;31119:1;31123:12;31095:67;31058:104;;;;31177:10;31208:1;31194:4;:11;:15;31190:1;:19;:82;;31269:3;31190:82;;;31212:54;31237:7;31246:6;31254:4;31259:1;31263;31259:5;31254:11;;;;;;;31212:54;31325:12;;;31335:1;31325:12;;;;;;;;;;-1:-1:-1;;;31287:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;31287:51:0;;;;;;;;;;;;;;;;;;;;;;31177:95;;-1:-1:-1;31287:9:0;;;;;;31297:10;;31309;;31177:95;;31325:12;;31287:51;;;;;;;;31325:12;;31287:51;;;;31325:12;;31287:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30278:3:0;;;;;-1:-1:-1;30244:1106:0;;-1:-1:-1;;;;;;;;;;30244:1106:0;2938:129;3022:5;;;3017:16;;;;3009:50;;;;;-1:-1:-1;;;3009:50:0;;;;;;;;;;;;-1:-1:-1;;;3009:50:0;;;;;;;;;;;;;;6053:472;6146:13;6192:1;6180:9;:13;6172:70;;;;-1:-1:-1;;;6172:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6273:1;6261:9;:13;:31;;;;;6291:1;6278:10;:14;6261:31;6253:84;;;;-1:-1:-1;;;6253:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6348:14;6365:34;6394:4;6365:24;:9;6379;6365:13;:24::i;:::-;:28;;:34::i;:::-;6348:51;-1:-1:-1;6410:16:0;6429:34;6459:3;6429:25;:10;6444:9;6429:14;:25::i;:34::-;6410:53;;6485:32;6515:1;6498:11;6486:9;:23;;;;;;;6485:29;:32::i;:::-;6474:43;6053:472;-1:-1:-1;;;;;;6053:472:0:o;4972:321::-;5054:12;5097:1;5087:7;:11;5079:61;;;;-1:-1:-1;;;5079:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5170:1;5159:8;:12;:28;;;;;5186:1;5175:8;:12;5159:28;5151:81;;;;-1:-1:-1;;;5151:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5277:8;5253:21;:7;5265:8;5253:11;:21::i;:::-;:32;;;;;;;4972:321;-1:-1:-1;;;;4972:321:0:o;3491:349::-;3566:14;3582;3627:6;-1:-1:-1;;;;;3617:16:0;:6;-1:-1:-1;;;;;3617:16:0;;;3609:66;;;;-1:-1:-1;;;3609:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3714:6;-1:-1:-1;;;;;3705:15:0;:6;-1:-1:-1;;;;;3705:15:0;;:53;;3743:6;3751;3705:53;;;3724:6;3732;3705:53;3686:72;;-1:-1:-1;3686:72:0;-1:-1:-1;;;;;;3777:20:0;;3769:63;;;;;-1:-1:-1;;;3769:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3491:349;;;;;:::o;17119:1390::-;17337:12;17351;17494:1;-1:-1:-1;;;;;17432:64:0;17450:7;-1:-1:-1;;;;;17432:34:0;;17467:6;17475;17432:50;;;;;;;;;;;;;-1:-1:-1;;;;;17432:50:0;;;;;;-1:-1:-1;;;;;17432:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17432:50:0;-1:-1:-1;;;;;17432:64:0;;17428:150;;;17531:7;-1:-1:-1;;;;;17513:37:0;;17551:6;17559;17513:53;;;;;;;;;;;;;-1:-1:-1;;;;;17513:53:0;;;;;;-1:-1:-1;;;;;17513:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17428:150:0;17589:13;17604;17621:53;17650:7;17659:6;17667;17621:28;:53::i;:::-;17588:86;;;;17689:8;17701:1;17689:13;:30;;;;-1:-1:-1;17706:13:0;;17689:30;17685:817;;;17758:14;;-1:-1:-1;17774:14:0;;-1:-1:-1;17685:817:0;;;17822:19;17844:58;17867:14;17883:8;17893;17844:22;:58::i;:::-;17822:80;;17939:14;17921;:32;17917:574;;18000:10;17982:14;:28;;17974:79;;;;-1:-1:-1;;;17974:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18094:14;;-1:-1:-1;18110:14:0;-1:-1:-1;18110:14:0;17917:574;;;18166:19;18188:58;18211:14;18227:8;18237;18188:22;:58::i;:::-;18166:80;;18290:14;18272;:32;;18265:40;;;;18350:10;18332:14;:28;;18324:79;;;;-1:-1:-1;;;18324:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18444:14;-1:-1:-1;18460:14:0;;-1:-1:-1;17917:574:0;17685:817;;17119:1390;;;;;;;;;;;:::o;3075:142::-;3127:6;3154;;;:30;;-1:-1:-1;;3169:5:0;;;3183:1;3178;3169:5;3178:1;3164:15;;;;;:20;3154:30;3146:63;;;;;-1:-1:-1;;;3146:63:0;;;;;;;;;;;;-1:-1:-1;;;3146:63:0;;;;;;;;;;;;;;2802:128;2886:5;;;2881:16;;;;2873:49;;;;;-1:-1:-1;;;2873:49:0;;;;;;;;;;;;-1:-1:-1;;;2873:49:0;;;;;;;;;;;;;;4468:391;4561:13;4576;4603:14;4622:26;4633:6;4641;4622:10;:26::i;:::-;4602:46;;;4660:13;4675;4708:32;4716:7;4725:6;4733;4708:7;:32::i;:::-;-1:-1:-1;;;;;4693:60:0;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4693:62:0;;;;;;;-1:-1:-1;;;;;4659:96:0;;;;-1:-1:-1;4659:96:0;;-1:-1:-1;;;;;;4789:16:0;;;;;;;:62;;4832:8;4842;4789:62;;;4809:8;4819;4789:62;4766:85;;;;-1:-1:-1;4468:391:0;-1:-1:-1;;;;;;;4468:391:0:o

Swarm Source

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