Contract 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 5

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xc37def7379021bed228f94cb9eb221b52190f81d0840d32862fb0a1e22459852Swap Exact ETH F...(pending)2021-09-28 23:45:161 sec ago0x2e1efacda43c59320da9864d3845733b5ac5c7ff IN 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd89.694440788309354 BNB(Pending)
0xb4a65fe30cea1feb40abb45c6889ee502400c6446a88ed6bc5ef161f93e82b99Swap Exact Token...(pending)2021-09-28 23:45:161 sec ago0xedb9d27448bdf67a5b774437479791a4346e6ea1 IN 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB(Pending)
0xd787713d8d44858a05b29f665068422d88727e5d1e069a33f64436a56ad2c4f9Swap Exact Token...(pending)2021-09-28 23:45:161 sec ago0x6c1d4c2ca4634bfe2038734b31756b1cf61a96b8 IN 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB(Pending)
0xb17a8fd2d7bcae7e2dbc7e0b6b389a163ede5a7982836263d0819bd9c9db46b3Swap Exact Token...(pending)2021-09-28 23:45:161 sec ago0x142e8c41e387dbf932723fabaff6cfae852581ec IN 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB(Pending)
0x14cba3b784bec1386c55b26fb37899c34fdb84a7314c089a88703aa59fd039b5Swap Exact Token...113211482021-09-28 23:45:0314 secs ago0x4d8620c6729c1737991369991f8f2d6fc0f9741f IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.001141746367
0x6ebd5bc5c47db1bc9eb549120d30135761e11c3ccd747583716c4ca9c51ccffeSwap Exact Token...113211482021-09-28 23:45:0314 secs ago0xefd5c0815dcdf96aba9490e3b9970206c488b74f IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.001520808
0x7607aee36ab2191054ab88eab9f81cd55a5d3dbd97a1e43610699333b8d80bd0Swap Exact Token...113211472021-09-28 23:45:0017 secs ago0x3d1d70b4dfa3daf5b8870d0b0c7098ffd12ce69e IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.00125073
0xcf4d95a9146591773858676f150a06214e73103d2eefaab48a1fe7e6d8b6a897Swap Exact Token...113211452021-09-28 23:44:5423 secs ago0xf41a30d495fee0f8edd25d093e9b16731dab4e6f IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.00172181
0x3257e94bfa80a8107bebc68d0cd5715a01170947dc95ee083d4866a01938651dSwap Exact Token...113211452021-09-28 23:44:5423 secs ago0x9d49f8bc1c9a3bc80ec6e7c75b9f17b0963a3609 IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.00133964
0x3d170830cbe4692543a75f81967f6a6a2df1371e83d80263cddf3d7f6e95f0f6Swap Exact Token...113211452021-09-28 23:44:5423 secs ago0x1df493534797d41a401c6f147ad01e1adb5d2310 IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.001331407
0x233ccb784004b22f690d979878592e5d96d21f13ff60bd832bc996c4b4970255Swap Exact Token...113211442021-09-28 23:44:5126 secs ago0x4d8620c6729c1737991369991f8f2d6fc0f9741f IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.001226792387
0xfc1c02f9c1a180736528bde7d78a771ac2041ce824261e2a5179941ba9d9963dSwap Exact Token...113211442021-09-28 23:44:5126 secs ago0x41eb932ee22cec0e8d259fcc62da26055b4005de IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.000422981
0x1fd8e0b2bef6b213fc90df3df494e4c6b3a23dd853af604642a2fe0b2280353bSwap Exact Token...113211432021-09-28 23:44:4829 secs ago0xd40863321e1f9d4772b57bc8b3e48c5626067e2e IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.001018325
0x12b7b563fc597aa68bc5c9c372b4351b563d23f139e7aa63426ef484a2ebfd7aSwap Exact Token...113211432021-09-28 23:44:4829 secs ago0xb7941a04297c6ca80891a66f9ee9b9b8ee007f7f IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.003336525
0xb1d1f87424b0ae544942dc0edadf610bc7f1cff70f6f3b2d49583ddcbe185d4eSwap Exact Token...113211422021-09-28 23:44:4532 secs ago0xa6064122ed1f852e5a79dc1ed296c0fe2f846e8f IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.000227913
0x8de4c2be5bb8dc16207cb80c929b029ad65be634fe0ce2a51e20147a72d668c3Swap Exact Token...113211422021-09-28 23:44:4532 secs ago0x4d8620c6729c1737991369991f8f2d6fc0f9741f IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.001490051703
0xd51ec5062b3482714115b63f0464fed940d73fc5a5d56bbc6bae451b1565435eSwap Exact Token...113211422021-09-28 23:44:4532 secs ago0xf73f301a6ed6e5de81be82c7e7bad572c1b03dcb IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.001286656
0x0bf58f2e3b74ecb915a6465ad79ace6b5260bd9e00924a89d9c542567100d7c9Swap Exact Token...113211422021-09-28 23:44:4532 secs ago0x142e8c41e387dbf932723fabaff6cfae852581ec IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.003114426
0x9cbb817f9a6cc0b075b81fc14128d6f7ac1477afa46e3c5fd3362d817e449622Swap Exact Token...113211412021-09-28 23:44:4235 secs ago0x41eb932ee22cec0e8d259fcc62da26055b4005de IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.002892123
0x2226f4603764cd03b9a648a3605c154c84cd9c2c375a39a0a33b37d58aae73a2Swap Exact Token...113211392021-09-28 23:44:3641 secs ago0x4d8620c6729c1737991369991f8f2d6fc0f9741f IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.001261066359
0xa357fbf304aac516f501f0f4ac1ce8be2c5c1481ff9bad86c71adb5a8f25c1ebSwap Exact ETH F...113211382021-09-28 23:44:3344 secs ago0x8bd8432880c0c603e9489bc913d376231185016a IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd811 BNB0.00100697
0xdf2810d3d1a18792d715b1607307b678c5ddbe61be99236d35af9c9a43ee0168Swap Exact Token...113211382021-09-28 23:44:3344 secs ago0x7e2337368e571f086c7467ec3c320a3f98df07f3 IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.000816045
0x44747f8f273e8d5aafe636d08f1ea5a6d86f49d9b8a269f0fe98261bc974d82fSwap Exact ETH F...113211382021-09-28 23:44:3344 secs ago0xa6064122ed1f852e5a79dc1ed296c0fe2f846e8f IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd818.074350129890792 BNB0.00120302
0xe8dc5da31078db034e3f39640869b4edc1de03079a8a9f6ae77ad3e928b9917cSwap Exact Token...113211382021-09-28 23:44:3344 secs ago0x0101d2f5b4d64956fedc365b4dfe1541f109bf79 IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.001205393
0x29d14e8ee79fa9a7498191299e703cd33b065ffdd19ca92261cf2ca2fb5bafa6Swap Exact Token...113211342021-09-28 23:44:2156 secs ago0x0101d2f5b4d64956fedc365b4dfe1541f109bf79 IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.000227675
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xa357fbf304aac516f501f0f4ac1ce8be2c5c1481ff9bad86c71adb5a8f25c1eb113211382021-09-28 23:44:3344 secs ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token11 BNB
0xdf2810d3d1a18792d715b1607307b678c5ddbe61be99236d35af9c9a43ee0168113211382021-09-28 23:44:3344 secs ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80x7e2337368e571f086c7467ec3c320a3f98df07f30.304811845421569624 BNB
0xdf2810d3d1a18792d715b1607307b678c5ddbe61be99236d35af9c9a43ee0168113211382021-09-28 23:44:3344 secs ago Binance: WBNB Token 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80.304811845421569624 BNB
0x44747f8f273e8d5aafe636d08f1ea5a6d86f49d9b8a269f0fe98261bc974d82f113211382021-09-28 23:44:3344 secs ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token18.074350129890792 BNB
0x5178cea6c1516c7c90d898f5a066a70697bfb7b1b66fd192f2977d8c77e79478113211342021-09-28 23:44:2156 secs ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token11 BNB
0x6ac9383e89ca021a34756421ca140883c70b020231c904f372b11106d2888a29113211332021-09-28 23:44:1859 secs ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80x7e2337368e571f086c7467ec3c320a3f98df07f31.837786125258855458 BNB
0x6ac9383e89ca021a34756421ca140883c70b020231c904f372b11106d2888a29113211332021-09-28 23:44:1859 secs ago Binance: WBNB Token 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd81.837786125258855458 BNB
0x60ae69344baf897cc1d2c1bc921c382ba558240363bc7e4fd47e8b4ac7f7d0c4113211322021-09-28 23:44:151 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token18.067350356277394 BNB
0x6bd293d120fb7e41bcf7d44ca77c2bbc058bd689672addd6e18bc26b599fbd15113211312021-09-28 23:44:121 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token1.8 BNB
0x28399fb293c5674d85914f5b77c2076297bde59092e12c38b4f2a9956ccdafb8113211302021-09-28 23:44:091 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token4.593678419767723 BNB
0x9906e89d34305646b11f8f08c0aff02469b315ae92bc44cd4cf9efab269f99aa113211282021-09-28 23:44:031 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token18.05392083808986 BNB
0xb14bc177e5218cfa035e54f6592f0ad64025769a4799d1d2e62aad9167c8e21a113211282021-09-28 23:44:031 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token4.4617106455376065 BNB
0xb1010a5d1f9eb4057819bd1eb62813a58c20272f0740f5c25279f69d40e420ce113211282021-09-28 23:44:031 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token5.525607342860664 BNB
0x1aa6a07325f0501ccf6f3e1ae858a495d2d8f44d7a2fc3b1d50d01c9c9180cc8113211282021-09-28 23:44:031 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token11 BNB
0xcdce5130be71e816251ec6eb0687b62d88957528d2068b63a110c5cfd0972806113211282021-09-28 23:44:031 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token1.8 BNB
0x8926e9e4fb2708301f653a7ff79d5e1cf397d9ceefea9dd844e4acfcc668e187113211272021-09-28 23:44:001 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token3.8 BNB
0x4af883f0fe8837392fb644584b2bc0108c7916256fe3065cd83c3a85d376ec53113211252021-09-28 23:43:541 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token4.459053969470882 BNB
0x494500402a66c36ef63b0d1aa850be4f8094248b6adf3850cb173bfc30ee3508113211242021-09-28 23:43:511 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token5.518620717201355 BNB
0x3cc8bd6cbabb70c5304d3045552f2674196f6c0a94855ae1556348ef05cfd801113211242021-09-28 23:43:511 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80x93fe0ce8ead5dae04febd6d995ca8e38568c1dff3.172122988646973225 BNB
0x3cc8bd6cbabb70c5304d3045552f2674196f6c0a94855ae1556348ef05cfd801113211242021-09-28 23:43:511 min ago Binance: WBNB Token 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd83.172122988646973225 BNB
0xcbf0560d5a2e19e8373c9907dbc7cc459178db76be9a78672b67a252cdabb563113211242021-09-28 23:43:511 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token12.027975885945057 BNB
0x2f43408209158362a63b6fd2f69161e6a04895d0423eabf2bb6ac018bdc50a36113211242021-09-28 23:43:511 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token17.125 BNB
0xa36e09099964399acb31d5354b066fda71fa9b9b60280d9f24529a1883dcec21113211232021-09-28 23:43:481 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token18.014399049811477 BNB
0x15c3d94ce55e89b4e842b81dd210e8e4bcd737c9399bd359c58e049adc1f2bde113211222021-09-28 23:43:451 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80x93fe0ce8ead5dae04febd6d995ca8e38568c1dff12.324697235258150182 BNB
0x15c3d94ce55e89b4e842b81dd210e8e4bcd737c9399bd359c58e049adc1f2bde113211222021-09-28 23:43:451 min ago Binance: WBNB Token 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd812.324697235258150182 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BiswapRouter02

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 999999 runs

Other Settings:
istanbul EvmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-05-24
*/

pragma solidity =0.6.6;

interface IBiswapFactory {
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function createPair(address tokenA, address tokenB) external returns (address pair);
}
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');
    }
}
interface IBiswapRouter02 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function swapFeeReward() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

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

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

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}
interface IBiswapPair {
    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 swapFee() external view returns (uint32);
    function devFee() external view returns (uint32);

    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;
    function setSwapFee(uint32) external;
    function setDevFee(uint32) external;
}


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

library BiswapLibrary {
    using SafeMath for uint;

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

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

    function getSwapFee(address factory, address tokenA, address tokenB) internal view returns (uint swapFee) {
        swapFee = IBiswapPair(pairFor(factory, tokenA, tokenB)).swapFee();
    }

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

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

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

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

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

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

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);
}
interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}
library Babylonian {
    // credit for this implementation goes to
    // https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol#L687
    function sqrt(uint256 x) internal pure returns (uint256) {
        if (x == 0) return 0;
        // this block is equivalent to r = uint256(1) << (BitMath.mostSignificantBit(x) / 2);
        // however that code costs significantly more gas
        uint256 xx = x;
        uint256 r = 1;
        if (xx >= 0x100000000000000000000000000000000) {
            xx >>= 128;
            r <<= 64;
        }
        if (xx >= 0x10000000000000000) {
            xx >>= 64;
            r <<= 32;
        }
        if (xx >= 0x100000000) {
            xx >>= 32;
            r <<= 16;
        }
        if (xx >= 0x10000) {
            xx >>= 16;
            r <<= 8;
        }
        if (xx >= 0x100) {
            xx >>= 8;
            r <<= 4;
        }
        if (xx >= 0x10) {
            xx >>= 4;
            r <<= 2;
        }
        if (xx >= 0x8) {
            r <<= 1;
        }
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1; // Seven iterations should be enough
        uint256 r1 = x / r;
        return (r < r1 ? r : r1);
    }
}
library FullMath {
    function fullMul(uint256 x, uint256 y) internal pure returns (uint256 l, uint256 h) {
        uint256 mm = mulmod(x, y, uint256(-1));
        l = x * y;
        h = mm - l;
        if (mm < l) h -= 1;
    }

    function fullDiv(
        uint256 l,
        uint256 h,
        uint256 d
    ) private pure returns (uint256) {
        uint256 pow2 = d & -d;
        d /= pow2;
        l /= pow2;
        l += h * ((-pow2) / pow2 + 1);
        uint256 r = 1;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        return l * r;
    }

    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 d
    ) internal pure returns (uint256) {
        (uint256 l, uint256 h) = fullMul(x, y);

        uint256 mm = mulmod(x, y, d);
        if (mm > l) h -= 1;
        l -= mm;

        if (h == 0) return l / d;

        require(h < d, 'FullMath: FULLDIV_OVERFLOW');
        return fullDiv(l, h, d);
    }
}

contract Ownable {
    address private _owner;

    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    function isOwner(address account) public view returns (bool) {
        return account == _owner;
    }

    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }


    modifier onlyOwner() {
        require(isOwner(msg.sender), "Ownable: caller is not the owner");
        _;
    }

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
}

interface ISwapFeeReward {
    function swap(address account, address input, address output, uint256 amount) external returns (bool);
}

contract BiswapRouter02 is IBiswapRouter02, Ownable {
    using SafeMath for uint;

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

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

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

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

    function setSwapFeeReward(address _swapFeeReward) public onlyOwner {
        swapFeeReward = _swapFeeReward;
    }

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (IBiswapFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IBiswapFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = BiswapLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = BiswapLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'BiswapV2Router: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = BiswapLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'BiswapV2Router: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = BiswapLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IBiswapPair(pair).mint(to);
    }
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = BiswapLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IBiswapPair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = BiswapLibrary.pairFor(factory, tokenA, tokenB);
        IBiswapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IBiswapPair(pair).burn(to);
        (address token0,) = BiswapLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'BiswapV2Router: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'BiswapV2Router: INSUFFICIENT_B_AMOUNT');
    }
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountA, uint amountB) {
        address pair = BiswapLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IBiswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountToken, uint amountETH) {
        address pair = BiswapLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IBiswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountETH) {
        (, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountETH) {
        address pair = BiswapLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IBiswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token, liquidity, amountTokenMin, amountETHMin, to, deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = BiswapLibrary.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            if (swapFeeReward != address(0)) {
                ISwapFeeReward(swapFeeReward).swap(msg.sender, input, output, amountOut);
            }
            address to = i < path.length - 2 ? BiswapLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IBiswapPair(BiswapLibrary.pairFor(factory, input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = BiswapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BiswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, BiswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = BiswapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'BiswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, BiswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'BiswapV2Router: INVALID_PATH');
        amounts = BiswapLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BiswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(BiswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'BiswapV2Router: INVALID_PATH');
        amounts = BiswapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'BiswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, BiswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'BiswapV2Router: INVALID_PATH');
        amounts = BiswapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BiswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, BiswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'BiswapV2Router: INVALID_PATH');
        amounts = BiswapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'BiswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(BiswapLibrary.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,) = BiswapLibrary.sortTokens(input, output);
            IBiswapPair pair = IBiswapPair(BiswapLibrary.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 = BiswapLibrary.getAmountOut(amountInput, reserveInput, reserveOutput, pair.swapFee());
            }
            if (swapFeeReward != address(0)) {
                ISwapFeeReward(swapFeeReward).swap(msg.sender, input, output, amountOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? BiswapLibrary.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, BiswapLibrary.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,
            'BiswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'BiswapV2Router: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(BiswapLibrary.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,
            'BiswapV2Router: 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, 'BiswapV2Router: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, BiswapLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'BiswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"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"},{"internalType":"uint256","name":"swapFee","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"},{"internalType":"uint256","name":"swapFee","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":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_swapFeeReward","type":"address"}],"name":"setSwapFeeReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapFeeReward","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040523480156200001157600080fd5b5060405162005fd938038062005fd9833981810160405260408110156200003757600080fd5b508051602090910151600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c615e09620001d0600039806101ee5280610fbe5280610ff9528061112152806113e4528061185f5280611a685280612093528061221752806122e752806123ee52806125a15280612636528061291352806129c25280612a975280612b9c5280612c845280612d055280613394528061374a52806137a052806137d452806138555280613a6f5280613c1f5280613cb4525080611213528061131152806114b752806114f052806116bc52806119515280611a465280611c3352806124d4528061267552806128115280612d445280613087528061331952806133425280613372528061354f528061377e5280613b555280613cf352806147fd52806148405280614e30528061516152806155b8528061569952806157195250615e096000f3fe6080604052600436106101d15760003560e01c80638da5cb5b116100f7578063c45a015511610095578063f2fde38b11610064578063f2fde38b14610ddf578063f305d71914610e1f578063fb3bdb4114610e72578063fbbeedf114610f0557610217565b8063c45a015514610c06578063d06ca61f14610c1b578063ded9382a14610cd2578063e8e3370014610d5257610217565b8063ad615dec116100d1578063ad615dec14610a73578063af2979eb14610aa9578063b6f9de9514610b09578063baa2abde14610b9c57610217565b80638da5cb5b14610a0b578063a3ddb30b14610a49578063ad5c464814610a5e57610217565b806352707d8c1161016f578063715018a61161013e578063715018a614610819578063791ac9471461082e5780637ff36ab5146108d35780638803dbee1461096657610217565b806352707d8c1461066a578063571fd012146106b85780635b0d5984146106f45780635c11d7951461077457610217565b80632195995c116101ab5780632195995c146104415780632f54bf6e146104cc57806338ed1739146105205780634a25d94a146105c557610217565b806302751cec1461021c57806318cbafe5146102955780631f00ca741461038a57610217565b36610217573373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461021557fe5b005b600080fd5b34801561022857600080fd5b5061027c600480360360c081101561023f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610f45565b6040805192835260208301919091528051918290030190f35b3480156102a157600080fd5b5061033a600480360360a08110156102b857600080fd5b8135916020810135918101906060810160408201356401000000008111156102df57600080fd5b8201836020820111156102f157600080fd5b8035906020019184602083028401116401000000008311171561031357600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611098565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037657818101518382015260200161035e565b505050509050019250505060405180910390f35b34801561039657600080fd5b5061033a600480360360408110156103ad57600080fd5b813591908101906040810160208201356401000000008111156103cf57600080fd5b8201836020820111156103e157600080fd5b8035906020019184602083028401116401000000008311171561040357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506114b0945050505050565b34801561044d57600080fd5b5061027c600480360361016081101561046557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff61010082013516906101208101359061014001356114e6565b3480156104d857600080fd5b5061050c600480360360208110156104ef57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611624565b604080519115158252519081900360200190f35b34801561052c57600080fd5b5061033a600480360360a081101561054357600080fd5b81359160208101359181019060608101604082013564010000000081111561056a57600080fd5b82018360208201111561057c57600080fd5b8035906020019184602083028401116401000000008311171561059e57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611645565b3480156105d157600080fd5b5061033a600480360360a08110156105e857600080fd5b81359160208101359181019060608101604082013564010000000081111561060f57600080fd5b82018360208201111561062157600080fd5b8035906020019184602083028401116401000000008311171561064357600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356117d6565b34801561067657600080fd5b506106a66004803603608081101561068d57600080fd5b5080359060208101359060408101359060600135611a19565b60408051918252519081900360200190f35b3480156106c457600080fd5b506106a6600480360360808110156106db57600080fd5b5080359060208101359060408101359060600135611a30565b34801561070057600080fd5b506106a6600480360361014081101561071857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611a3e565b34801561078057600080fd5b50610215600480360360a081101561079757600080fd5b8135916020810135918101906060810160408201356401000000008111156107be57600080fd5b8201836020820111156107d057600080fd5b803590602001918460208302840111640100000000831117156107f257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611b90565b34801561082557600080fd5b50610215611f29565b34801561083a57600080fd5b50610215600480360360a081101561085157600080fd5b81359160208101359181019060608101604082013564010000000081111561087857600080fd5b82018360208201111561088a57600080fd5b803590602001918460208302840111640100000000831117156108ac57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813516906020013561200c565b61033a600480360360808110156108e957600080fd5b8135919081019060408101602082013564010000000081111561090b57600080fd5b82018360208201111561091d57600080fd5b8035906020019184602083028401116401000000008311171561093f57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813516906020013561237a565b34801561097257600080fd5b5061033a600480360360a081101561098957600080fd5b8135916020810135918101906060810160408201356401000000008111156109b057600080fd5b8201836020820111156109c257600080fd5b803590602001918460208302840111640100000000831117156109e457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813516906020013561279a565b348015610a1757600080fd5b50610a206128d9565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b348015610a5557600080fd5b50610a206128f5565b348015610a6a57600080fd5b50610a20612911565b348015610a7f57600080fd5b506106a660048036036060811015610a9657600080fd5b5080359060208101359060400135612935565b348015610ab557600080fd5b506106a6600480360360c0811015610acc57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a0013561294a565b61021560048036036080811015610b1f57600080fd5b81359190810190604081016020820135640100000000811115610b4157600080fd5b820183602082011115610b5357600080fd5b80359060200191846020830284011164010000000083111715610b7557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612b2a565b348015610ba857600080fd5b5061027c600480360360e0811015610bbf57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c0013561300d565b348015610c1257600080fd5b50610a20613317565b348015610c2757600080fd5b5061033a60048036036040811015610c3e57600080fd5b81359190810190604081016020820135640100000000811115610c6057600080fd5b820183602082011115610c7257600080fd5b80359060200191846020830284011164010000000083111715610c9457600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061333b945050505050565b348015610cde57600080fd5b5061027c6004803603610140811015610cf657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135613368565b348015610d5e57600080fd5b50610dc16004803603610100811015610d7657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e001356134c0565b60408051938452602084019290925282820152519081900360600190f35b348015610deb57600080fd5b5061021560048036036020811015610e0257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661364f565b610dc1600480360360c0811015610e3557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356136cf565b61033a60048036036080811015610e8857600080fd5b81359190810190604081016020820135640100000000811115610eaa57600080fd5b820183602082011115610ebc57600080fd5b80359060200191846020830284011164010000000083111715610ede57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356139fb565b348015610f1157600080fd5b5061021560048036036020811015610f2857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613e4a565b6000808242811015610fb857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b610fe7897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a61300d565b9093509150610ff7898685613f05565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561106a57600080fd5b505af115801561107e573d6000803e3d6000fd5b5050505061108c85836140cc565b50965096945050505050565b6060814281101561110a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061116f57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461120e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4269737761705632526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b61126c7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061420992505050565b9150868260018451038151811061127f57fe5b602002602001015110156112de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615cc0602a913960400191505060405180910390fd5b6113a3868660008181106112ee57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16336113897f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061133d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061136757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166143a3565b8560008151811061139657fe5b602002602001015161448e565b6113e28287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061465e915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8360018551038151811061142e57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561146c57600080fd5b505af1158015611480573d6000803e3d6000fd5b505050506114a5848360018551038151811061149857fe5b60200260200101516140cc565b509695505050505050565b60606114dd7f000000000000000000000000000000000000000000000000000000000000000084846149bb565b90505b92915050565b60008060006115167f00000000000000000000000000000000000000000000000000000000000000008f8f6143a3565b9050600087611525578c611547565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156115e357600080fd5b505af11580156115f7573d6000803e3d6000fd5b5050505061160a8f8f8f8f8f8f8f61300d565b809450819550505050509b509b9950505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161490565b606081428110156116b757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6117157f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061420992505050565b9150868260018451038151811061172857fe5b60200260200101511015611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615cc0602a913960400191505060405180910390fd5b611797868660008181106112ee57fe5b6114a58287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061465e915050565b6060814281101561184857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181106118ad57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461194c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4269737761705632526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b6119aa7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506149bb92505050565b915086826000815181106119ba57fe5b602002602001015111156112de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615bc86026913960400191505060405180910390fd5b6000611a2785858585614b70565b95945050505050565b6000611a2785858585614ca5565b600080611a8c7f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006143a3565b9050600086611a9b578b611abd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b158015611b5957600080fd5b505af1158015611b6d573d6000803e3d6000fd5b50505050611b7f8d8d8d8d8d8d61294a565b9d9c50505050505050505050505050565b8042811015611c0057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b611c8f85856000818110611c1057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611c897f000000000000000000000000000000000000000000000000000000000000000089896000818110611c5f57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061136757fe5b8a61448e565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611cbf57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611d5857600080fd5b505afa158015611d6c573d6000803e3d6000fd5b505050506040513d6020811015611d8257600080fd5b50516040805160208881028281018201909352888252929350611dc4929091899189918291850190849080828437600092019190915250889250614dd9915050565b86611ec88288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611df757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611e9057600080fd5b505afa158015611ea4573d6000803e3d6000fd5b505050506040513d6020811015611eba57600080fd5b50519063ffffffff6152bc16565b1015611f1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615cc0602a913960400191505060405180910390fd5b5050505050505050565b611f3233611624565b611f9d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b804281101561207c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181106120e157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461218057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4269737761705632526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b61219085856000818110611c1057fe5b6121ce858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614dd9915050565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b15801561225e57600080fd5b505afa158015612272573d6000803e3d6000fd5b505050506040513d602081101561228857600080fd5b50519050868110156122e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615cc0602a913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561235857600080fd5b505af115801561236c573d6000803e3d6000fd5b50505050611f1f84826140cc565b606081428110156123ec57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168686600081811061243057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124cf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4269737761705632526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b61252d7f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061420992505050565b9150868260018451038151811061254057fe5b6020026020010151101561259f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615cc0602a913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836000815181106125e857fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561261b57600080fd5b505af115801561262f573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6126a17f000000000000000000000000000000000000000000000000000000000000000089896000818110611c5f57fe5b846000815181106126ae57fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561271f57600080fd5b505af1158015612733573d6000803e3d6000fd5b505050506040513d602081101561274957600080fd5b505161275157fe5b6127908287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061465e915050565b5095945050505050565b6060814281101561280c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b61286a7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506149bb92505050565b9150868260008151811061287a57fe5b60200260200101511115611787576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615bc86026913960400191505060405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061294284848461532e565b949350505050565b600081428110156129bc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6129eb887f0000000000000000000000000000000000000000000000000000000000000000898989308961300d565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051919450612a9592508a91879173ffffffffffffffffffffffffffffffffffffffff8416916370a0823191602480820192602092909190829003018186803b158015612a6457600080fd5b505afa158015612a78573d6000803e3d6000fd5b505050506040513d6020811015612a8e57600080fd5b5051613f05565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612b0857600080fd5b505af1158015612b1c573d6000803e3d6000fd5b505050506114a584836140cc565b8042811015612b9a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1685856000818110612bde57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612c7d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4269737761705632526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612cea57600080fd5b505af1158015612cfe573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612d707f000000000000000000000000000000000000000000000000000000000000000089896000818110611c5f57fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612dda57600080fd5b505af1158015612dee573d6000803e3d6000fd5b505050506040513d6020811015612e0457600080fd5b5051612e0c57fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612e3c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612ed557600080fd5b505afa158015612ee9573d6000803e3d6000fd5b505050506040513d6020811015612eff57600080fd5b50516040805160208981028281018201909352898252929350612f419290918a918a918291850190849080828437600092019190915250899250614dd9915050565b87611ec88289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612f7457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611e9057600080fd5b600080824281101561308057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b60006130ad7f00000000000000000000000000000000000000000000000000000000000000008c8c6143a3565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561312e57600080fd5b505af1158015613142573d6000803e3d6000fd5b505050506040513d602081101561315857600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156131cb57600080fd5b505af11580156131df573d6000803e3d6000fd5b505050506040513d60408110156131f557600080fd5b5080516020909101519092509050600061320f8e8e61540e565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff161461324c57818361324f565b82825b90975095508a8710156132ad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615cea6025913960400191505060405180910390fd5b89861015613306576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615c146025913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606114dd7f00000000000000000000000000000000000000000000000000000000000000008484614209565b60008060006133b87f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006143a3565b90506000876133c7578c6133e9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561348557600080fd5b505af1158015613499573d6000803e3d6000fd5b505050506134ab8e8e8e8e8e8e610f45565b909f909e509c50505050505050505050505050565b6000806000834281101561353557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6135438c8c8c8c8c8c615561565b909450925060006135757f00000000000000000000000000000000000000000000000000000000000000008e8e6143a3565b90506135838d33838861448e565b61358f8c33838761448e565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561360e57600080fd5b505af1158015613622573d6000803e3d6000fd5b505050506040513d602081101561363857600080fd5b5051949d939c50939a509198505050505050505050565b61365833611624565b6136c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6136cc81615862565b50565b6000806000834281101561374457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6137728a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c615561565b909450925060006137c47f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006143a3565b90506137d28b33838861448e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561383a57600080fd5b505af115801561384e573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156138fa57600080fd5b505af115801561390e573d6000803e3d6000fd5b505050506040513d602081101561392457600080fd5b505161392c57fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156139ab57600080fd5b505af11580156139bf573d6000803e3d6000fd5b505050506040513d60208110156139d557600080fd5b50519250348410156139ed576139ed338534036140cc565b505096509650969350505050565b60608142811015613a6d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1686866000818110613ab157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613b5057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4269737761705632526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b613bae7f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506149bb92505050565b91503482600081518110613bbe57fe5b60200260200101511115613c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615bc86026913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db083600081518110613c6657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015613c9957600080fd5b505af1158015613cad573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb613d1f7f000000000000000000000000000000000000000000000000000000000000000089896000818110611c5f57fe5b84600081518110613d2c57fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613d9d57600080fd5b505af1158015613db1573d6000803e3d6000fd5b505050506040513d6020811015613dc757600080fd5b5051613dcf57fe5b613e0e8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061465e915050565b81600081518110613e1b57fe5b6020026020010151341115612790576127903383600081518110613e3b57fe5b602002602001015134036140cc565b613e5333611624565b613ebe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613fdb57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613f9e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461403d576040519150601f19603f3d011682016040523d82523d6000602084013e614042565b606091505b5091509150818015614070575080511580614070575080806020019051602081101561406d57600080fd5b50515b6140c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180615da7602d913960400191505060405180910390fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b6020831061414357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614106565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146141a5576040519150601f19603f3d011682016040523d82523d6000602084013e6141aa565b606091505b5050905080614204576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180615c6a6034913960400191505060405180910390fd5b505050565b606060028251101561427c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4269737761704c6962726172793a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561429457600080fd5b506040519080825280602002602001820160405280156142be578160200160208202803683370190505b50905082816000815181106142cf57fe5b60200260200101818152505060005b600183510381101561439b57600080614321878685815181106142fd57fe5b602002602001015187866001018151811061431457fe5b602002602001015161595b565b9150915061437784848151811061433457fe5b602002602001015183836143728b8a898151811061434e57fe5b60200260200101518b8a6001018151811061436557fe5b6020026020010151615a43565b614b70565b84846001018151811061438657fe5b602090810291909101015250506001016142de565b509392505050565b60008060006143b2858561540e565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527ffea293c909d87cd4153593f077b76bb7e94340200f4ee84211ae8e4f9bd7ffdf609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061456c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161452f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146145ce576040519150601f19603f3d011682016040523d82523d6000602084013e6145d3565b606091505b509150915081801561460157508051158061460157508080602001905160208110156145fe57600080fd5b50515b614656576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180615c396031913960400191505060405180910390fd5b505050505050565b60005b60018351038110156149b55760008084838151811061467c57fe5b602002602001015185846001018151811061469357fe5b60200260200101519150915060006146ab838361540e565b50905060008785600101815181106146bf57fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146147075782600061470b565b6000835b600154919350915073ffffffffffffffffffffffffffffffffffffffff16156147e557600154604080517fa9678a1800000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018790529151919092169163a9678a189160848083019260209291908290030181600087803b1580156147b857600080fd5b505af11580156147cc573d6000803e3d6000fd5b505050506040513d60208110156147e257600080fd5b50505b600060028a510388106147f85788614839565b6148397f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061482c57fe5b60200260200101516143a3565b90506148667f000000000000000000000000000000000000000000000000000000000000000088886143a3565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156148b0576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561493b578181015183820152602001614923565b50505050905090810190601f1680156149685780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561498a57600080fd5b505af115801561499e573d6000803e3d6000fd5b505060019099019850614661975050505050505050565b50505050565b6060600282511015614a2e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4269737761704c6962726172793a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015614a4657600080fd5b50604051908082528060200260200182016040528015614a70578160200160208202803683370190505b5090508281600183510381518110614a8457fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b801561439b57600080614ae487866001860381518110614ad057fe5b602002602001015187868151811061431457fe5b91509150614b2d848481518110614af757fe5b60200260200101518383614b288b8a60018a0381518110614b1457fe5b60200260200101518b8a8151811061436557fe5b614ca5565b846001850381518110614b3c57fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01614ab4565b6000808511614bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615d7f6028913960400191505060405180910390fd5b600084118015614bda5750600083115b614c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615d0f6025913960400191505060405180910390fd5b6000614c53614c466103e88563ffffffff6152bc16565b879063ffffffff615acf16565b90506000614c67828663ffffffff615acf16565b90506000614c8d83614c81896103e863ffffffff615acf16565b9063ffffffff615b5516565b9050808281614c9857fe5b0498975050505050505050565b6000808511614cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180615d346029913960400191505060405180910390fd5b600084118015614d0f5750600083115b614d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615d0f6025913960400191505060405180910390fd5b6000614d886103e8614d7c878963ffffffff615acf16565b9063ffffffff615acf16565b90506000614db1614da16103e88663ffffffff6152bc16565b614d7c878a63ffffffff6152bc16565b9050614dce6001828481614dc157fe5b049063ffffffff615b5516565b979650505050505050565b60005b600183510381101561420457600080848381518110614df757fe5b6020026020010151858460010181518110614e0e57fe5b6020026020010151915091506000614e26838361540e565b5090506000614e567f000000000000000000000000000000000000000000000000000000000000000085856143a3565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015614ea457600080fd5b505afa158015614eb8573d6000803e3d6000fd5b505050506040513d6060811015614ece57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a811690891614614f18578284614f1b565b83835b91509150614fa0828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611e9057600080fd5b95506150258683838a73ffffffffffffffffffffffffffffffffffffffff166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b158015614fee57600080fd5b505afa158015615002573d6000803e3d6000fd5b505050506040513d602081101561501857600080fd5b505163ffffffff16614b70565b60015490955073ffffffffffffffffffffffffffffffffffffffff161593506151039250505057600154604080517fa9678a1800000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018590529151919092169163a9678a189160848083019260209291908290030181600087803b1580156150d657600080fd5b505af11580156150ea573d6000803e3d6000fd5b505050506040513d602081101561510057600080fd5b50505b6000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461514157826000615145565b6000835b91509150600060028c51038a1061515c578a615190565b6151907f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061482c57fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015615240578181015183820152602001615228565b50505050905090810190601f16801561526d5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561528f57600080fd5b505af11580156152a3573d6000803e3d6000fd5b50506001909b019a50614ddc9950505050505050505050565b808203828111156114e057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411615388576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615c9e6022913960400191505060405180910390fd5b6000831180156153985750600082115b6153ed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615d0f6025913960400191505060405180910390fd5b826153fe858463ffffffff615acf16565b8161540557fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415615496576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615d5d6022913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16106154d05782846154d3565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff821661555a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4269737761704c6962726172793a205a45524f5f414444524553530000000000604482015290519081900360640190fd5b9250929050565b604080517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b15801561560157600080fd5b505afa158015615615573d6000803e3d6000fd5b505050506040513d602081101561562b57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16141561571157604080517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b1580156156e457600080fd5b505af11580156156f8573d6000803e3d6000fd5b505050506040513d602081101561570e57600080fd5b50505b60008061573f7f00000000000000000000000000000000000000000000000000000000000000008b8b61595b565b91509150816000148015615751575080155b1561576157879350869250615855565b600061576e89848461532e565b90508781116157db57858110156157d0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615c146025913960400191505060405180910390fd5b889450925082615853565b60006157e889848661532e565b9050898111156157f457fe5b8781101561584d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615cea6025913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b73ffffffffffffffffffffffffffffffffffffffff81166158ce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615bee6026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080600061596a858561540e565b50905060008061597b8888886143a3565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156159c057600080fd5b505afa1580156159d4573d6000803e3d6000fd5b505050506040513d60608110156159ea57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff87811690841614615a31578082615a34565b81815b90999098509650505050505050565b6000615a508484846143a3565b73ffffffffffffffffffffffffffffffffffffffff166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b158015615a9557600080fd5b505afa158015615aa9573d6000803e3d6000fd5b505050506040513d6020811015615abf57600080fd5b505163ffffffff16949350505050565b6000811580615aea57505080820282828281615ae757fe5b04145b6114e057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b808201828110156114e057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fdfe4269737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e544f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734269737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e545472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c65644269737761704c6962726172793a20494e53554646494349454e545f414d4f554e544269737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e544269737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e544269737761704c6962726172793a20494e53554646494349454e545f4c49515549444954594269737761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e544269737761704c6962726172793a204944454e544943414c5f4144445245535345534269737761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564a2646970667358221220f423f81b1021c390c07163c4c9533ea8e8210b30f207fd0772f424ce157fa61f64736f6c63430006060033000000000000000000000000858e3312ed3a876947ea49d572a7c42de08af7ee000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

000000000000000000000000858e3312ed3a876947ea49d572a7c42de08af7ee000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000858e3312ed3a876947ea49d572a7c42de08af7ee
Arg [1] : 000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c


Deployed ByteCode Sourcemap

19397:18926:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19925:10;:18;19939:4;19925:18;;19918:26;;;;19397:18926;;12:1:-1;9;2:12;24156:673:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24156:673:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;24156:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31419:842;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31419:842:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31419:842:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;31419:842:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31419:842:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31419:842:0;;-1:-1:-1;31419:842:0;-1:-1:-1;31419:842:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;31419:842:0;;;;;;;;;;;;;;;;;38070:250;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38070:250:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;38070:250:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;38070:250:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;38070:250:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;38070:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38070:250:0;;-1:-1:-1;38070:250:0;;-1:-1:-1;;;;;38070:250:0:i;24835:671::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24835:671:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;24835:671:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18425:104::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18425:104:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;18425:104:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;28666:621;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28666:621:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;28666:621:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;28666:621:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;28666:621:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;28666:621:0;;-1:-1:-1;28666:621:0;-1:-1:-1;28666:621:0;;;;;;;;;:::i;30593:820::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30593:820:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;30593:820:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;30593:820:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;30593:820:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30593:820:0;;-1:-1:-1;30593:820:0;-1:-1:-1;30593:820:0;;;;;;;;;:::i;37233:282::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37233:282:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;37233:282:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;37523:281;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37523:281:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;37523:281:0;;;;;;;;;;;;;;;;;:::i;26960:712::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26960:712:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;26960:712:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34591:710::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34591:710:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;34591:710:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;34591:710:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34591:710:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34591:710:0;;-1:-1:-1;34591:710:0;-1:-1:-1;34591:710:0;;;;;;;;;:::i;18537:140::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18537:140:0;;;:::i;36158:838::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36158:838:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;36158:838:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;36158:838:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;36158:838:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;36158:838:0;;-1:-1:-1;36158:838:0;-1:-1:-1;36158:838:0;;;;;;;;;:::i;29898:689::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;29898:689:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;29898:689:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;29898:689:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;29898:689:0;;-1:-1:-1;29898:689:0;-1:-1:-1;29898:689:0;;;;;;;;;:::i;29293:599::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29293:599:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;29293:599:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;29293:599:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;29293:599:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;29293:599:0;;-1:-1:-1;29293:599:0;-1:-1:-1;29293:599:0;;;;;;;;;:::i;18338:79::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18338:79:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19581:37;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19581:37:0;;;:::i;19536:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19536:38:0;;;:::i;37040:185::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37040:185:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37040:185:0;;;;;;;;;;;;:::i;26254:700::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26254:700:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;26254:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35307:845::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;35307:845:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;35307:845:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35307:845:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;35307:845:0;;-1:-1:-1;35307:845:0;-1:-1:-1;35307:845:0;;;;;;;;;:::i;23299:851::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23299:851:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;23299:851:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19488:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19488:41:0;;;:::i;37812:250::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37812:250:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;37812:250:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;37812:250:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;37812:250:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37812:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;37812:250:0;;-1:-1:-1;37812:250:0;;-1:-1:-1;;;;;37812:250:0:i;25512:663::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25512:663:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;25512:663:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21550:732::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21550:732:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;21550:732:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;18922:109;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18922:109:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;18922:109:0;;;;:::i;22288:968::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;22288:968:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32267:802::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;32267:802:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;32267:802:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;32267:802:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32267:802:0;;-1:-1:-1;32267:802:0;-1:-1:-1;32267:802:0;;;;;;;;;:::i;20015:116::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20015:116:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20015:116:0;;;;:::i;24156:673::-;24393:16;24411:14;24374:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24465:196:::1;24495:5;24515:4;24534:9;24558:14;24587:12;24622:4;24642:8;24465:15;:196::i;:::-;24438:223:::0;;-1:-1:-1;24438:223:0;-1:-1:-1;24672:51:0::1;24700:5:::0;24707:2;24438:223;24672:27:::1;:51::i;:::-;24740:4;24734:20;;;24755:9;24734:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;24734:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24734:31:0;;;;24776:45;24807:2;24811:9;24776:30;:45::i;:::-;24156:673:::0;;;;;;;;;;:::o;31419:842::-;31633:21;31605:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31680:29:::1;31705:4;31680:29;:4:::0;;31685:15;;;31680:21;;::::1;;;;;;;;;;;;;:29;;;31672:70;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31763:52;31791:7;31800:8;31810:4;;31763:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;31763:27:0::1;::::0;-1:-1:-1;;;31763:52:0:i:1;:::-;31753:62;;31865:12;31834:7;31859:1;31842:7;:14;:18;31834:27;;;;;;;;;;;;;;:43;;31826:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31935:138;31981:4;;31986:1;31981:7;;;;;;;;;;;;;;;31990:10;32002:48;32024:7;32033:4;;32038:1;32033:7;;;;;;;;;;;;;;;32042:4;;32047:1;32042:7;;;;;;;;;;;;;;;32002:21;:48::i;:::-;32052:7;32060:1;32052:10;;;;;;;;;;;;;;31935:31;:138::i;:::-;32084:35;32090:7;32099:4;;32084:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32113:4:0::1;::::0;-1:-1:-1;32084:5:0::1;::::0;-1:-1:-1;;32084:35:0:i:1;:::-;32136:4;32130:20;;;32151:7;32176:1;32159:7;:14;:18;32151:27;;;;;;;;;;;;;;32130:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32130:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32130:49:0;;;;32190:63;32221:2;32225:7;32250:1;32233:7;:14;:18;32225:27;;;;;;;;;;;;;;32190:30;:63::i;:::-;31419:842:::0;;;;;;;;;:::o;38070:250::-;38214:21;38260:52;38287:7;38296:9;38307:4;38260:26;:52::i;:::-;38253:59;;38070:250;;;;;:::o;24835:671::-;25141:12;25155;25180;25195:46;25217:7;25226:6;25234;25195:21;:46::i;:::-;25180:61;;25252:10;25265;:33;;25289:9;25265:33;;;25283:2;25265:33;25309:77;;;;;;25334:10;25309:77;;;;25354:4;25309:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25252:46;;-1:-1:-1;25309:24:0;;;;;;:77;;;;;-1:-1:-1;;25309:77:0;;;;;;;;-1:-1:-1;25309:24:0;:77;;;2:2:-1;;;;27:1;24;17:12;2:2;25309:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25309:77:0;;;;25418:80;25434:6;25442;25450:9;25461:10;25473;25485:2;25489:8;25418:15;:80::i;:::-;25397:101;;;;;;;;24835:671;;;;;;;;;;;;;;;;:::o;18425:104::-;18480:4;18515:6;;;;;18504:17;;;;18425:104::o;28666:621::-;28890:21;28871:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28934:52:::1;28962:7;28971:8;28981:4;;28934:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28934:27:0::1;::::0;-1:-1:-1;;;28934:52:0:i:1;:::-;28924:62;;29036:12;29005:7;29030:1;29013:7;:14;:18;29005:27;;;;;;;;;;;;;;:43;;28997:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29106:138;29152:4;;29157:1;29152:7;;;;;;29106:138;29255:24;29261:7;29270:4;;29255:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29276:2:0;;-1:-1:-1;29255:5:0::1;::::0;-1:-1:-1;;29255:24:0:i:1;30593:820::-:0;30807:21;30779:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30854:29:::1;30879:4;30854:29;:4:::0;;30859:15;;;30854:21;;::::1;;;;;;;;;;;;;:29;;;30846:70;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;30937:52;30964:7;30973:9;30984:4;;30937:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;30937:26:0::1;::::0;-1:-1:-1;;;30937:52:0:i:1;:::-;30927:62;;31022:11;31008:7;31016:1;31008:10;;;;;;;;;;;;;;:25;;31000:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37233:282:::0;37400:14;37439:68;37466:8;37476:9;37487:10;37499:7;37439:26;:68::i;:::-;37432:75;37233:282;-1:-1:-1;;;;;37233:282:0:o;37523:281::-;37690:13;37728:68;37754:9;37765;37776:10;37788:7;37728:25;:68::i;26960:712::-;27278:14;27305:12;27320:43;27342:7;27351:5;27358:4;27320:21;:43::i;:::-;27305:58;;27374:10;27387;:33;;27411:9;27387:33;;;27405:2;27387:33;27431:77;;;;;;27456:10;27431:77;;;;27476:4;27431:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27374:46;;-1:-1:-1;27431:24:0;;;;;;:77;;;;;-1:-1:-1;;27431:77:0;;;;;;;;-1:-1:-1;27431:24:0;:77;;;2:2:-1;;;;27:1;24;17:12;2:2;27431:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27431:77:0;;;;27531:133;27593:5;27600:9;27611:14;27627:12;27641:2;27645:8;27531:47;:133::i;:::-;27519:145;26960:712;-1:-1:-1;;;;;;;;;;;;;26960:712:0:o;34591:710::-;34825:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34846:136:::1;34892:4;;34897:1;34892:7;;;;;;;;;;;;;;;34901:10;34913:48;34935:7;34944:4;;34949:1;34944:7;;;;;;;;;;;;;;;34953:4;;34958:1;34953:7;;;;;;34913:48;34963:8;34846:31;:136::i;:::-;34993:18;35021:4:::0;;35026:15;;;35021:21;;::::1;;;;;;;;;;;;;35014:39;;;35054:2;35014:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35014:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35014:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;35014:43:0;35068:44:::1;::::0;;35014:43:::1;35068:44:::0;;::::1;::::0;;;;;;;;;;;35014:43;;-1:-1:-1;35068:44:0::1;::::0;;;35103:4;;;;;;35068:44;::::1;::::0;35103:4;;35068:44;35103:4;35068:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;35109:2:0;;-1:-1:-1;35068:34:0::1;::::0;-1:-1:-1;;35068:44:0:i:1;:::-;35211:12:::0;35145:62:::1;35193:13:::0;35152:4;;35157:15;;;35152:21;;::::1;;;;;;;;;;;;;35145:39;;;35185:2;35145:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35145:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35145:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;35145:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;35123:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19743:1;34591:710:::0;;;;;;;:::o;18537:140::-;19081:19;19089:10;19081:7;:19::i;:::-;19073:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18636:1:::1;18620:6:::0;;18599:40:::1;::::0;::::1;18620:6:::0;;::::1;::::0;18599:40:::1;::::0;18636:1;;18599:40:::1;18667:1;18650:19:::0;;;::::1;::::0;;18537:140::o;36158:838::-;36425:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36459:29:::1;36484:4;36459:29;:4:::0;;36464:15;;;36459:21;;::::1;;;;;;;;;;;;;:29;;;36451:70;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;36532:136;36578:4;;36583:1;36578:7;;;;;;36532:136;36679:55;36714:4;;36679:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36728:4:0::1;::::0;-1:-1:-1;36679:34:0::1;::::0;-1:-1:-1;;36679:55:0:i:1;:::-;36762:37;::::0;;;;;36793:4:::1;36762:37;::::0;::::1;::::0;;;36745:14:::1;::::0;36762:22:::1;36769:4;36762:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;36762:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36762:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;36762:37:0;;-1:-1:-1;36818:25:0;;::::1;;36810:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36907:4;36901:20;;;36922:9;36901:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36901:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36901:31:0;;;;36943:45;36974:2;36978:9;36943:30;:45::i;29898:689::-:0;30114:21;30086:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30172:4:::1;30161:15;;:4;;30166:1;30161:7;;;;;;;;;;;;;;;:15;;;30153:56;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;30230:53;30258:7;30267:9;30278:4;;30230:53;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;30230:27:0::1;::::0;-1:-1:-1;;;30230:53:0:i:1;:::-;30220:63;;30333:12;30302:7;30327:1;30310:7;:14;:18;30302:27;;;;;;;;;;;;;;:43;;30294:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30409:4;30403:19;;;30430:7;30438:1;30430:10;;;;;;;;;;;;;;30403:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;30403:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30403:40:0;;;;;30467:4;30461:20;;;30482:48;30504:7;30513:4;;30518:1;30513:7;;;;;;30482:48;30532:7;30540:1;30532:10;;;;;;;;;;;;;;30461:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;30461:82:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30461:82:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;30461:82:0;30454:90:::1;;;;30555:24;30561:7;30570:4;;30555:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;30576:2:0;;-1:-1:-1;30555:5:0::1;::::0;-1:-1:-1;;30555:24:0:i:1;:::-;29898:689:::0;;;;;;;;:::o;29293:599::-;29517:21;29498:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29561:52:::1;29588:7;29597:9;29608:4;;29561:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29561:26:0::1;::::0;-1:-1:-1;;;29561:52:0:i:1;:::-;29551:62;;29646:11;29632:7;29640:1;29632:10;;;;;;;;;;;;;;:25;;29624:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18338:79:::0;18376:7;18403:6;;;18338:79;:::o;19581:37::-;;;;;;:::o;19536:38::-;;;:::o;37040:185::-;37137:12;37169:48;37189:7;37198:8;37208;37169:19;:48::i;:::-;37162:55;37040:185;-1:-1:-1;;;;37040:185:0:o;26254:700::-;26520:14;26501:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26563:196:::1;26593:5;26613:4;26632:9;26656:14;26685:12;26720:4;26740:8;26563:15;:196::i;:::-;26809:38;::::0;;;;;26841:4:::1;26809:38;::::0;::::1;::::0;;;26547:212;;-1:-1:-1;26770:78:0::1;::::0;-1:-1:-1;26798:5:0;;26805:2;;26809:23:::1;::::0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;:23;:38;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;26809:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26809:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;26809:38:0;26770:27:::1;:78::i;:::-;26865:4;26859:20;;;26880:9;26859:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26859:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26859:31:0;;;;26901:45;26932:2;26936:9;26901:30;:45::i;35307:845::-:0;35567:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35612:4:::1;35601:15;;:4;;35606:1;35601:7;;;;;;;;;;;;;;;:15;;;35593:56;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;35660:13;35676:9;35660:25;;35702:4;35696:19;;;35723:8;35696:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35696:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35696:38:0;;;;;35758:4;35752:20;;;35773:48;35795:7;35804:4;;35809:1;35804:7;;;;;;35773:48;35823:8;35752:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35752:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35752:80:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;35752:80:0;35745:88:::1;;;;35844:18;35872:4:::0;;35877:15;;;35872:21;;::::1;;;;;;;;;;;;;35865:39;;;35905:2;35865:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35865:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35865:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;35865:43:0;35919:44:::1;::::0;;35865:43:::1;35919:44:::0;;::::1;::::0;;;;;;;;;;;35865:43;;-1:-1:-1;35919:44:0::1;::::0;;;35954:4;;;;;;35919:44;::::1;::::0;35954:4;;35919:44;35954:4;35919:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;35960:2:0;;-1:-1:-1;35919:34:0::1;::::0;-1:-1:-1;;35919:44:0:i:1;:::-;36062:12:::0;35996:62:::1;36044:13:::0;36003:4;;36008:15;;;36003:21;;::::1;;;;;;;;;;;;;35996:39;;;36036:2;35996:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;23299:851:0::0;23553:12;23567;23534:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23592:12:::1;23607:46;23629:7;23638:6;23646;23607:21;:46::i;:::-;23664:59;::::0;;;;;23695:10:::1;23664:59;::::0;::::1;::::0;:30:::1;::::0;::::1;:59:::0;;;;;;;;;;;;;;23592:61;;-1:-1:-1;23664:30:0;;::::1;::::0;:59;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;23664:30:0;:59;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;23664:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23664:59:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;23791:26:0::1;::::0;;;;;:22:::1;:26:::0;;::::1;;::::0;::::1;::::0;;;23761:12:::1;::::0;;;23791:22;;::::1;::::0;::::1;::::0;:26;;;;;;;;;;;23761:12;23791:22;:26;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;23791:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23791:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;23791:26:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;23791:26:0;-1:-1:-1;23829:14:0::1;23848:40;23873:6:::0;23881;23848:24:::1;:40::i;:::-;23828:60;;;23930:6;23920:16;;:6;:16;;;:58;;23961:7;23970;23920:58;;;23940:7;23949;23920:58;23899:79:::0;;-1:-1:-1;23899:79:0;-1:-1:-1;23997:21:0;;::::1;;23989:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24090:10;24079:7;:21;;24071:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19743:1;;;;23299:851:::0;;;;;;;;;;;:::o;19488:41::-;;;:::o;37812:250::-;37956:21;38002:52;38030:7;38039:8;38049:4;38002:27;:52::i;25512:663::-;25801:16;25819:14;25846:12;25861:43;25883:7;25892:5;25899:4;25861:21;:43::i;:::-;25846:58;;25915:10;25928;:33;;25952:9;25928:33;;;25946:2;25928:33;25972:77;;;;;;25997:10;25972:77;;;;26017:4;25972:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25915:46;;-1:-1:-1;25972:24:0;;;;;;:77;;;;;-1:-1:-1;;25972:77:0;;;;;;;;-1:-1:-1;25972:24:0;:77;;;2:2:-1;;;;27:1;24;17:12;2:2;25972:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25972:77:0;;;;26087:80;26106:5;26113:9;26124:14;26140:12;26154:2;26158:8;26087:18;:80::i;:::-;26060:107;;;;-1:-1:-1;25512:663:0;-1:-1:-1;;;;;;;;;;;;;25512:663:0:o;21550:732::-;21838:12;21852;21866:14;21819:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21914:85:::1;21928:6;21936;21944:14;21960;21976:10;21988;21914:13;:85::i;:::-;21893:106:::0;;-1:-1:-1;21893:106:0;-1:-1:-1;22010:12:0::1;22025:46;22047:7;22056:6:::0;22064;22025:21:::1;:46::i;:::-;22010:61;;22082:66;22114:6;22122:10;22134:4;22140:7;22082:31;:66::i;:::-;22159;22191:6;22199:10;22211:4;22217:7;22159:31;:66::i;:::-;22260:4;22248:22;;;22271:2;22248:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;22248:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22248:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;22248:26:0;21550:732;;;;-1:-1:-1;22248:26:0;;-1:-1:-1;21550:732:0;;-1:-1:-1;;;;;;;;;21550:732:0:o;18922:109::-;19081:19;19089:10;19081:7;:19::i;:::-;19073:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18995:28:::1;19014:8;18995:18;:28::i;:::-;18922:109:::0;:::o;22288:968::-;22541:16;22559:14;22575;22522:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22629:176:::1;22657:5;22677:4;22696:18;22729:9;22753:14;22782:12;22629:13;:176::i;:::-;22602:203:::0;;-1:-1:-1;22602:203:0;-1:-1:-1;22816:12:0::1;22831:43;22853:7;22862:5:::0;22869:4:::1;22831:21;:43::i;:::-;22816:58;;22885:69;22917:5;22924:10;22936:4;22942:11;22885:31;:69::i;:::-;22971:4;22965:19;;;22992:9;22965:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;22965:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22965:39:0;;;;;23028:4;23022:20;;;23043:4;23049:9;23022:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;23022:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23022:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;23022:37:0;23015:45:::1;;;;23095:4;23083:22;;;23106:2;23083:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;23083:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23083:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;23083:26:0;;-1:-1:-1;23160:9:0::1;:21:::0;-1:-1:-1;23156:92:0::1;;;23183:65;23214:10;23238:9;23226;:21;23183:30;:65::i;:::-;19743:1;22288:968:::0;;;;;;;;;;;:::o;32267:802::-;32480:21;32452:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32538:4:::1;32527:15;;:4;;32532:1;32527:7;;;;;;;;;;;;;;;:15;;;32519:56;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32596:52;32623:7;32632:9;32643:4;;32596:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32596:26:0::1;::::0;-1:-1:-1;;;32596:52:0:i:1;:::-;32586:62;;32681:9;32667:7;32675:1;32667:10;;;;;;;;;;;;;;:23;;32659:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32750:4;32744:19;;;32771:7;32779:1;32771:10;;;;;;;;;;;;;;32744:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32744:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32744:40:0;;;;;32808:4;32802:20;;;32823:48;32845:7;32854:4;;32859:1;32854:7;;;;;;32823:48;32873:7;32881:1;32873:10;;;;;;;;;;;;;;32802:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32802:82:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32802:82:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32802:82:0;32795:90:::1;;;;32896:24;32902:7;32911:4;;32896:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32917:2:0;;-1:-1:-1;32896:5:0::1;::::0;-1:-1:-1;;32896:24:0:i:1;:::-;32983:7;32991:1;32983:10;;;;;;;;;;;;;;32971:9;:22;32967:94;;;32995:66;33026:10;33050:7;33058:1;33050:10;;;;;;;;;;;;;;33038:9;:22;32995:30;:66::i;20015:116::-:0;19081:19;19089:10;19081:7;:19::i;:::-;19073:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20093:13:::1;:30:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;20015:116::o;723:449::-;955:45;;;944:10;955:45;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;955:45:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;955:45:0;179:29:-1;160:49;;944:57:0;;;;909:12;;923:17;;944:10;;;;955:45;944:57;;;25:18:-1;944:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;944:57:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;908:93:0;;;;1034:7;:57;;;;-1:-1:-1;1046:11:0;;:16;;:44;;;1077:4;1066:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1066:24:0;1046:44;1012:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;723:449;;;;;:::o;1686:217::-;1799:12;;;1759;1799;;;;;;;;;1777:7;;;;1792:5;;1777:35;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1777:35:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1758:54:0;;;1831:7;1823:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1686:217;;;:::o;13406:551::-;13507:21;13564:1;13549:4;:11;:16;;13541:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13629:4;:11;13618:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13618:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;13618:23:0;;13608:33;;13665:8;13652:7;13660:1;13652:10;;;;;;;;;;;;;:21;;;;;13689:6;13684:266;13715:1;13701:4;:11;:15;13697:1;:19;13684:266;;;13739:14;13755:15;13774:42;13786:7;13795:4;13800:1;13795:7;;;;;;;;;;;;;;13804:4;13809:1;13813;13809:5;13804:11;;;;;;;;;;;;;;13774;:42::i;:::-;13738:78;;;;13848:90;13861:7;13869:1;13861:10;;;;;;;;;;;;;;13873:9;13884:10;13896:41;13907:7;13916:4;13921:1;13916:7;;;;;;;;;;;;;;13925:4;13930:1;13934;13930:5;13925:11;;;;;;;;;;;;;;13896:10;:41::i;:::-;13848:12;:90::i;:::-;13831:7;13839:1;13843;13839:5;13831:14;;;;;;;;;;;;;;;;;:107;-1:-1:-1;;13718:3:0;;13684:266;;;;13406:551;;;;;:::o;10486:478::-;10575:12;10601:14;10617;10635:26;10646:6;10654;10635:10;:26::i;:::-;10799:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;10799:32:0;;;;;10789:43;;;;;;10702:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;10702:251:0;;;;;;;10692:262;;;;;;;;;10486:478;-1:-1:-1;;;;;10486:478:0:o;1180:498::-;1451:51;;;1440:10;1451:51;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1451:51:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;1451:51:0;179:29:-1;160:49;;1440:63:0;;;;1405:12;;1419:17;;1440:10;;;;1451:51;1440:63;;;25:18:-1;1440:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1440:63:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1404:99:0;;;;1536:7;:57;;;;-1:-1:-1;1548:11:0;;:16;;:44;;;1579:4;1568:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1568:24:0;1548:44;1514:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1180:498;;;;;;:::o;27783:877::-;27890:6;27885:768;27916:1;27902:4;:11;:15;27898:1;:19;27885:768;;;27940:13;27955:14;27974:4;27979:1;27974:7;;;;;;;;;;;;;;27983:4;27988:1;27992;27988:5;27983:11;;;;;;;;;;;;;;27939:56;;;;28011:14;28030:39;28055:5;28062:6;28030:24;:39::i;:::-;28010:59;;;28084:14;28101:7;28109:1;28113;28109:5;28101:14;;;;;;;;;;;;;;28084:31;;28131:15;28148;28176:6;28167:15;;:5;:15;;;:61;;28209:9;28225:1;28167:61;;;28191:1;28195:9;28167:61;28247:13;;28130:98;;-1:-1:-1;28130:98:0;-1:-1:-1;28247:27:0;:13;:27;28243:140;;28310:13;;28295:72;;;;;;28330:10;28295:72;;;;28310:13;28295:72;;;;;;;;;;;;;;;;;;;;;;28310:13;;;;;28295:34;;:72;;;;;;;;;;;;;;28310:13;;28295:72;;;2:2:-1;;;;27:1;24;17:12;2:2;28295:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28295:72:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;28243:140:0;28397:10;28428:1;28414:4;:11;:15;28410:1;:19;:79;;28486:3;28410:79;;;28432:51;28454:7;28463:6;28471:4;28476:1;28480;28476:5;28471:11;;;;;;;;;;;;;;28432:21;:51::i;:::-;28397:92;;28516:45;28538:7;28547:5;28554:6;28516:21;:45::i;:::-;28504:63;;;28586:10;28598;28610:2;28624:1;28614:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;28614:12:0;87:42:-1;143:17;;-1:-1;28614:12:0;;28504:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28504:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28504:137:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;27919:3:0;;;;;-1:-1:-1;27885:768:0;;-1:-1:-1;;;;;;;;27885:768:0;;;27783:877;;;:::o;14038:572::-;14139:21;14196:1;14181:4;:11;:16;;14173:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14261:4;:11;14250:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14250:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14250:23:0;;14240:33;;14314:9;14284:7;14309:1;14292:7;:14;:18;14284:27;;;;;;;;;;;;;;;;;:39;14348:11;;:15;;14334:269;14365:5;;14334:269;;14393:14;14409:15;14428:42;14440:7;14449:4;14458:1;14454;:5;14449:11;;;;;;;;;;;;;;14462:4;14467:1;14462:7;;;;;;;14428:42;14392:78;;;;14502:89;14514:7;14522:1;14514:10;;;;;;;;;;;;;;14526:9;14537:10;14549:41;14560:7;14569:4;14578:1;14574;:5;14569:11;;;;;;;;;;;;;;14582:4;14587:1;14582:7;;;;;;;14549:41;14502:11;:89::i;:::-;14485:7;14497:1;14493;:5;14485:14;;;;;;;;;;;;;;;;;:106;-1:-1:-1;;14372:3:0;;14334:269;;12158:545;12265:14;12311:1;12300:8;:12;12292:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12388:1;12376:9;:13;:31;;;;;12406:1;12393:10;:14;12376:31;12368:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12460:20;12483:37;12496:23;12501:4;12511:7;12496:23;:14;:23;:::i;:::-;12483:8;;:37;:12;:37;:::i;:::-;12460:60;-1:-1:-1;12531:14:0;12548:31;12460:60;12568:10;12548:31;:19;:31;:::i;:::-;12531:48;-1:-1:-1;12590:16:0;12609:40;12633:15;12609:19;:9;12623:4;12609:19;:13;:19;:::i;:::-;:23;:40;:23;:40;:::i;:::-;12590:59;;12684:11;12672:9;:23;;;;;;;12158:545;-1:-1:-1;;;;;;;;12158:545:0:o;12824:500::-;12931:13;12977:1;12965:9;:13;12957:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13055:1;13043:9;:13;:31;;;;;13073:1;13060:10;:14;13043:31;13035:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13127:14;13144:34;13173:4;13144:24;:9;13158;13144:24;:13;:24;:::i;:::-;:28;:34;:28;:34;:::i;:::-;13127:51;-1:-1:-1;13189:16:0;13208:54;13238:23;13243:4;13253:7;13238:23;:14;:23;:::i;:::-;13208:25;:10;13223:9;13208:25;:14;:25;:::i;:54::-;13189:73;;13284:32;13314:1;13297:11;13285:9;:23;;;;;;;13284:32;:29;:32;:::i;:::-;13273:43;12824:500;-1:-1:-1;;;;;;;12824:500:0:o;33216:1369::-;33329:6;33324:1254;33355:1;33341:4;:11;:15;33337:1;:19;33324:1254;;;33379:13;33394:14;33413:4;33418:1;33413:7;;;;;;;;;;;;;;33422:4;33427:1;33431;33427:5;33422:11;;;;;;;;;;;;;;33378:56;;;;33450:14;33469:39;33494:5;33501:6;33469:24;:39::i;:::-;33449:59;;;33523:16;33554:45;33576:7;33585:5;33592:6;33554:21;:45::i;:::-;33523:77;;33615:16;33646:17;33734:13;33749;33767:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33767:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33767:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33767:18:0;;;;;;;33733:52;;;;;-1:-1:-1;33733:52:0;;-1:-1:-1;33801:17:0;;33842:15;;;;;;;;:61;;33884:8;33894;33842:61;;;33861:8;33871;33842:61;33800:103;;;;33932:56;33975:12;33939:5;33932:23;;;33964:4;33932:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;33932:56:0;33918:70;;34018:84;34045:11;34058:12;34072:13;34087:4;:12;;;:14;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34087:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34087:14:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34087:14:0;34018:84;;:26;:84::i;:::-;34136:13;;34003:99;;-1:-1:-1;34136:27:0;:13;:27;;-1:-1:-1;34132:143:0;;-1:-1:-1;;;34132:143:0;34199:13;;34184:75;;;;;;34219:10;34184:75;;;;34199:13;34184:75;;;;;;;;;;;;;;;;;;;;;;34199:13;;;;;34184:34;;:75;;;;;;;;;;;;;;34199:13;;34184:75;;;2:2:-1;;;;27:1;24;17:12;2:2;34184:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34184:75:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;34132:143:0;34290:15;34307;34335:6;34326:15;;:5;:15;;;:67;;34371:12;34390:1;34326:67;;;34350:1;34354:12;34326:67;34289:104;;;;34408:10;34439:1;34425:4;:11;:15;34421:1;:19;:79;;34497:3;34421:79;;;34443:51;34465:7;34474:6;34482:4;34487:1;34491;34487:5;34482:11;;;;;;;34443:51;34553:12;;;34563:1;34553:12;;;;;;;;;;34515:51;;;;;;;;;;;;;;;:9;:51;;;;;;;;;;;;;;;;;;;;;;34408:92;;-1:-1:-1;34515:9:0;;;;;;34525:10;;34537;;34408:92;;34553:12;;34515:51;;;;;;;;34553:12;;34515:51;;;;34553:12;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;34515:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34515:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;33358:3:0;;;;;-1:-1:-1;33324:1254:0;;-1:-1:-1;;;;;;;;;;33324:1254:0;9603:129;9687:5;;;9682:16;;;;9674:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11721:315;11803:12;11846:1;11836:7;:11;11828:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11916:1;11905:8;:12;:28;;;;;11932:1;11921:8;:12;11905:28;11897:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12020:8;11996:21;:7;12008:8;11996:21;:11;:21;:::i;:::-;:32;;;;;;;11721:315;-1:-1:-1;;;;11721:315:0:o;10051:343::-;10126:14;10142;10187:6;10177:16;;:6;:16;;;;10169:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10271:6;10262:15;;:6;:15;;;:53;;10300:6;10308;10262:53;;;10281:6;10289;10262:53;10243:72;;-1:-1:-1;10243:72:0;-1:-1:-1;10334:20:0;;;10326:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10051:343;;;;;:::o;20171:1373::-;20484:47;;;;;;:61;:47;;;;;;;;;;;;;;;;20389:12;;;;;;20499:7;20484:31;;;;;;:47;;;;;;;;;;;;;;;:31;:47;;;2:2:-1;;;;27:1;24;17:12;2:2;20484:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20484:47:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20484:47:0;:61;;;20480:144;;;20562:50;;;;;;:34;:50;;;;;;;;;;;;;;;;20577:7;20562:34;;;;;;:50;;;;;;;;;;;;;;;-1:-1:-1;20562:34:0;:50;;;2:2:-1;;;;27:1;24;17:12;2:2;20562:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20562:50:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;20480:144:0;20635:13;20650;20667:50;20693:7;20702:6;20710;20667:25;:50::i;:::-;20634:83;;;;20732:8;20744:1;20732:13;:30;;;;-1:-1:-1;20749:13:0;;20732:30;20728:809;;;20801:14;;-1:-1:-1;20817:14:0;;-1:-1:-1;20728:809:0;;;20865:19;20887:55;20907:14;20923:8;20933;20887:19;:55::i;:::-;20865:77;;20979:14;20961;:32;20957:569;;21040:10;21022:14;:28;;21014:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21133:14;;-1:-1:-1;21149:14:0;-1:-1:-1;21149:14:0;20957:569;;;21205:19;21227:55;21247:14;21263:8;21273;21227:19;:55::i;:::-;21205:77;;21326:14;21308;:32;;21301:40;;;;21386:10;21368:14;:28;;21360:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21479:14;-1:-1:-1;21495:14:0;;-1:-1:-1;20957:569:0;20728:809;;20171:1373;;;;;;;;;;;:::o;18685:229::-;18759:22;;;18751:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18861:6;;;18840:38;;;;;;;18861:6;;;18840:38;;;18889:6;:17;;;;;;;;;;;;;;;18685:229::o;11220:388::-;11313:13;11328;11355:14;11374:26;11385:6;11393;11374:10;:26::i;:::-;11354:46;;;11412:13;11427;11457:32;11465:7;11474:6;11482;11457:7;:32::i;:::-;11445:57;;;:59;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11445:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11445:59:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11445:59:0;;;;;;;11411:93;;;;;-1:-1:-1;11411:93:0;;-1:-1:-1;11538:16:0;;;;;;;;:62;;11581:8;11591;11538:62;;;11558:8;11568;11538:62;11515:85;;;;-1:-1:-1;11220:388:0;-1:-1:-1;;;;;;;11220:388:0:o;10972:190::-;11064:12;11111:32;11119:7;11128:6;11136;11111:7;:32::i;:::-;11099:53;;;:55;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11099:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11099:55:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11099:55:0;11089:65;;;10972:190;-1:-1:-1;;;;10972:190:0:o;9740:142::-;9792:6;9819;;;:30;;-1:-1:-1;;9834:5:0;;;9848:1;9843;9834:5;9843:1;9829:15;;;;;:20;9819:30;9811:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9467:128;9551:5;;;9546:16;;;;9538:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://f423f81b1021c390c07163c4c9533ea8e8210b30f207fd0772f424ce157fa61f
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.