Contract 0x833ba1ab69309dc6202826800968921f0fdc168c

 

Contract Overview

Balance:
0 BNB

BNB Value:
$0.00

Token:
Txn Hash
Block
From
To
Value [Txn Fee]
0x2dca36d8522b90049fbdb19eaa037c0a031cf8d840bbc0dc064222e02c42c3a294702682021-07-25 16:36:0315 mins ago0xead33e24900659fea27fea4e25c9e1a7b039f6c3 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0.003247 BNB0.000855475
0x2dc2b726fbb3a2c6e926e5b3a35090ee842764a15dba97543aa33cab91b8996894606892021-07-25 8:26:368 hrs 25 mins ago0x1606a751cf19df355af36f4664aad87dfad7a102 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0.003451 BNB0.000817615
0x542f085029885a1ce2ef53b73c3655691ebd4db5529a804c19cb492282d94ad194593782021-07-25 7:20:559 hrs 31 mins ago0x5e6a79fcf39690c18ffcc2499a7ba27306e14399 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0 BNB0.000559195
0xe8c910ab1a361d399a00e1e7b59ec0bc3689d855c0d6dc63ded6e884e7b4966e94557742021-07-25 4:20:1412 hrs 31 mins ago0x9b6a162ee14aad0d99f4959cdb6fde788e9de0e9 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0 BNB0.0007207
0xbd16c17ac5950a7b5a542cc19ce99ec0befdd4c537938e4be9a2ac3ce225775d94553102021-07-25 3:57:0212 hrs 55 mins ago0x9b6a162ee14aad0d99f4959cdb6fde788e9de0e9 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0.002972 BNB0.000817855
0x6537cdc197a4364f1a2613ac1e24e3f2b77e3c7b80703f742cfcca39b44cec6a94552832021-07-25 3:55:4112 hrs 56 mins ago0x9b6a162ee14aad0d99f4959cdb6fde788e9de0e9 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0.002975 BNB0.00061715
0x51fea4ba0b3dffaedacee92a9571494ded5cfde76eebd47e6e05bffa919736ec94552182021-07-25 3:52:2612 hrs 59 mins ago0xa2597b30985e5c3cd670f74ecae2d299b6029b5e IN  0x833ba1ab69309dc6202826800968921f0fdc168c0 BNB0.0007957
0xd7281db92d28ac69c9fca8519678a895367d3f68431d52569a1fe42d3fdc652294551782021-07-25 3:50:2613 hrs 1 min ago0xa2597b30985e5c3cd670f74ecae2d299b6029b5e IN  0x833ba1ab69309dc6202826800968921f0fdc168c0.003454 BNB0.000705355
0x3a27cb1bd916e0bd0a5cb037e209f76fe52ef4617234255cf3074c30779df2b594542492021-07-25 3:03:4413 hrs 48 mins ago0x479df5444c91daeca02bf5f5426ff8cb4f5b2131 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0 BNB0.0008116752
0xac3b08373199f0d5fa3093deaa46af44d2af20d781a5b3a007e761f801bcaf7994535502021-07-25 2:28:4714 hrs 23 mins ago0x479df5444c91daeca02bf5f5426ff8cb4f5b2131 IN  0x833ba1ab69309dc6202826800968921f0fdc168c9.888348 BNB0.0007197681
0xc70ba27197e41af5a89f1aa7be9bf89043fc142a99c3b573b93fb44c4e1d9d6694494082021-07-24 23:01:3117 hrs 50 mins ago0x62bf4fa6ab8e05dd2168361e79f3b7d4f3f6ec27 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0.001973 BNB0.000817565
0x04599b8cbada8169badeb41299e75a3edba74eacecca2028479892dd07edd55a94493402021-07-24 22:58:0717 hrs 53 mins ago0x62bf4fa6ab8e05dd2168361e79f3b7d4f3f6ec27 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0 BNB0.0007957
0x1395cb13cc31c4827437513bbe3eb30aa914779570768dbe4d3e22cc56b220e294486282021-07-24 22:22:3118 hrs 29 mins ago0x62bf4fa6ab8e05dd2168361e79f3b7d4f3f6ec27 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0.003454 BNB0.000705355
0x75080bacc86ce8734fc68fc0059c0edafe5951c8ed57ee3dba6a7e14e410891994471192021-07-24 21:06:5019 hrs 45 mins ago0x6dbc8588cf4c16068164175bd84fbef70b418b50 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0.006895 BNB0.00061721
0x691fe78e4816f8ff0e952440475d45ce505b6f1e24e6b44aa3911afa04405b7d94397342021-07-24 14:51:591 day 2 hrs ago0x767a36afbd3001d5af0e347f4876dc7c07178128 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0.008896 BNB0.00061727
0xd1b0f1d4893926ee4eb53572d53070172f6fbff6e2a0ca21576e9f055474823693969562021-07-23 2:59:212 days 13 hrs ago0xe7cedf8a1c0108459afa26f9252d43437bdd5aa5 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0 BNB0.000735114
0xb72e8ec6c3b80e0082812bd8c542137bf20893eb4240d7fcdde4219fe81bbf2993966722021-07-23 2:45:092 days 14 hrs ago0xe7cedf8a1c0108459afa26f9252d43437bdd5aa5 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0.010038 BNB0.0008342121
0x4e92880ff242db355ac5f4091ec50f4c8d7fe8d5d020406b6044d181497ea48c93964392021-07-23 2:33:302 days 14 hrs ago0xe7cedf8a1c0108459afa26f9252d43437bdd5aa5 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0.01 BNB0.0007061154
0x8c068c64819e338525266705bca8369cc36a4f60b16eea77a25958669568e1a393835542021-07-22 15:48:453 days 1 hr ago0x336eed1593897ed2f4dc591f494bb872c24a0c31 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0 BNB0.000634255
0x3d73091e50624ead58a916f469bd4c5636dff96a14afc7c86190ef6e21db373093835102021-07-22 15:46:333 days 1 hr ago0x336eed1593897ed2f4dc591f494bb872c24a0c31 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0 BNB0.000671215
0xfeb853b2b93820f98d1f8c5bec4f8d55011ba7af28dc3afea38a24b3b607daf593834292021-07-22 15:42:303 days 1 hr ago0x336eed1593897ed2f4dc591f494bb872c24a0c31 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0 BNB0.0007207
0x6b6bc5d50f68d7295931ff31080bef399b1cc0a3878ba518beb0a6c169f7858e93833422021-07-22 15:38:093 days 1 hr ago0x336eed1593897ed2f4dc591f494bb872c24a0c31 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0.010058 BNB0.000780355
0xc806a52f2b03ac8b33d75c4e4f6a09badefa96c04310b070d2a7d003aed1213393828402021-07-22 15:13:033 days 1 hr ago0x336eed1593897ed2f4dc591f494bb872c24a0c31 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0 BNB0.0007207
0x175e4c08442638e1c028e14e2cfb38cc671043294bad3ff20e61a1725d37c97493826842021-07-22 15:05:153 days 1 hr ago0x336eed1593897ed2f4dc591f494bb872c24a0c31 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0.030173 BNB0.000817855
0x6b46f70d7eb166cf2a53f92a4c03fd483163355469f42522203dba5bdc92461993826552021-07-22 15:03:483 days 1 hr ago0x336eed1593897ed2f4dc591f494bb872c24a0c31 IN  0x833ba1ab69309dc6202826800968921f0fdc168c0 BNB0.0007207
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x2dca36d8522b90049fbdb19eaa037c0a031cf8d840bbc0dc064222e02c42c3a294702682021-07-25 16:36:0315 mins ago 0x833ba1ab69309dc6202826800968921f0fdc168c0xead33e24900659fea27fea4e25c9e1a7b039f6c30.000000478987336066 BNB
0x2dca36d8522b90049fbdb19eaa037c0a031cf8d840bbc0dc064222e02c42c3a294702682021-07-25 16:36:0315 mins ago 0x833ba1ab69309dc6202826800968921f0fdc168c Binance: WBNB Token0.003246521012663934 BNB
0x2dc2b726fbb3a2c6e926e5b3a35090ee842764a15dba97543aa33cab91b8996894606892021-07-25 8:26:368 hrs 25 mins ago 0x833ba1ab69309dc6202826800968921f0fdc168c Binance: WBNB Token0.003451 BNB
0x542f085029885a1ce2ef53b73c3655691ebd4db5529a804c19cb492282d94ad194593782021-07-25 7:20:559 hrs 31 mins ago 0x833ba1ab69309dc6202826800968921f0fdc168c0x5e6a79fcf39690c18ffcc2499a7ba27306e143990.003449111287447441 BNB
0x542f085029885a1ce2ef53b73c3655691ebd4db5529a804c19cb492282d94ad194593782021-07-25 7:20:559 hrs 31 mins ago Binance: WBNB Token 0x833ba1ab69309dc6202826800968921f0fdc168c0.003449111287447441 BNB
0xe8c910ab1a361d399a00e1e7b59ec0bc3689d855c0d6dc63ded6e884e7b4966e94557742021-07-25 4:20:1412 hrs 31 mins ago 0x833ba1ab69309dc6202826800968921f0fdc168c0x9b6a162ee14aad0d99f4959cdb6fde788e9de0e90.002971999999999999 BNB
0xe8c910ab1a361d399a00e1e7b59ec0bc3689d855c0d6dc63ded6e884e7b4966e94557742021-07-25 4:20:1412 hrs 31 mins ago Binance: WBNB Token 0x833ba1ab69309dc6202826800968921f0fdc168c0.002971999999999999 BNB
0xbd16c17ac5950a7b5a542cc19ce99ec0befdd4c537938e4be9a2ac3ce225775d94553102021-07-25 3:57:0212 hrs 55 mins ago 0x833ba1ab69309dc6202826800968921f0fdc168c Binance: WBNB Token0.002972 BNB
0x6537cdc197a4364f1a2613ac1e24e3f2b77e3c7b80703f742cfcca39b44cec6a94552832021-07-25 3:55:4112 hrs 56 mins ago 0x833ba1ab69309dc6202826800968921f0fdc168c Binance: WBNB Token0.002975 BNB
0x51fea4ba0b3dffaedacee92a9571494ded5cfde76eebd47e6e05bffa919736ec94552182021-07-25 3:52:2612 hrs 59 mins ago 0x833ba1ab69309dc6202826800968921f0fdc168c0xa2597b30985e5c3cd670f74ecae2d299b6029b5e0.003453586440009291 BNB
0x51fea4ba0b3dffaedacee92a9571494ded5cfde76eebd47e6e05bffa919736ec94552182021-07-25 3:52:2612 hrs 59 mins ago Binance: WBNB Token 0x833ba1ab69309dc6202826800968921f0fdc168c0.003453586440009291 BNB
0xd7281db92d28ac69c9fca8519678a895367d3f68431d52569a1fe42d3fdc652294551782021-07-25 3:50:2613 hrs 1 min ago 0x833ba1ab69309dc6202826800968921f0fdc168c0xa2597b30985e5c3cd670f74ecae2d299b6029b5e0.000000413559990708 BNB
0xd7281db92d28ac69c9fca8519678a895367d3f68431d52569a1fe42d3fdc652294551782021-07-25 3:50:2613 hrs 1 min ago 0x833ba1ab69309dc6202826800968921f0fdc168c Binance: WBNB Token0.003453586440009292 BNB
0x3a27cb1bd916e0bd0a5cb037e209f76fe52ef4617234255cf3074c30779df2b594542492021-07-25 3:03:4413 hrs 48 mins ago 0x833ba1ab69309dc6202826800968921f0fdc168c0x479df5444c91daeca02bf5f5426ff8cb4f5b21319.888347515716529493 BNB
0x3a27cb1bd916e0bd0a5cb037e209f76fe52ef4617234255cf3074c30779df2b594542492021-07-25 3:03:4413 hrs 48 mins ago Binance: WBNB Token 0x833ba1ab69309dc6202826800968921f0fdc168c9.888347515716529493 BNB
0xac3b08373199f0d5fa3093deaa46af44d2af20d781a5b3a007e761f801bcaf7994535502021-07-25 2:28:4714 hrs 23 mins ago 0x833ba1ab69309dc6202826800968921f0fdc168c0x479df5444c91daeca02bf5f5426ff8cb4f5b21310.000000484283470506 BNB
0xac3b08373199f0d5fa3093deaa46af44d2af20d781a5b3a007e761f801bcaf7994535502021-07-25 2:28:4714 hrs 23 mins ago 0x833ba1ab69309dc6202826800968921f0fdc168c Binance: WBNB Token9.888347515716529494 BNB
0xc70ba27197e41af5a89f1aa7be9bf89043fc142a99c3b573b93fb44c4e1d9d6694494082021-07-24 23:01:3117 hrs 50 mins ago 0x833ba1ab69309dc6202826800968921f0fdc168c Binance: WBNB Token0.001973 BNB
0x04599b8cbada8169badeb41299e75a3edba74eacecca2028479892dd07edd55a94493402021-07-24 22:58:0717 hrs 53 mins ago 0x833ba1ab69309dc6202826800968921f0fdc168c0x62bf4fa6ab8e05dd2168361e79f3b7d4f3f6ec270.003453586440009291 BNB
0x04599b8cbada8169badeb41299e75a3edba74eacecca2028479892dd07edd55a94493402021-07-24 22:58:0717 hrs 53 mins ago Binance: WBNB Token 0x833ba1ab69309dc6202826800968921f0fdc168c0.003453586440009291 BNB
0x1395cb13cc31c4827437513bbe3eb30aa914779570768dbe4d3e22cc56b220e294486282021-07-24 22:22:3118 hrs 29 mins ago 0x833ba1ab69309dc6202826800968921f0fdc168c0x62bf4fa6ab8e05dd2168361e79f3b7d4f3f6ec270.000000413559990708 BNB
0x1395cb13cc31c4827437513bbe3eb30aa914779570768dbe4d3e22cc56b220e294486282021-07-24 22:22:3118 hrs 29 mins ago 0x833ba1ab69309dc6202826800968921f0fdc168c Binance: WBNB Token0.003453586440009292 BNB
0x75080bacc86ce8734fc68fc0059c0edafe5951c8ed57ee3dba6a7e14e410891994471192021-07-24 21:06:5019 hrs 45 mins ago 0x833ba1ab69309dc6202826800968921f0fdc168c Binance: WBNB Token0.006895 BNB
0x691fe78e4816f8ff0e952440475d45ce505b6f1e24e6b44aa3911afa04405b7d94397342021-07-24 14:51:591 day 2 hrs ago 0x833ba1ab69309dc6202826800968921f0fdc168c Binance: WBNB Token0.008896 BNB
0xd1b0f1d4893926ee4eb53572d53070172f6fbff6e2a0ca21576e9f055474823693969562021-07-23 2:59:212 days 13 hrs ago 0x833ba1ab69309dc6202826800968921f0fdc168c0xe7cedf8a1c0108459afa26f9252d43437bdd5aa50.010037999999999999 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
VrapRouter02

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 10 : VrapRouter02.sol
pragma solidity =0.6.6;

import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";
import "@uniswap/lib/contracts/libraries/TransferHelper.sol";

import "./interfaces/IVrapRouter02.sol";
import "./libraries/VrapLibrary.sol";
import "./libraries/SafeMath.sol";
import "./interfaces/IERC20.sol";
import "./interfaces/IWETH.sol";

contract VrapRouter02 is IVrapRouter02 {
    using SafeMath for uint256;

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

    modifier ensure(uint256 deadline) {
        require(deadline >= block.timestamp, "VrapRouter: 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,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin
    ) internal virtual returns (uint256 amountA, uint256 amountB) {
        // create the pair if it doesn't exist yet
        if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {
            IUniswapV2Factory(factory).createPair(tokenA, tokenB);
        }
        (uint256 reserveA, uint256 reserveB) =
            VrapLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint256 amountBOptimal =
                VrapLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(
                    amountBOptimal >= amountBMin,
                    "VrapRouter: INSUFFICIENT_B_AMOUNT"
                );
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint256 amountAOptimal =
                    VrapLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(
                    amountAOptimal >= amountAMin,
                    "VrapRouter: INSUFFICIENT_A_AMOUNT"
                );
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        )
    {
        (amountA, amountB) = _addLiquidity(
            tokenA,
            tokenB,
            amountADesired,
            amountBDesired,
            amountAMin,
            amountBMin
        );
        address pair = VrapLibrary.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,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        virtual
        override
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        )
    {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = VrapLibrary.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,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        public
        virtual
        override
        ensure(deadline)
        returns (uint256 amountA, uint256 amountB)
    {
        address pair = VrapLibrary.pairFor(factory, tokenA, tokenB);
        IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint256 amount0, uint256 amount1) = IUniswapV2Pair(pair).burn(to);
        (address token0, ) = VrapLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0
            ? (amount0, amount1)
            : (amount1, amount0);
        require(amountA >= amountAMin, "VrapRouter: INSUFFICIENT_A_AMOUNT");
        require(amountB >= amountBMin, "VrapRouter: INSUFFICIENT_B_AMOUNT");
    }

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

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint256 amountETH) {
        address pair = VrapLibrary.pairFor(factory, token, WETH);
        uint256 value = approveMax ? uint256(-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(
        uint256[] memory amounts,
        address[] memory path,
        address _to
    ) internal virtual {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = VrapLibrary.sortTokens(input, output);
            uint256 amountOut = amounts[i + 1];
            (uint256 amount0Out, uint256 amount1Out) =
                input == token0
                    ? (uint256(0), amountOut)
                    : (amountOut, uint256(0));
            address to =
                i < path.length - 2
                    ? VrapLibrary.pairFor(factory, output, path[i + 2])
                    : _to;
            IUniswapV2Pair(VrapLibrary.pairFor(factory, input, output)).swap(
                amount0Out,
                amount1Out,
                to,
                new bytes(0)
            );
        }
    }

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

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

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

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[path.length - 1] == WETH, "VrapRouter: INVALID_PATH");
        amounts = VrapLibrary.getAmountsIn(factory, amountOut, path);
        require(
            amounts[0] <= amountInMax,
            "VrapRouter: EXCESSIVE_INPUT_AMOUNT"
        );
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            VrapLibrary.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(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[path.length - 1] == WETH, "VrapRouter: INVALID_PATH");
        amounts = VrapLibrary.getAmountsOut(factory, amountIn, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "VrapRouter: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            VrapLibrary.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(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        payable
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[0] == WETH, "VrapRouter: INVALID_PATH");
        amounts = VrapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, "VrapRouter: EXCESSIVE_INPUT_AMOUNT");
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(
            IWETH(WETH).transfer(
                VrapLibrary.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,) = VrapLibrary.sortTokens(input, output);
            IUniswapV2Pair pair = IUniswapV2Pair(VrapLibrary.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 = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = VrapLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? VrapLibrary.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, VrapLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'VrapRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'VrapRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(VrapLibrary.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'VrapRouter: 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, 'VrapRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, VrapLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'VrapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }
*/
    // **** LIBRARY FUNCTIONS ****
    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) public pure virtual override returns (uint256 amountB) {
        return VrapLibrary.quote(amountA, reserveA, reserveB);
    }

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

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

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

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

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

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

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

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

File 3 of 10 : IVrapRouter01.sol
pragma solidity >=0.6.2;

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 4 of 10 : IVrapRouter02.sol
pragma solidity >=0.6.2;

import "./IVrapRouter01.sol";

interface IVrapRouter02 is IVrapRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

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

    /*  function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        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 5 of 10 : IWETH.sol
pragma solidity >=0.5.0;

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

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

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

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

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

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

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

import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol";

import "./SafeMath.sol";

library VrapLibrary {
    using SafeMath for uint256;

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

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

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

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256 amountOut) {
        require(amountIn > 0, "VrapLibrary: INSUFFICIENT_INPUT_AMOUNT");
        require(
            reserveIn > 0 && reserveOut > 0,
            "VrapLibrary: INSUFFICIENT_LIQUIDITY"
        );
        uint256 amountInWithFee = amountIn.mul(997);
        uint256 numerator = amountInWithFee.mul(reserveOut);
        uint256 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(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256 amountIn) {
        require(amountOut > 0, "VrapLibrary: INSUFFICIENT_OUTPUT_AMOUNT");
        require(
            reserveIn > 0 && reserveOut > 0,
            "VrapLibrary: INSUFFICIENT_LIQUIDITY"
        );
        uint256 numerator = reserveIn.mul(amountOut).mul(1000);
        uint256 denominator = reserveOut.sub(amountOut).mul(997);
        amountIn = (numerator / denominator).add(1);
    }

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

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

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

pragma solidity >=0.6.0;

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

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

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

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

File 9 of 10 : 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 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;
}

File 10 of 10 : 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;
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "evmVersion": "istanbul",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"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":"swapExactTokensForTokens","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":"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"}]

60c060405234801561001057600080fd5b506040516200563e3803806200563e8339818101604052604081101561003557600080fd5b8101908080519060200190929190805190602001909291905050508173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050505060805160601c60a05160601c61546e620001d060003980610135528061131e528061135c528061148c528061176a5280611cde5280611fb952806120af528061229a528061246252806124f7528061294b5280612a025280612af55280612f995280613337528061339052806133c452806134455280613685528061384a52806138df52508061157e528061168a528061183d52806118755280611a6e5280611b7a5280611dd05280611ed9528061208d52806123875280612536528061275752806128605280612c145280612f165280612f3f5280612f7752806131a9528061336e5280613772528061391e528061450052806145445280614c515280614d795280614e8f525061546e6000f3fe60806040526004361061012e5760003560e01c80638803dbee116100ab578063c45a01551161006f578063c45a015514610dab578063d06ca61f14610e02578063ded9382a14610f26578063e8e3370014611008578063f305d719146110ee578063fb3bdb411461119c5761018a565b80638803dbee14610a57578063ad5c464814610b70578063ad615dec14610bc7578063af2979eb14610c2a578063baa2abde14610cd75761018a565b806338ed1739116100f257806338ed1739146105e55780634a25d94a146106fe5780635b0d5984146108175780637ff36ab5146108f257806385f8c259146109f45761018a565b806302751cec1461018f578063054d50d41461024357806318cbafe5146102a65780631f00ca74146103bf5780632195995c146104e35761018a565b3661018a577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461018857fe5b005b600080fd5b34801561019b57600080fd5b50610226600480360360c08110156101b257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061129e565b604051808381526020018281526020019250505060405180910390f35b34801561024f57600080fd5b506102906004803603606081101561026657600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506113fb565b6040518082815260200191505060405180910390f35b3480156102b257600080fd5b50610368600480360360a08110156102c957600080fd5b810190808035906020019092919080359060200190929190803590602001906401000000008111156102fa57600080fd5b82018360208201111561030c57600080fd5b8035906020019184602083028401116401000000008311171561032e57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611411565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156103ab578082015181840152602081019050610390565b505050509050019250505060405180910390f35b3480156103cb57600080fd5b5061048c600480360360408110156103e257600080fd5b81019080803590602001909291908035906020019064010000000081111561040957600080fd5b82018360208201111561041b57600080fd5b8035906020019184602083028401116401000000008311171561043d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611836565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104cf5780820151818401526020810190506104b4565b505050509050019250505060405180910390f35b3480156104ef57600080fd5b506105c8600480360361016081101561050757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803515159060200190929190803560ff169060200190929190803590602001909291908035906020019092919050505061186b565b604051808381526020018281526020019250505060405180910390f35b3480156105f157600080fd5b506106a7600480360360a081101561060857600080fd5b8101908080359060200190929190803590602001909291908035906020019064010000000081111561063957600080fd5b82018360208201111561064b57600080fd5b8035906020019184602083028401116401000000008311171561066d57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119f0565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156106ea5780820151818401526020810190506106cf565b505050509050019250505060405180910390f35b34801561070a57600080fd5b506107c0600480360360a081101561072157600080fd5b8101908080359060200190929190803590602001909291908035906020019064010000000081111561075257600080fd5b82018360208201111561076457600080fd5b8035906020019184602083028401116401000000008311171561078657600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611c63565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156108035780820151818401526020810190506107e8565b505050509050019250505060405180910390f35b34801561082357600080fd5b506108dc600480360361014081101561083b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803515159060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050612085565b6040518082815260200191505060405180910390f35b61099d6004803603608081101561090857600080fd5b81019080803590602001909291908035906020019064010000000081111561092f57600080fd5b82018360208201111561094157600080fd5b8035906020019184602083028401116401000000008311171561096357600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061221f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109e05780820151818401526020810190506109c5565b505050509050019250505060405180910390f35b348015610a0057600080fd5b50610a4160048036036060811015610a1757600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506126c3565b6040518082815260200191505060405180910390f35b348015610a6357600080fd5b50610b19600480360360a0811015610a7a57600080fd5b81019080803590602001909291908035906020019092919080359060200190640100000000811115610aab57600080fd5b820183602082011115610abd57600080fd5b80359060200191846020830284011164010000000083111715610adf57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506126d9565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b5c578082015181840152602081019050610b41565b505050509050019250505060405180910390f35b348015610b7c57600080fd5b50610b85612949565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610bd357600080fd5b50610c1460048036036060811015610bea57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919050505061296d565b6040518082815260200191505060405180910390f35b348015610c3657600080fd5b50610cc1600480360360c0811015610c4d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612983565b6040518082815260200191505060405180910390f35b348015610ce357600080fd5b50610d8e600480360360e0811015610cfa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b93565b604051808381526020018281526020019250505060405180910390f35b348015610db757600080fd5b50610dc0612f14565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610e0e57600080fd5b50610ecf60048036036040811015610e2557600080fd5b810190808035906020019092919080359060200190640100000000811115610e4c57600080fd5b820183602082011115610e5e57600080fd5b80359060200191846020830284011164010000000083111715610e8057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050612f38565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610f12578082015181840152602081019050610ef7565b505050509050019250505060405180910390f35b348015610f3257600080fd5b50610feb6004803603610140811015610f4a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803515159060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050612f6d565b604051808381526020018281526020019250505060405180910390f35b34801561101457600080fd5b506110ca600480360361010081101561102c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613110565b60405180848152602001838152602001828152602001935050505060405180910390f35b611178600480360360c081101561110457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132b5565b60405180848152602001838152602001828152602001935050505060405180910390f35b611247600480360360808110156111b257600080fd5b8101908080359060200190929190803590602001906401000000008111156111d957600080fd5b8201836020820111156111eb57600080fd5b8035906020019184602083028401116401000000008311171561120d57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061360a565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561128a57808201518184015260208101905061126f565b505050509050019250505060405180910390f35b6000808242811015611318576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f56726170526f757465723a20455850495245440000000000000000000000000081525060200191505060405180910390fd5b611347897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612b93565b809350819450505061135a898685613ae8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156113cd57600080fd5b505af11580156113e1573d6000803e3d6000fd5b505050506113ef8583613cc4565b50965096945050505050565b6000611408848484613e23565b90509392505050565b6060814281101561148a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f56726170526f757465723a20455850495245440000000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168686600189899050038181106114d357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611579576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f56726170526f757465723a20494e56414c49445f50415448000000000000000081525060200191505060405180910390fd5b6115e57f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050613f53565b915086826001845103815181106115f857fe5b60200260200101511015611657576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806152ce6026913960400191505060405180910390fd5b61171c8686600081811061166757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16336117027f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106116b657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b60018181106116e057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166140cb565b8560008151811061170f57fe5b6020026020010151614226565b61176882878780806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505030614437565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836001855103815181106117b457fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156117f257600080fd5b505af1158015611806573d6000803e3d6000fd5b5050505061182b848360018551038151811061181e57fe5b6020026020010151613cc4565b509695505050505050565b60606118637f000000000000000000000000000000000000000000000000000000000000000084846146e2565b905092915050565b600080600061189b7f00000000000000000000000000000000000000000000000000000000000000008f8f6140cb565b90506000876118aa578c6118cc565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b90508173ffffffffffffffffffffffffffffffffffffffff1663d505accf3330848d8c8c8c6040518863ffffffff1660e01b8152600401808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018460ff1660ff168152602001838152602001828152602001975050505050505050600060405180830381600087803b1580156119af57600080fd5b505af11580156119c3573d6000803e3d6000fd5b505050506119d68f8f8f8f8f8f8f612b93565b809450819550505050509b509b9950505050505050505050565b60608142811015611a69576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f56726170526f757465723a20455850495245440000000000000000000000000081525060200191505060405180910390fd5b611ad57f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050613f53565b91508682600184510381518110611ae857fe5b60200260200101511015611b47576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806152ce6026913960400191505060405180910390fd5b611c0c86866000818110611b5757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611bf27f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110611ba657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b6001818110611bd057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166140cb565b85600081518110611bff57fe5b6020026020010151614226565b611c5882878780806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505086614437565b509695505050505050565b60608142811015611cdc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f56726170526f757465723a20455850495245440000000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660018989905003818110611d2557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dcb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f56726170526f757465723a20494e56414c49445f50415448000000000000000081525060200191505060405180910390fd5b611e377f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506146e2565b91508682600081518110611e4757fe5b60200260200101511115611ea6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153596022913960400191505060405180910390fd5b611f6b86866000818110611eb657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611f517f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110611f0557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b6001818110611f2f57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166140cb565b85600081518110611f5e57fe5b6020026020010151614226565b611fb782878780806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505030614437565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8360018551038151811061200357fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561204157600080fd5b505af1158015612055573d6000803e3d6000fd5b5050505061207a848360018551038151811061206d57fe5b6020026020010151613cc4565b509695505050505050565b6000806120d37f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006140cb565b90506000866120e2578b612104565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b90508173ffffffffffffffffffffffffffffffffffffffff1663d505accf3330848c8b8b8b6040518863ffffffff1660e01b8152600401808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018460ff1660ff168152602001838152602001828152602001975050505050505050600060405180830381600087803b1580156121e757600080fd5b505af11580156121fb573d6000803e3d6000fd5b5050505061220d8d8d8d8d8d8d612983565b925050509a9950505050505050505050565b60608142811015612298576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f56726170526f757465723a20455850495245440000000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106122dc57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612382576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f56726170526f757465723a20494e56414c49445f50415448000000000000000081525060200191505060405180910390fd5b6123ee7f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050613f53565b9150868260018451038151811061240157fe5b60200260200101511015612460576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806152ce6026913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836000815181106124a957fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156124dc57600080fd5b505af11580156124f0573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6125ae7f00000000000000000000000000000000000000000000000000000000000000008989600081811061256257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061258c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166140cb565b846000815181106125bb57fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561262c57600080fd5b505af1158015612640573d6000803e3d6000fd5b505050506040513d602081101561265657600080fd5b810190808051906020019092919050505061266d57fe5b6126b982878780806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505086614437565b5095945050505050565b60006126d0848484614862565b90509392505050565b60608142811015612752576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f56726170526f757465723a20455850495245440000000000000000000000000081525060200191505060405180910390fd5b6127be7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506146e2565b915086826000815181106127ce57fe5b6020026020010151111561282d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153596022913960400191505060405180910390fd5b6128f28686600081811061283d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16336128d87f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061288c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b60018181106128b657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166140cb565b856000815181106128e557fe5b6020026020010151614226565b61293e82878780806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505086614437565b509695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061297a84848461499f565b90509392505050565b600081428110156129fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f56726170526f757465723a20455850495245440000000000000000000000000081525060200191505060405180910390fd5b612a2b887f00000000000000000000000000000000000000000000000000000000000000008989893089612b93565b905080925050612af388858a73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612ab357600080fd5b505afa158015612ac7573d6000803e3d6000fd5b505050506040513d6020811015612add57600080fd5b8101908080519060200190929190505050613ae8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612b6657600080fd5b505af1158015612b7a573d6000803e3d6000fd5b50505050612b888483613cc4565b509695505050505050565b6000808242811015612c0d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f56726170526f757465723a20455850495245440000000000000000000000000081525060200191505060405180910390fd5b6000612c3a7f00000000000000000000000000000000000000000000000000000000000000008c8c6140cb565b90508073ffffffffffffffffffffffffffffffffffffffff166323b872dd33838c6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015612cf757600080fd5b505af1158015612d0b573d6000803e3d6000fd5b505050506040513d6020811015612d2157600080fd5b8101908080519060200190929190505050506000808273ffffffffffffffffffffffffffffffffffffffff166389afcb44896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019150506040805180830381600087803b158015612db457600080fd5b505af1158015612dc8573d6000803e3d6000fd5b505050506040513d6040811015612dde57600080fd5b810190808051906020019092919080519060200190929190505050915091506000612e098e8e614aa0565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612e46578183612e49565b82825b80975081985050508a871015612eaa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806153c46021913960400191505060405180910390fd5b89861015612f03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806152ad6021913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060612f657f00000000000000000000000000000000000000000000000000000000000000008484613f53565b905092915050565b6000806000612fbd7f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006140cb565b9050600087612fcc578c612fee565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b90508173ffffffffffffffffffffffffffffffffffffffff1663d505accf3330848d8c8c8c6040518863ffffffff1660e01b8152600401808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018460ff1660ff168152602001838152602001828152602001975050505050505050600060405180830381600087803b1580156130d157600080fd5b505af11580156130e5573d6000803e3d6000fd5b505050506130f78e8e8e8e8e8e61129e565b809450819550505050509a509a98505050505050505050565b6000806000834281101561318c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f56726170526f757465723a20455850495245440000000000000000000000000081525060200191505060405180910390fd5b61319a8c8c8c8c8c8c614c34565b809450819550505060006131cf7f00000000000000000000000000000000000000000000000000000000000000008e8e6140cb565b90506131dd8d338388614226565b6131e98c338387614226565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561326857600080fd5b505af115801561327c573d6000803e3d6000fd5b505050506040513d602081101561329257600080fd5b810190808051906020019092919050505092505050985098509895505050505050565b60008060008342811015613331576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f56726170526f757465723a20455850495245440000000000000000000000000081525060200191505060405180910390fd5b61335f8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614c34565b809450819550505060006133b47f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006140cb565b90506133c28b338388614226565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561342a57600080fd5b505af115801561343e573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156134ea57600080fd5b505af11580156134fe573d6000803e3d6000fd5b505050506040513d602081101561351457600080fd5b810190808051906020019092919050505061352b57fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156135aa57600080fd5b505af11580156135be573d6000803e3d6000fd5b505050506040513d60208110156135d457600080fd5b81019080805190602001909291905050509250833411156135fc576135fb33853403613cc4565b5b505096509650969350505050565b60608142811015613683576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f56726170526f757465723a20455850495245440000000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106136c757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461376d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f56726170526f757465723a20494e56414c49445f50415448000000000000000081525060200191505060405180910390fd5b6137d97f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506146e2565b915034826000815181106137e957fe5b60200260200101511115613848576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153596022913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061389157fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156138c457600080fd5b505af11580156138d8573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6139967f00000000000000000000000000000000000000000000000000000000000000008989600081811061394a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061397457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166140cb565b846000815181106139a357fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613a1457600080fd5b505af1158015613a28573d6000803e3d6000fd5b505050506040513d6020811015613a3e57600080fd5b8101908080519060200190929190505050613a5557fe5b613aa182878780806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505086614437565b81600081518110613aae57fe5b6020026020010151341115613ade57613add3383600081518110613ace57fe5b60200260200101513403613cc4565b5b5095945050505050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310613bc15780518252602082019150602081019050602083039250613b9e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613c23576040519150601f19603f3d011682016040523d82523d6000602084013e613c28565b606091505b5091509150818015613c685750600081511480613c675750808060200190516020811015613c5557600080fd5b81019080805190602001909291905050505b5b613cbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061540c602d913960400191505060405180910390fd5b5050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff81118015613cf657600080fd5b506040519080825280601f01601f191660200182016040528015613d295781602001600182028036833780820191505090505b506040518082805190602001908083835b60208310613d5d5780518252602082019150602081019050602083039250613d3a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613dbf576040519150601f19603f3d011682016040523d82523d6000602084013e613dc4565b606091505b5050905080613e1e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806153256034913960400191505060405180910390fd5b505050565b6000808411613e7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061539e6026913960400191505060405180910390fd5b600083118015613e8d5750600082115b613ee2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061537b6023913960400191505060405180910390fd5b6000613ef96103e586614fe890919063ffffffff16565b90506000613f108483614fe890919063ffffffff16565b90506000613f3b83613f2d6103e889614fe890919063ffffffff16565b61507d90919063ffffffff16565b9050808281613f4657fe5b0493505050509392505050565b6060600282511015613fcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f567261704c6962726172793a20494e56414c49445f504154480000000000000081525060200191505060405180910390fd5b815167ffffffffffffffff81118015613fe557600080fd5b506040519080825280602002602001820160405280156140145781602001602082028036833780820191505090505b509050828160008151811061402557fe5b60200260200101818152505060005b60018351038110156140c3576000806140778786858151811061405357fe5b602002602001015187600187018151811061406a57fe5b6020026020010151615100565b9150915061409984848151811061408a57fe5b60200260200101518383613e23565b8460018501815181106140a857fe5b60200260200101818152505050508080600101915050614034565b509392505050565b60008060006140da8585614aa0565b91509150858282604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b8152601401925050506040516020818303038152906040528051906020012060405160200180807fff000000000000000000000000000000000000000000000000000000000000008152506001018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b8152601401828152602001807f2de0f66e452cee6c1ec6fcf1d0b2a78a2cb764d67f7b2caee3f8ed9295e171bb815250602001925050506040516020818303038152906040528051906020012060001c925050509392505050565b600060608573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200193505050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106143335780518252602082019150602081019050602083039250614310565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614395576040519150601f19603f3d011682016040523d82523d6000602084013e61439a565b606091505b50915091508180156143da57506000815114806143d957508080602001905160208110156143c757600080fd5b81019080805190602001909291905050505b5b61442f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806152f46031913960400191505060405180910390fd5b505050505050565b60005b60018351038110156146dc5760008084838151811061445557fe5b602002602001015185600185018151811061446c57fe5b60200260200101519150915060006144848383614aa0565b509050600087600186018151811061449857fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146144e0578260006144e4565b6000835b91509150600060028a510388106144fb578861453d565b61453c7f0000000000000000000000000000000000000000000000000000000000000000878c60028c018151811061452f57fe5b60200260200101516140cb565b5b905061456a7f000000000000000000000000000000000000000000000000000000000000000088886140cb565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f848484600067ffffffffffffffff811180156145a057600080fd5b506040519080825280601f01601f1916602001820160405280156145d35781602001600182028036833780820191505090505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614661578082015181840152602081019050614646565b50505050905090810190601f16801561468e5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156146b057600080fd5b505af11580156146c4573d6000803e3d6000fd5b5050505050505050505050808060010191505061443a565b50505050565b606060028251101561475c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f567261704c6962726172793a20494e56414c49445f504154480000000000000081525060200191505060405180910390fd5b815167ffffffffffffffff8111801561477457600080fd5b506040519080825280602002602001820160405280156147a35781602001602082028036833780820191505090505b50905082816001835103815181106147b757fe5b6020026020010181815250506000600183510390505b600081111561485a5760008061480d878660018603815181106147ec57fe5b602002602001015187868151811061480057fe5b6020026020010151615100565b9150915061482f84848151811061482057fe5b60200260200101518383614862565b84600185038151811061483e57fe5b60200260200101818152505050508080600190039150506147cd565b509392505050565b60008084116148bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806153e56027913960400191505060405180910390fd5b6000831180156148cc5750600082115b614921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061537b6023913960400191505060405180910390fd5b600061494a6103e861493c8787614fe890919063ffffffff16565b614fe890919063ffffffff16565b905060006149756103e5614967888761522990919063ffffffff16565b614fe890919063ffffffff16565b9050614994600182848161498557fe5b0461507d90919063ffffffff16565b925050509392505050565b6000808411614a16576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f567261704c6962726172793a20494e53554646494349454e545f414d4f554e5481525060200191505060405180910390fd5b600083118015614a265750600082115b614a7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061537b6023913960400191505060405180910390fd5b82614a8f8386614fe890919063ffffffff16565b81614a9657fe5b0490509392505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614b45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f567261704c6962726172793a204944454e544943414c5f41444452455353455381525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614b7f578284614b82565b83835b8092508193505050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614c2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f567261704c6962726172793a205a45524f5f414444524553530000000000000081525060200191505060405180910390fd5b9250929050565b600080600073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e6a439058a8a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015614d2057600080fd5b505afa158015614d34573d6000803e3d6000fd5b505050506040513d6020811015614d4a57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161415614e87577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c9c6539689896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015614e4a57600080fd5b505af1158015614e5e573d6000803e3d6000fd5b505050506040513d6020811015614e7457600080fd5b8101908080519060200190929190505050505b600080614eb57f00000000000000000000000000000000000000000000000000000000000000008b8b615100565b91509150600082148015614ec95750600081145b15614edd5787878094508195505050614fdb565b6000614eea89848461499f565b9050878111614f5b5785811015614f4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806152ad6021913960400191505060405180910390fd5b88818095508196505050614fd9565b6000614f6889848661499f565b905089811115614f7457fe5b87811015614fcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806153c46021913960400191505060405180910390fd5b80898096508197505050505b505b5050965096945050505050565b600080821480615005575082828385029250828161500257fe5b04145b615077576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f64732d6d6174682d6d756c2d6f766572666c6f7700000000000000000000000081525060200191505060405180910390fd5b92915050565b60008282840191508110156150fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f64732d6d6174682d6164642d6f766572666c6f7700000000000000000000000081525060200191505060405180910390fd5b92915050565b600080600061510f8585614aa0565b5090506000806151208888886140cb565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561516557600080fd5b505afa158015615179573d6000803e3d6000fd5b505050506040513d606081101561518f57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691508273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614615213578082615216565b81815b8095508196505050505050935093915050565b60008282840391508111156152a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f64732d6d6174682d7375622d756e646572666c6f77000000000000000000000081525060200191505060405180910390fd5b9291505056fe56726170526f757465723a20494e53554646494349454e545f425f414d4f554e5456726170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c656456726170526f757465723a204558434553534956455f494e5055545f414d4f554e54567261704c6962726172793a20494e53554646494349454e545f4c4951554944495459567261704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e5456726170526f757465723a20494e53554646494349454e545f415f414d4f554e54567261704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564a264697066735822122009d73262033ced301a939a851e3832785c6bb1db95a1dc6a4ee105525e6ebf0564736f6c63430006060033000000000000000000000000353766381b757ee64ce6fa50e584362de315a03a000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

000000000000000000000000353766381b757ee64ce6fa50e584362de315a03a000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000353766381b757ee64ce6fa50e584362de315a03a
Arg [1] : 000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c


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.