Contract 0xd48745e39bbed146eec15b79cbf964884f9877c2 3

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x71d03fc9257b9793a1decb68651a4e9df820e3829a8dfcfaca4afed94f1c4364Swap Tokens For ...112032972021-09-24 20:39:3013 secs ago0xc24ddc9c78a354f8e5d4b7c45bf6e8b2ee6ac40c IN  Wault Finance: WS Router0 BNB0.001324775
0x7bb38361dfd1c9a497aa6f588633eec0b40e8c70c3bc6b58639de4f046cee65eSwap Exact Token...112032922021-09-24 20:39:1528 secs ago0x7b64254959e3b33f789c7bda7a18d389d1cc2751 IN  Wault Finance: WS Router0 BNB0.001187245
0x4d2eef4faa4ac0e5e7661da38ed6e1963a14a735a1f6d18d9a0faf4268451a1fAdd Liquidity ET...112032642021-09-24 20:37:511 min ago0x3da2c2107bed588896ddbfff966074ee78b68c68 IN  Wault Finance: WS Router0.308086194796808 BNB0.000899435
0xafcd45cdb6213b0e3096965dda9bbc6c442a3803a41bc03633f6f046efd93c43Swap Exact Token...112032572021-09-24 20:37:302 mins ago0x0af672ade909ee225236081a7685232e74d78b72 IN  Wault Finance: WS Router0 BNB0.00178686
0x510411b447510afdcabf105e178ecff1956c3eecd0dbfc511fa71b6427523e1dSwap Exact Token...112032502021-09-24 20:37:092 mins ago0x5bd57849c65411136c6b0847231a365baf483893 IN  Wault Finance: WS Router0 BNB0.001107505
0xcd7dc31c7a55f5471841df3a9e68c954c44d247595a452a04fd46c201e4ec3a7Swap Exact Token...112032422021-09-24 20:36:452 mins ago0xd57666412b935e0c2982a9caa252229f5bf784e5 IN  Wault Finance: WS Router0 BNB0.00133574
0x2c1dd47ed0ea7dbe07e3408b29fda42482dfd712a9c8f00aaf8489a3d06e3dd5Swap Exact Token...112032332021-09-24 20:36:183 mins ago0xd57666412b935e0c2982a9caa252229f5bf784e5 IN  Wault Finance: WS Router0 BNB0.00132375
0x3b1bdf476d7221da199eaf8185ad3cd70f21049a7655de775a8651b3ac86455eSwap Exact Token...112032232021-09-24 20:35:483 mins ago0x0cc0420cbd6492b60e7638ee6630a3c222ea97d0 IN  Wault Finance: WS Router0 BNB0.002874955
0xc97999df65748ce5ab1af379a2542658d26bd57128dee09b87e1b5134b421ca1Swap Exact Token...112032222021-09-24 20:35:453 mins ago0xc8aae42204667cb10f8e8d016920640c1e94a460 IN  Wault Finance: WS Router0 BNB0.00069116
0x30d99d7dd9e76c79ff14b32f38d84062aaf8f13f0e50e40723900a2a08a76ccdSwap Exact Token...112032192021-09-24 20:35:364 mins ago0xd57666412b935e0c2982a9caa252229f5bf784e5 IN  Wault Finance: WS Router0 BNB0.0009417
0xaf3ecd7e95f7a1040185afda6de981f978d8766067f9e1b63a2063caf4393de7Swap Exact ETH F...112032142021-09-24 20:35:214 mins ago0x2f17ef448bf9ad127a7fdf8765f554a7c978702f IN  Wault Finance: WS Router0.999328465 BNB0.000671535
0xa7de9e1600855a56ebcaa2dfcfeb5b5abcc064bb5398fee39a8a5a2551fa3f3cSwap Exact ETH F...112031992021-09-24 20:34:365 mins ago0x2f17ef448bf9ad127a7fdf8765f554a7c978702f IN  Wault Finance: WS Router1.072163794590727 BNB0.000671535
0xf3951bc72d6552f29fa76d6ece0b7806ce184f1c490b16de5db6a9d1d6d9a0fcSwap ETH For Exa...112031962021-09-24 20:34:255 mins ago0xcda3511a26183ca27ae57074df9d715ad6cc7a43 IN  Wault Finance: WS Router0.009169428021677 BNB0.00143528
0xf20d1b30ff74e1489611a6cea00b81210ceb538963287f0b285d421a1e34b195Swap Exact Token...112031912021-09-24 20:34:105 mins ago0xd57666412b935e0c2982a9caa252229f5bf784e5 IN  Wault Finance: WS Router0 BNB0.00137841
0x6dbd8d3bdd9f22e899eefa3da80b58e66e3d633e46ec9159a404299b2c21a5acSwap Exact Token...112031552021-09-24 20:32:217 mins ago0x0af672ade909ee225236081a7685232e74d78b72 IN  Wault Finance: WS Router0 BNB0.001895724
0x62f594c942d769fdb0bb36acf4eb3ec6fa1c68c7f4fa1c9f3f1e77340fb9c364Remove Liquidity...112031422021-09-24 20:31:428 mins ago0x6e0f451e2cc6f44936da2cfda0995383a378c536 IN  Wault Finance: WS Router0 BNB0.00096248
0x9c87e311ed08a85dce201c94ce0cf5ba4f43afb869d91a22c4cc96255fd91f2fSwap Exact Token...112031342021-09-24 20:31:188 mins ago0x64865a04b1401d7db76d23eebb8852657df705c4 IN  Wault Finance: WS Router0 BNB0.000695665
0x135d2a3943eea670894e9f53884c2bcac4eaa3217525640276be2417be73eda7Swap Exact ETH F...112031222021-09-24 20:30:429 mins ago0x53d266ec9eee81270e8cafc2faee9eeb9fb4eff2 IN  Wault Finance: WS Router0.09 BNB0.001085885
0x35b92d546c3ac0a975f1ffbcc3ca834341f513ee554214e244a112e56746989fSwap Exact ETH F...112030952021-09-24 20:29:2110 mins ago0x4b6315adb94e48f0fbaad765887ed17eb56d61ce IN  Wault Finance: WS Router0.161978369507246 BNB0.001010885
0xf04a3641e53fd06bc856f885ee673406706889810fa95eb3561560ff3944257cRemove Liquidity112030922021-09-24 20:29:1210 mins ago0x15cd2535064eff350898ead9a0fc0f87153aefef IN  Wault Finance: WS Router0 BNB0.00092887
0x28828794c09fdf9b5c8fb93c0dcb0ef5d4b2175e90d57f663681fdfeb1fb515cSwap Exact Token...112030612021-09-24 20:27:3912 mins ago0x0b3804716a80539306cf5f9b4d1442f8f8b8ab92 IN  Wault Finance: WS Router0 BNB0.001111085
0x544e463e700891a5acf61fd37b58c100701ce78d10b161fe7ab144e7d93ee05fSwap Exact Token...112030602021-09-24 20:27:3612 mins ago0x15cd2535064eff350898ead9a0fc0f87153aefef IN  Wault Finance: WS Router0 BNB0.000672315
0x843a0d49f55515e66853190c78ff36456d033d9ca9c95548cd8f8ec4d78098ebSwap Exact Token...112030552021-09-24 20:27:2112 mins ago0x0af672ade909ee225236081a7685232e74d78b72 IN  Wault Finance: WS Router0 BNB0.001895724
0x391752d7960b49a0d32f05fab61dc29040bd18614c32c17e5d06e0aa2f9ccccaSwap Exact Token...112030432021-09-24 20:26:4512 mins ago0xb4c0efd04a7b2cc68033db46b440d9c82f925735 IN  Wault Finance: WS Router0 BNB0.001484815
0xe262621fd5a149d1102914329dc3911410641a9b1929cabc0b1809abcac2bd73Swap Exact Token...112030242021-09-24 20:25:4813 mins ago0x0af672ade909ee225236081a7685232e74d78b72 IN  Wault Finance: WS Router0 BNB0.001266489
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x2ecbbafb684fdaa4c32161180e8aceecb4c742e8dafc8df286259194b0815f14112032652021-09-24 20:37:541 min ago Wault Finance: WS Router 0xee6db2cc1ed15424a00e62ccdfe23397b54aab890.023486896188037776 BNB
0x2ecbbafb684fdaa4c32161180e8aceecb4c742e8dafc8df286259194b0815f14112032652021-09-24 20:37:541 min ago Binance: WBNB Token Wault Finance: WS Router0.023486896188037776 BNB
0x4d2eef4faa4ac0e5e7661da38ed6e1963a14a735a1f6d18d9a0faf4268451a1f112032642021-09-24 20:37:511 min ago Wault Finance: WS Router Binance: WBNB Token0.30808619479680876 BNB
0xcd7dc31c7a55f5471841df3a9e68c954c44d247595a452a04fd46c201e4ec3a7112032422021-09-24 20:36:452 mins ago Wault Finance: WS Router0xd57666412b935e0c2982a9caa252229f5bf784e51.928634703836505712 BNB
0xcd7dc31c7a55f5471841df3a9e68c954c44d247595a452a04fd46c201e4ec3a7112032422021-09-24 20:36:452 mins ago Binance: WBNB Token Wault Finance: WS Router1.928634703836505712 BNB
0xc97999df65748ce5ab1af379a2542658d26bd57128dee09b87e1b5134b421ca1112032222021-09-24 20:35:453 mins ago Wault Finance: WS Router0xc8aae42204667cb10f8e8d016920640c1e94a4600.056460496935281175 BNB
0xc97999df65748ce5ab1af379a2542658d26bd57128dee09b87e1b5134b421ca1112032222021-09-24 20:35:453 mins ago Binance: WBNB Token Wault Finance: WS Router0.056460496935281175 BNB
0xaf3ecd7e95f7a1040185afda6de981f978d8766067f9e1b63a2063caf4393de7112032142021-09-24 20:35:214 mins ago Wault Finance: WS Router Binance: WBNB Token0.999328465 BNB
0xa7de9e1600855a56ebcaa2dfcfeb5b5abcc064bb5398fee39a8a5a2551fa3f3c112031992021-09-24 20:34:365 mins ago Wault Finance: WS Router Binance: WBNB Token1.072163794590727032 BNB
0xf3951bc72d6552f29fa76d6ece0b7806ce184f1c490b16de5db6a9d1d6d9a0fc112031962021-09-24 20:34:255 mins ago Wault Finance: WS Router0xcda3511a26183ca27ae57074df9d715ad6cc7a430.000047068621251609 BNB
0xf3951bc72d6552f29fa76d6ece0b7806ce184f1c490b16de5db6a9d1d6d9a0fc112031962021-09-24 20:34:255 mins ago Wault Finance: WS Router Binance: WBNB Token0.009122359400425436 BNB
0x9c87e311ed08a85dce201c94ce0cf5ba4f43afb869d91a22c4cc96255fd91f2f112031342021-09-24 20:31:188 mins ago Wault Finance: WS Router0x64865a04b1401d7db76d23eebb8852657df705c40.134296589984902806 BNB
0x9c87e311ed08a85dce201c94ce0cf5ba4f43afb869d91a22c4cc96255fd91f2f112031342021-09-24 20:31:188 mins ago Binance: WBNB Token Wault Finance: WS Router0.134296589984902806 BNB
0x135d2a3943eea670894e9f53884c2bcac4eaa3217525640276be2417be73eda7112031222021-09-24 20:30:429 mins ago Wault Finance: WS Router Binance: WBNB Token0.09 BNB
0x35b92d546c3ac0a975f1ffbcc3ca834341f513ee554214e244a112e56746989f112030952021-09-24 20:29:2110 mins ago Wault Finance: WS Router Binance: WBNB Token0.161978369507246496 BNB
0x28828794c09fdf9b5c8fb93c0dcb0ef5d4b2175e90d57f663681fdfeb1fb515c112030612021-09-24 20:27:3912 mins ago Wault Finance: WS Router0x0b3804716a80539306cf5f9b4d1442f8f8b8ab920.005765596677928216 BNB
0x28828794c09fdf9b5c8fb93c0dcb0ef5d4b2175e90d57f663681fdfeb1fb515c112030612021-09-24 20:27:3912 mins ago Binance: WBNB Token Wault Finance: WS Router0.005765596677928216 BNB
0x544e463e700891a5acf61fd37b58c100701ce78d10b161fe7ab144e7d93ee05f112030602021-09-24 20:27:3612 mins ago Wault Finance: WS Router0x15cd2535064eff350898ead9a0fc0f87153aefef0.052839278383972587 BNB
0x544e463e700891a5acf61fd37b58c100701ce78d10b161fe7ab144e7d93ee05f112030602021-09-24 20:27:3612 mins ago Binance: WBNB Token Wault Finance: WS Router0.052839278383972587 BNB
0xd7b72ca6b9c8aa8c5b2c4a76bf741ae259b92516a6d4353607a0704190a7b818112029942021-09-24 20:24:1815 mins ago Wault Finance: WS Router0x6aea833ead69873e0685d6f733fb1ea766da8ca50.00852365148043331 BNB
0xd7b72ca6b9c8aa8c5b2c4a76bf741ae259b92516a6d4353607a0704190a7b818112029942021-09-24 20:24:1815 mins ago Binance: WBNB Token Wault Finance: WS Router0.00852365148043331 BNB
0x3f457b3718e0c9757c45492cea706429a0b3312bcd3d4b9313d334a419b54876112027322021-09-24 20:11:1228 mins ago Wault Finance: WS Router Binance: WBNB Token0.015125 BNB
0x3f457b3718e0c9757c45492cea706429a0b3312bcd3d4b9313d334a419b54876112027322021-09-24 20:11:1228 mins ago 0xee6db2cc1ed15424a00e62ccdfe23397b54aab89 Wault Finance: WS Router0.015125 BNB
0xba13d09ae868961f2915202e4ac3557aeac1804b82fcaae3a857509e03f500f6112027042021-09-24 20:09:4829 mins ago Wault Finance: WS Router Binance: WBNB Token0.0015 BNB
0xf4a9da2b31782ac219cb372bfdc96b6f0a4bd3b7ae0af603903aa4ed8205bf05112026322021-09-24 20:06:1233 mins ago Wault Finance: WS Router Binance: WBNB Token1 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WaultSwapRouter

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 500 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIТ

pragma solidity =0.6.6;


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

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

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

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

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

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

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

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

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

interface IWaultSwapRouter01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

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

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

interface IWaultSwapRouter02 is IWaultSwapRouter01 {
    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 IWaultSwapPair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

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

    function initialize(address, address) external;
}

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
library SafeMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

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

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

library WaultSwapLibrary {
    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, 'WaultSwapLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'WaultSwapLibrary: 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'9599db1eaa37ab366bf260f51beefce9296eb6197de387c533d905e9b82debe9' // init code hash
            ))));
    }

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

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

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'WaultSwapLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'WaultSwapLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(1000);
        uint denominator = reserveOut.sub(amountOut).mul(998);
        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, 'WaultSwapLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[0] = amountIn;
        for (uint i; i < path.length - 1; i++) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]);
            amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
        }
    }

    // performs chained getAmountIn calculations on any number of pairs
    function getAmountsIn(address factory, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'WaultSwapLibrary: 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);
        }
    }
}

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

contract WaultSwapRouter is IWaultSwapRouter02 {
    using SafeMath for uint;

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

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

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

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

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (IWaultSwapFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IWaultSwapFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = WaultSwapLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = WaultSwapLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'WaultSwapRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = WaultSwapLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'WaultSwapRouter: 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 = WaultSwapLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IWaultSwapPair(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 = WaultSwapLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IWaultSwapPair(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 = WaultSwapLibrary.pairFor(factory, tokenA, tokenB);
        IWaultSwapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IWaultSwapPair(pair).burn(to);
        (address token0,) = WaultSwapLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'WaultSwapRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'WaultSwapRouter: 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 = WaultSwapLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IWaultSwapPair(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 = WaultSwapLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IWaultSwapPair(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 = WaultSwapLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IWaultSwapPair(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,) = WaultSwapLibrary.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? WaultSwapLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IWaultSwapPair(WaultSwapLibrary.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 = WaultSwapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'WaultSwapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, WaultSwapLibrary.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 = WaultSwapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'WaultSwapRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, WaultSwapLibrary.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, 'WaultSwapRouter: INVALID_PATH');
        amounts = WaultSwapLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'WaultSwapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(WaultSwapLibrary.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, 'WaultSwapRouter: INVALID_PATH');
        amounts = WaultSwapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'WaultSwapRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, WaultSwapLibrary.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, 'WaultSwapRouter: INVALID_PATH');
        amounts = WaultSwapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'WaultSwapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, WaultSwapLibrary.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, 'WaultSwapRouter: INVALID_PATH');
        amounts = WaultSwapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'WaultSwapRouter: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(WaultSwapLibrary.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,) = WaultSwapLibrary.sortTokens(input, output);
            IWaultSwapPair pair = IWaultSwapPair(WaultSwapLibrary.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 = WaultSwapLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? WaultSwapLibrary.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, WaultSwapLibrary.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,
            'WaultSwapRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'WaultSwapRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(WaultSwapLibrary.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,
            'WaultSwapRouter: 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, 'WaultSwapRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, WaultSwapLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'WaultSwapRouter: 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 WaultSwapLibrary.quote(amountA, reserveA, reserveB);
    }

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

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

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

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

Contract Security Audit

Contract ABI

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

60c060405234801561001057600080fd5b5060405162004840380380620048408339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6146bb620001856000398061019f5280610d245280610d5f5280610e56528061108652806114105280611588528061194f5280611a5b5280611b115280611bdf5280611d375280611dbf5280612004528061207f528061212e52806121fa52806122a1528061231552806128135280612a865280612adc5280612b105280612b845280612d245280612e795280612f01525080610ef65280610fcd528061114c528061118552806112c052806114b0528061156652806116d65280611c845280611df15280611f54528061234752806125a0528061279852806127c152806127f1528061295e5280612aba5280612dc95280612f3352806137f252806138355280613b185280613c9e52806140d65280614184528061420452506146bb6000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610b8d578063f305d71914610c0d578063fb3bdb4114610c53576101c8565b8063c45a015514610a50578063d06ca61f14610a65578063ded9382a14610b1a576101c8565b8063af2979eb116100b0578063af2979eb1461091c578063b6f9de951461096f578063baa2abde146109f3576101c8565b80638803dbee1461081f578063ad5c4648146108b5578063ad615dec146108e6576101c8565b80634a25d94a11610138578063791ac94711610112578063791ac947146106cf5780637ff36ab51461076557806385f8c259146107e9576101c8565b80634a25d94a146105305780635b0d5984146105c65780635c11d79514610639576101c8565b80631f00ca74116101695780631f00ca74146103675780632195995c1461041c57806338ed17391461049a576101c8565b806302751cec146101cd578063054d50d41461023957806318cbafe514610281576101c8565b366101c857336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101c657fe5b005b600080fd5b3480156101d957600080fd5b50610220600480360360c08110156101f057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610cd7565b6040805192835260208301919091528051918290030190f35b34801561024557600080fd5b5061026f6004803603606081101561025c57600080fd5b5080359060208101359060400135610df1565b60408051918252519081900360200190f35b34801561028d57600080fd5b50610317600480360360a08110156102a457600080fd5b813591602081013591810190606081016040820135600160201b8111156102ca57600080fd5b8201836020820111156102dc57600080fd5b803590602001918460208302840111600160201b831117156102fd57600080fd5b91935091506001600160a01b038135169060200135610e06565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561035357818101518382015260200161033b565b505050509050019250505060405180910390f35b34801561037357600080fd5b506103176004803603604081101561038a57600080fd5b81359190810190604081016020820135600160201b8111156103ab57600080fd5b8201836020820111156103bd57600080fd5b803590602001918460208302840111600160201b831117156103de57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611145945050505050565b34801561042857600080fd5b50610220600480360361016081101561044057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561117b565b3480156104a657600080fd5b50610317600480360360a08110156104bd57600080fd5b813591602081013591810190606081016040820135600160201b8111156104e357600080fd5b8201836020820111156104f557600080fd5b803590602001918460208302840111600160201b8311171561051657600080fd5b91935091506001600160a01b038135169060200135611275565b34801561053c57600080fd5b50610317600480360360a081101561055357600080fd5b813591602081013591810190606081016040820135600160201b81111561057957600080fd5b82018360208201111561058b57600080fd5b803590602001918460208302840111600160201b831117156105ac57600080fd5b91935091506001600160a01b0381351690602001356113c0565b3480156105d257600080fd5b5061026f60048036036101408110156105ea57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561155e565b34801561064557600080fd5b506101c6600480360360a081101561065c57600080fd5b813591602081013591810190606081016040820135600160201b81111561068257600080fd5b82018360208201111561069457600080fd5b803590602001918460208302840111600160201b831117156106b557600080fd5b91935091506001600160a01b03813516906020013561166c565b3480156106db57600080fd5b506101c6600480360360a08110156106f257600080fd5b813591602081013591810190606081016040820135600160201b81111561071857600080fd5b82018360208201111561072a57600080fd5b803590602001918460208302840111600160201b8311171561074b57600080fd5b91935091506001600160a01b038135169060200135611901565b6103176004803603608081101561077b57600080fd5b81359190810190604081016020820135600160201b81111561079c57600080fd5b8201836020820111156107ae57600080fd5b803590602001918460208302840111600160201b831117156107cf57600080fd5b91935091506001600160a01b038135169060200135611b97565b3480156107f557600080fd5b5061026f6004803603606081101561080c57600080fd5b5080359060208101359060400135611efc565b34801561082b57600080fd5b50610317600480360360a081101561084257600080fd5b813591602081013591810190606081016040820135600160201b81111561086857600080fd5b82018360208201111561087a57600080fd5b803590602001918460208302840111600160201b8311171561089b57600080fd5b91935091506001600160a01b038135169060200135611f09565b3480156108c157600080fd5b506108ca612002565b604080516001600160a01b039092168252519081900360200190f35b3480156108f257600080fd5b5061026f6004803603606081101561090957600080fd5b5080359060208101359060400135612026565b34801561092857600080fd5b5061026f600480360360c081101561093f57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612033565b6101c66004803603608081101561098557600080fd5b81359190810190604081016020820135600160201b8111156109a657600080fd5b8201836020820111156109b857600080fd5b803590602001918460208302840111600160201b831117156109d957600080fd5b91935091506001600160a01b0381351690602001356121b4565b3480156109ff57600080fd5b50610220600480360360e0811015610a1657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612552565b348015610a5c57600080fd5b506108ca612796565b348015610a7157600080fd5b5061031760048036036040811015610a8857600080fd5b81359190810190604081016020820135600160201b811115610aa957600080fd5b820183602082011115610abb57600080fd5b803590602001918460208302840111600160201b83111715610adc57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506127ba945050505050565b348015610b2657600080fd5b506102206004803603610140811015610b3e57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356127e7565b348015610b9957600080fd5b50610bef6004803603610100811015610bb157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e001356128fb565b60408051938452602084019290925282820152519081900360600190f35b610bef600480360360c0811015610c2357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612a37565b61031760048036036080811015610c6957600080fd5b81359190810190604081016020820135600160201b811115610c8a57600080fd5b820183602082011115610c9c57600080fd5b803590602001918460208302840111600160201b83111715610cbd57600080fd5b91935091506001600160a01b038135169060200135612cdc565b6000808242811015610d1e576040805162461bcd60e51b81526020600482015260186024820152600080516020614505833981519152604482015290519081900360640190fd5b610d4d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612552565b9093509150610d5d898685613070565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610dc357600080fd5b505af1158015610dd7573d6000803e3d6000fd5b50505050610de585836131da565b50965096945050505050565b6000610dfe8484846132d2565b949350505050565b60608142811015610e4c576040805162461bcd60e51b81526020600482015260186024820152600080516020614505833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e8657fe5b905060200201356001600160a01b03166001600160a01b031614610ef1576040805162461bcd60e51b815260206004820152601d60248201527f5761756c7453776170526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b610f4f7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133c292505050565b91508682600184510381518110610f6257fe5b60200260200101511015610fa75760405162461bcd60e51b815260040180806020018281038252602b81526020018061460f602b913960400191505060405180910390fd5b61104586866000818110610fb757fe5b905060200201356001600160a01b03163361102b7f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610ff957fe5b905060200201356001600160a01b03168b8b600181811061101657fe5b905060200201356001600160a01b031661350e565b8560008151811061103857fe5b60200260200101516135e6565b61108482878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613743915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836001855103815181106110c357fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561110157600080fd5b505af1158015611115573d6000803e3d6000fd5b5050505061113a848360018551038151811061112d57fe5b60200260200101516131da565b509695505050505050565b60606111727f00000000000000000000000000000000000000000000000000000000000000008484613989565b90505b92915050565b60008060006111ab7f00000000000000000000000000000000000000000000000000000000000000008f8f61350e565b90506000876111ba578c6111be565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561123457600080fd5b505af1158015611248573d6000803e3d6000fd5b5050505061125b8f8f8f8f8f8f8f612552565b809450819550505050509b509b9950505050505050505050565b606081428110156112bb576040805162461bcd60e51b81526020600482015260186024820152600080516020614505833981519152604482015290519081900360640190fd5b6113197f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133c292505050565b9150868260018451038151811061132c57fe5b602002602001015110156113715760405162461bcd60e51b815260040180806020018281038252602b81526020018061460f602b913960400191505060405180910390fd5b61138186866000818110610fb757fe5b61113a82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613743915050565b60608142811015611406576040805162461bcd60e51b81526020600482015260186024820152600080516020614505833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061144057fe5b905060200201356001600160a01b03166001600160a01b0316146114ab576040805162461bcd60e51b815260206004820152601d60248201527f5761756c7453776170526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b6115097f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061398992505050565b9150868260008151811061151957fe5b60200260200101511115610fa75760405162461bcd60e51b81526004018080602001828103825260278152602001806144b86027913960400191505060405180910390fd5b6000806115ac7f00000000000000000000000000000000000000000000000000000000000000008d7f000000000000000000000000000000000000000000000000000000000000000061350e565b90506000866115bb578b6115bf565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561163557600080fd5b505af1158015611649573d6000803e3d6000fd5b5050505061165b8d8d8d8d8d8d612033565b9d9c50505050505050505050505050565b80428110156116b0576040805162461bcd60e51b81526020600482015260186024820152600080516020614505833981519152604482015290519081900360640190fd5b611725858560008181106116c057fe5b905060200201356001600160a01b03163361171f7f00000000000000000000000000000000000000000000000000000000000000008989600081811061170257fe5b905060200201356001600160a01b03168a8a600181811061101657fe5b8a6135e6565b60008585600019810181811061173757fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561179c57600080fd5b505afa1580156117b0573d6000803e3d6000fd5b505050506040513d60208110156117c657600080fd5b50516040805160208881028281018201909352888252929350611808929091899189918291850190849080828437600092019190915250889250613ac1915050565b866118ba828888600019810181811061181d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561188257600080fd5b505afa158015611896573d6000803e3d6000fd5b505050506040513d60208110156118ac57600080fd5b50519063ffffffff613dd316565b10156118f75760405162461bcd60e51b815260040180806020018281038252602b81526020018061460f602b913960400191505060405180910390fd5b5050505050505050565b8042811015611945576040805162461bcd60e51b81526020600482015260186024820152600080516020614505833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061197f57fe5b905060200201356001600160a01b03166001600160a01b0316146119ea576040805162461bcd60e51b815260206004820152601d60248201527f5761756c7453776170526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b6119fa858560008181106116c057fe5b611a38858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613ac1915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611aa257600080fd5b505afa158015611ab6573d6000803e3d6000fd5b505050506040513d6020811015611acc57600080fd5b5051905086811015611b0f5760405162461bcd60e51b815260040180806020018281038252602b81526020018061460f602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611b7557600080fd5b505af1158015611b89573d6000803e3d6000fd5b505050506118f784826131da565b60608142811015611bdd576040805162461bcd60e51b81526020600482015260186024820152600080516020614505833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611c1457fe5b905060200201356001600160a01b03166001600160a01b031614611c7f576040805162461bcd60e51b815260206004820152601d60248201527f5761756c7453776170526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b611cdd7f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133c292505050565b91508682600184510381518110611cf057fe5b60200260200101511015611d355760405162461bcd60e51b815260040180806020018281038252602b81526020018061460f602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611d7157fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611da457600080fd5b505af1158015611db8573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611e1d7f00000000000000000000000000000000000000000000000000000000000000008989600081811061170257fe5b84600081518110611e2a57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611e8157600080fd5b505af1158015611e95573d6000803e3d6000fd5b505050506040513d6020811015611eab57600080fd5b5051611eb357fe5b611ef282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613743915050565b5095945050505050565b6000610dfe848484613e2b565b60608142811015611f4f576040805162461bcd60e51b81526020600482015260186024820152600080516020614505833981519152604482015290519081900360640190fd5b611fad7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061398992505050565b91508682600081518110611fbd57fe5b602002602001015111156113715760405162461bcd60e51b81526004018080602001828103825260278152602001806144b86027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dfe848484613f1b565b60008142811015612079576040805162461bcd60e51b81526020600482015260186024820152600080516020614505833981519152604482015290519081900360640190fd5b6120a8887f00000000000000000000000000000000000000000000000000000000000000008989893089612552565b604080516370a0823160e01b8152306004820152905191945061212c92508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156120fb57600080fd5b505afa15801561210f573d6000803e3d6000fd5b505050506040513d602081101561212557600080fd5b5051613070565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561219257600080fd5b505af11580156121a6573d6000803e3d6000fd5b5050505061113a84836131da565b80428110156121f8576040805162461bcd60e51b81526020600482015260186024820152600080516020614505833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061222f57fe5b905060200201356001600160a01b03166001600160a01b03161461229a576040805162461bcd60e51b815260206004820152601d60248201527f5761756c7453776170526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122fa57600080fd5b505af115801561230e573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6123737f00000000000000000000000000000000000000000000000000000000000000008989600081811061170257fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156123c357600080fd5b505af11580156123d7573d6000803e3d6000fd5b505050506040513d60208110156123ed57600080fd5b50516123f557fe5b60008686600019810181811061240757fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561246c57600080fd5b505afa158015612480573d6000803e3d6000fd5b505050506040513d602081101561249657600080fd5b505160408051602089810282810182019093528982529293506124d89290918a918a918291850190849080828437600092019190915250899250613ac1915050565b876118ba82898960001981018181106124ed57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561188257600080fd5b6000808242811015612599576040805162461bcd60e51b81526020600482015260186024820152600080516020614505833981519152604482015290519081900360640190fd5b60006125c67f00000000000000000000000000000000000000000000000000000000000000008c8c61350e565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561262157600080fd5b505af1158015612635573d6000803e3d6000fd5b505050506040513d602081101561264b57600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561269857600080fd5b505af11580156126ac573d6000803e3d6000fd5b505050506040513d60408110156126c257600080fd5b508051602090910151909250905060006126dc8e8e613fc7565b509050806001600160a01b03168e6001600160a01b0316146126ff578183612702565b82825b90975095508a8710156127465760405162461bcd60e51b815260040180806020018281038252602681526020018061459a6026913960400191505060405180910390fd5b898610156127855760405162461bcd60e51b81526004018080602001828103825260268152602001806144df6026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111727f000000000000000000000000000000000000000000000000000000000000000084846133c2565b60008060006128377f00000000000000000000000000000000000000000000000000000000000000008e7f000000000000000000000000000000000000000000000000000000000000000061350e565b9050600087612846578c61284a565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156128c057600080fd5b505af11580156128d4573d6000803e3d6000fd5b505050506128e68e8e8e8e8e8e610cd7565b909f909e509c50505050505050505050505050565b60008060008342811015612944576040805162461bcd60e51b81526020600482015260186024820152600080516020614505833981519152604482015290519081900360640190fd5b6129528c8c8c8c8c8c6140a5565b909450925060006129847f00000000000000000000000000000000000000000000000000000000000000008e8e61350e565b90506129928d3383886135e6565b61299e8c3383876135e6565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156129f657600080fd5b505af1158015612a0a573d6000803e3d6000fd5b505050506040513d6020811015612a2057600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015612a80576040805162461bcd60e51b81526020600482015260186024820152600080516020614505833981519152604482015290519081900360640190fd5b612aae8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c6140a5565b90945092506000612b007f00000000000000000000000000000000000000000000000000000000000000008c7f000000000000000000000000000000000000000000000000000000000000000061350e565b9050612b0e8b3383886135e6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612b6957600080fd5b505af1158015612b7d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612c0257600080fd5b505af1158015612c16573d6000803e3d6000fd5b505050506040513d6020811015612c2c57600080fd5b5051612c3457fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612c8c57600080fd5b505af1158015612ca0573d6000803e3d6000fd5b505050506040513d6020811015612cb657600080fd5b5051925034841015612cce57612cce338534036131da565b505096509650969350505050565b60608142811015612d22576040805162461bcd60e51b81526020600482015260186024820152600080516020614505833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612d5957fe5b905060200201356001600160a01b03166001600160a01b031614612dc4576040805162461bcd60e51b815260206004820152601d60248201527f5761756c7453776170526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b612e227f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061398992505050565b91503482600081518110612e3257fe5b60200260200101511115612e775760405162461bcd60e51b81526004018080602001828103825260278152602001806144b86027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612eb357fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612ee657600080fd5b505af1158015612efa573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612f5f7f00000000000000000000000000000000000000000000000000000000000000008989600081811061170257fe5b84600081518110612f6c57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612fc357600080fd5b505af1158015612fd7573d6000803e3d6000fd5b505050506040513d6020811015612fed57600080fd5b5051612ff557fe5b61303482878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613743915050565b8160008151811061304157fe5b6020026020010151341115611ef257611ef2338360008151811061306157fe5b602002602001015134036131da565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106130ed5780518252601f1990920191602091820191016130ce565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461314f576040519150601f19603f3d011682016040523d82523d6000602084013e613154565b606091505b5091509150818015613182575080511580613182575080806020019051602081101561317f57600080fd5b50515b6131d3576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106132265780518252601f199092019160209182019101613207565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613288576040519150601f19603f3d011682016040523d82523d6000602084013e61328d565b606091505b50509050806132cd5760405162461bcd60e51b81526004018080602001828103825260238152602001806145ec6023913960400191505060405180910390fd5b505050565b60008084116133125760405162461bcd60e51b815260040180806020018281038252602b81526020018061456f602b913960400191505060405180910390fd5b6000831180156133225750600082115b61335d5760405162461bcd60e51b815260040180806020018281038252602881526020018061465e6028913960400191505060405180910390fd5b6000613371856103e663ffffffff61431916565b90506000613385828563ffffffff61431916565b905060006133ab8361339f886103e863ffffffff61431916565b9063ffffffff61438516565b90508082816133b657fe5b04979650505050505050565b606060028251101561341b576040805162461bcd60e51b815260206004820152601e60248201527f5761756c74537761704c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561343357600080fd5b5060405190808252806020026020018201604052801561345d578160200160208202803683370190505b509050828160008151811061346e57fe5b60200260200101818152505060005b6001835103811015613506576000806134c08786858151811061349c57fe5b60200260200101518786600101815181106134b357fe5b60200260200101516143dd565b915091506134e28484815181106134d357fe5b602002602001015183836132d2565b8484600101815181106134f157fe5b6020908102919091010152505060010161347d565b509392505050565b600080600061351d8585613fc7565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f9599db1eaa37ab366bf260f51beefce9296eb6197de387c533d905e9b82debe9609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b6020831061366b5780518252601f19909201916020918201910161364c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146136cd576040519150601f19603f3d011682016040523d82523d6000602084013e6136d2565b606091505b509150915081801561370057508051158061370057508080602001905160208110156136fd57600080fd5b50515b61373b5760405162461bcd60e51b815260040180806020018281038252602481526020018061463a6024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156139835760008084838151811061376157fe5b602002602001015185846001018151811061377857fe5b60200260200101519150915060006137908383613fc7565b50905060008785600101815181106137a457fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146137d2578260006137d6565b6000835b91509150600060028a510388106137ed578861382e565b61382e7f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061382157fe5b602002602001015161350e565b905061385b7f0000000000000000000000000000000000000000000000000000000000000000888861350e565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613898576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156139095781810151838201526020016138f1565b50505050905090810190601f1680156139365780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561395857600080fd5b505af115801561396c573d6000803e3d6000fd5b505060019099019850613746975050505050505050565b50505050565b60606002825110156139e2576040805162461bcd60e51b815260206004820152601e60248201527f5761756c74537761704c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff811180156139fa57600080fd5b50604051908082528060200260200182016040528015613a24578160200160208202803683370190505b5090508281600183510381518110613a3857fe5b60209081029190910101528151600019015b801561350657600080613a7a87866001860381518110613a6657fe5b60200260200101518786815181106134b357fe5b91509150613a9c848481518110613a8d57fe5b60200260200101518383613e2b565b846001850381518110613aab57fe5b6020908102919091010152505060001901613a4a565b60005b60018351038110156132cd57600080848381518110613adf57fe5b6020026020010151858460010181518110613af657fe5b6020026020010151915091506000613b0e8383613fc7565b5090506000613b3e7f0000000000000000000000000000000000000000000000000000000000000000858561350e565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613b7f57600080fd5b505afa158015613b93573d6000803e3d6000fd5b505050506040513d6060811015613ba957600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506000806001600160a01b038a811690891614613be6578284613be9565b83835b91509150613c47828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561188257600080fd5b9550613c548683836132d2565b945050505050600080856001600160a01b0316886001600160a01b031614613c7e57826000613c82565b6000835b91509150600060028c51038a10613c99578a613ccd565b613ccd7f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061382157fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613d57578181015183820152602001613d3f565b50505050905090810190601f168015613d845780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613da657600080fd5b505af1158015613dba573d6000803e3d6000fd5b50506001909b019a50613ac49950505050505050505050565b80820382811115611175576040805162461bcd60e51b815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411613e6b5760405162461bcd60e51b815260040180806020018281038252602c8152602001806145c0602c913960400191505060405180910390fd5b600083118015613e7b5750600082115b613eb65760405162461bcd60e51b815260040180806020018281038252602881526020018061465e6028913960400191505060405180910390fd5b6000613eda6103e8613ece868863ffffffff61431916565b9063ffffffff61431916565b90506000613ef46103e6613ece868963ffffffff613dd316565b9050613f116001828481613f0457fe5b049063ffffffff61438516565b9695505050505050565b6000808411613f5b5760405162461bcd60e51b81526004018080602001828103825260258152602001806145256025913960400191505060405180910390fd5b600083118015613f6b5750600082115b613fa65760405162461bcd60e51b815260040180806020018281038252602881526020018061465e6028913960400191505060405180910390fd5b82613fb7858463ffffffff61431916565b81613fbe57fe5b04949350505050565b600080826001600160a01b0316846001600160a01b0316141561401b5760405162461bcd60e51b815260040180806020018281038252602581526020018061454a6025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b03161061403b57828461403e565b83835b90925090506001600160a01b03821661409e576040805162461bcd60e51b815260206004820152601e60248201527f5761756c74537761704c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b15801561411f57600080fd5b505afa158015614133573d6000803e3d6000fd5b505050506040513d602081101561414957600080fd5b50516001600160a01b031614156141fc57604080516364e329cb60e11b81526001600160a01b038a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b1580156141cf57600080fd5b505af11580156141e3573d6000803e3d6000fd5b505050506040513d60208110156141f957600080fd5b50505b60008061422a7f00000000000000000000000000000000000000000000000000000000000000008b8b6143dd565b9150915081600014801561423c575080155b1561424c5787935086925061430c565b6000614259898484613f1b565b90508781116142ac57858110156142a15760405162461bcd60e51b81526004018080602001828103825260268152602001806144df6026913960400191505060405180910390fd5b88945092508261430a565b60006142b9898486613f1b565b9050898111156142c557fe5b878110156143045760405162461bcd60e51b815260040180806020018281038252602681526020018061459a6026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806143345750508082028282828161433157fe5b04145b611175576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b80820182811015611175576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60008060006143ec8585613fc7565b5090506143fa86868661350e565b5060008061440988888861350e565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561444157600080fd5b505afa158015614455573d6000803e3d6000fd5b505050506040513d606081101561446b57600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506001600160a01b03878116908416146144a55780826144a8565b81815b9099909850965050505050505056fe5761756c7453776170526f757465723a204558434553534956455f494e5055545f414d4f554e545761756c7453776170526f757465723a20494e53554646494349454e545f425f414d4f554e545761756c7453776170526f757465723a204558504952454400000000000000005761756c74537761704c6962726172793a20494e53554646494349454e545f414d4f554e545761756c74537761704c6962726172793a204944454e544943414c5f4144445245535345535761756c74537761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e545761756c7453776170526f757465723a20494e53554646494349454e545f415f414d4f554e545761756c74537761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445761756c7453776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c45445761756c74537761704c6962726172793a20494e53554646494349454e545f4c4951554944495459a26469706673582212209304ffc9652123dd39f4abecd710ad12987bd27ee5902aaa18bfa1efd3f16a0764736f6c63430006060033000000000000000000000000b42e3fe71b7e0673335b3331b3e1053bd9822570000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

000000000000000000000000b42e3fe71b7e0673335b3331b3e1053bd9822570000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

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


Deployed ByteCode Sourcemap

15515:18547:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15995:10;-1:-1:-1;;;;;16009:4:0;15995:18;;15988:26;;;;15515:18547;;12:1:-1;9;2:12;20145:673:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20145:673:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;20145:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33006:262;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33006:262:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33006:262:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;27314:850;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27314:850:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;27314:850:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;27314:850:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;27314:850:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27314:850:0;;-1:-1:-1;27314:850:0;-1:-1:-1;;;;;;27314:850: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;27314:850:0;;;;;;;;;;;;;;;;;33806:253;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33806:253:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;33806:253:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33806:253:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33806:253:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33806:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;33806:253:0;;-1:-1:-1;33806:253:0;;-1:-1:-1;;;;;33806:253:0:i;20824:677::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20824:677:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;20824:677:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24531:628::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24531:628:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;24531:628:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;24531:628:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;24531:628:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;24531:628:0;;-1:-1:-1;24531:628:0;-1:-1:-1;;;;;;24531:628:0;;;;;;;;:::i;26480:828::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26480:828:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;26480:828:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;26480:828:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26480:828:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26480:828:0;;-1:-1:-1;26480:828:0;-1:-1:-1;;;;;;26480:828:0;;;;;;;;:::i;22961:718::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22961:718:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22961:718:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30347:714::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30347:714:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;30347:714:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;30347:714:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;30347:714:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30347:714:0;;-1:-1:-1;30347:714:0;-1:-1:-1;;;;;;30347:714:0;;;;;;;;:::i;31923:843::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31923:843:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31923:843:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;31923:843:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31923:843:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31923:843:0;;-1:-1:-1;31923:843:0;-1:-1:-1;;;;;;31923:843:0;;;;;;;;:::i;25777:697::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;25777:697:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;25777:697:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25777:697:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;25777:697:0;;-1:-1:-1;25777:697:0;-1:-1:-1;;;;;;25777:697:0;;;;;;;;:::i;33276:261::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33276:261:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33276:261:0;;;;;;;;;;;;:::i;25165:606::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25165:606:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;25165:606:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;25165:606:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25165:606:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;25165:606:0;;-1:-1:-1;25165:606:0;-1:-1:-1;;;;;;25165:606:0;;;;;;;;:::i;15649:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15649:38:0;;;:::i;:::-;;;;-1:-1:-1;;;;;15649:38:0;;;;;;;;;;;;;;32810:188;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32810:188:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32810:188:0;;;;;;;;;;;;:::i;22255:700::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22255:700:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22255:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31067:850::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31067:850:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;31067:850:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31067:850:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31067:850:0;;-1:-1:-1;31067:850:0;-1:-1:-1;;;;;;31067:850:0;;;;;;;;:::i;19274:865::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19274:865:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;19274:865:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15601:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15601:41:0;;;:::i;33545:253::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33545:253:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;33545:253:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33545:253:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33545:253:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33545:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;33545:253:0;;-1:-1:-1;33545:253:0;;-1:-1:-1;;;;;33545:253:0:i;21507:669::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21507:669:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;21507:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17513:738::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17513:738:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;17513:738:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;18257:974;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;18257:974:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28170:810::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;28170:810:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;28170:810:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;28170:810:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;28170:810:0;;-1:-1:-1;28170:810:0;-1:-1:-1;;;;;;28170:810:0;;;;;;;;:::i;20145:673::-;20382:16;20400:14;20363:8;15758:15;15746:8;:27;;15738:64;;;;;-1:-1:-1;;;15738:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15738:64:0;;;;;;;;;;;;;;;20454:196:::1;20484:5;20504:4;20523:9;20547:14;20576:12;20611:4;20631:8;20454:15;:196::i;:::-;20427:223:::0;;-1:-1:-1;20427:223:0;-1:-1:-1;20661:51:0::1;20689:5:::0;20696:2;20427:223;20661:27:::1;:51::i;:::-;20729:4;-1:-1:-1::0;;;;;20723:20:0::1;;20744:9;20723:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;20723:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20723:31:0;;;;20765:45;20796:2;20800:9;20765:30;:45::i;:::-;20145:673:::0;;;;;;;;;;:::o;33006:262::-;33159:14;33198:62;33228:8;33238:9;33249:10;33198:29;:62::i;:::-;33191:69;33006:262;-1:-1:-1;;;;33006:262:0:o;27314:850::-;27528:21;27500:8;15758:15;15746:8;:27;;15738:64;;;;;-1:-1:-1;;;15738:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15738:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27600:4:0::1;27575:29;:4:::0;;-1:-1:-1;;27580:15:0;;27575:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27575:21:0::1;-1:-1:-1::0;;;;;27575:29:0::1;;27567:71;;;::::0;;-1:-1:-1;;;27567:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27659:55;27690:7;27699:8;27709:4;;27659:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27659:30:0::1;::::0;-1:-1:-1;;;27659:55:0:i:1;:::-;27649:65;;27764:12;27733:7;27758:1;27741:7;:14;:18;27733:27;;;;;;;;;;;;;;:43;;27725:99;;;;-1:-1:-1::0;;;27725:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27835:141;27881:4;;27886:1;27881:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27881:7:0::1;27890:10;27902:51;27927:7;27936:4;;27941:1;27936:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27936:7:0::1;27945:4;;27950:1;27945:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27945:7:0::1;27902:24;:51::i;:::-;27955:7;27963:1;27955:10;;;;;;;;;;;;;;27835:31;:141::i;:::-;27987:35;27993:7;28002:4;;27987:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28016:4:0::1;::::0;-1:-1:-1;27987:5:0::1;::::0;-1:-1:-1;;27987:35:0:i:1;:::-;28039:4;-1:-1:-1::0;;;;;28033:20:0::1;;28054:7;28079:1;28062:7;:14;:18;28054:27;;;;;;;;;;;;;;28033:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28033:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28033:49:0;;;;28093:63;28124:2;28128:7;28153:1;28136:7;:14;:18;28128:27;;;;;;;;;;;;;;28093:30;:63::i;:::-;27314:850:::0;;;;;;;;;:::o;33806:253::-;33950:21;33996:55;34026:7;34035:9;34046:4;33996:29;:55::i;:::-;33989:62;;33806:253;;;;;:::o;20824:677::-;21130:12;21144;21169;21184:49;21209:7;21218:6;21226;21184:24;:49::i;:::-;21169:64;;21244:10;21257;:33;;21281:9;21257:33;;;-1:-1:-1;;21257:33:0;21301:80;;;-1:-1:-1;;;21301:80:0;;21329:10;21301:80;;;;21349:4;21301:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21244:46;;-1:-1:-1;;;;;;21301:27:0;;;;;:80;;;;;-1:-1:-1;;21301:80:0;;;;;;;;-1:-1:-1;21301:27:0;:80;;;2:2:-1;;;;27:1;24;17:12;2:2;21301:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21301:80:0;;;;21413;21429:6;21437;21445:9;21456:10;21468;21480:2;21484:8;21413:15;:80::i;:::-;21392:101;;;;;;;;20824:677;;;;;;;;;;;;;;;;:::o;24531:628::-;24755:21;24736:8;15758:15;15746:8;:27;;15738:64;;;;;-1:-1:-1;;;15738:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15738:64:0;;;;;;;;;;;;;;;24799:55:::1;24830:7;24839:8;24849:4;;24799:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;24799:30:0::1;::::0;-1:-1:-1;;;24799:55:0:i:1;:::-;24789:65;;24904:12;24873:7;24898:1;24881:7;:14;:18;24873:27;;;;;;;;;;;;;;:43;;24865:99;;;;-1:-1:-1::0;;;24865:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24975:141;25021:4;;25026:1;25021:7;;;;;;24975:141;25127:24;25133:7;25142:4;;25127:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25148:2:0;;-1:-1:-1;25127:5:0::1;::::0;-1:-1:-1;;25127:24:0:i:1;26480:828::-:0;26694:21;26666:8;15758:15;15746:8;:27;;15738:64;;;;;-1:-1:-1;;;15738:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15738:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26766:4:0::1;26741:29;:4:::0;;-1:-1:-1;;26746:15:0;;26741:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;26741:21:0::1;-1:-1:-1::0;;;;;26741:29:0::1;;26733:71;;;::::0;;-1:-1:-1;;;26733:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26825:55;26855:7;26864:9;26875:4;;26825:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26825:29:0::1;::::0;-1:-1:-1;;;26825:55:0:i:1;:::-;26815:65;;26913:11;26899:7;26907:1;26899:10;;;;;;;;;;;;;;:25;;26891:77;;;;-1:-1:-1::0;;;26891:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22961:718:::0;23279:14;23306:12;23321:46;23346:7;23355:5;23362:4;23321:24;:46::i;:::-;23306:61;;23378:10;23391;:33;;23415:9;23391:33;;;-1:-1:-1;;23391:33:0;23435:80;;;-1:-1:-1;;;23435:80:0;;23463:10;23435:80;;;;23483:4;23435:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23378:46;;-1:-1:-1;;;;;;23435:27:0;;;;;:80;;;;;-1:-1:-1;;23435:80:0;;;;;;;;-1:-1:-1;23435:27:0;:80;;;2:2:-1;;;;27:1;24;17:12;2:2;23435:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23435:80:0;;;;23538:133;23600:5;23607:9;23618:14;23634:12;23648:2;23652:8;23538:47;:133::i;:::-;23526:145;22961:718;-1:-1:-1;;;;;;;;;;;;;22961:718:0:o;30347:714::-;30581:8;15758:15;15746:8;:27;;15738:64;;;;;-1:-1:-1;;;15738:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15738:64:0;;;;;;;;;;;;;;;30602:139:::1;30648:4;;30653:1;30648:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30648:7:0::1;30657:10;30669:51;30694:7;30703:4;;30708:1;30703:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30703:7:0::1;30712:4;;30717:1;30712:7;;;;;;30669:51;30722:8;30602:31;:139::i;:::-;30752:18;30780:4:::0;;-1:-1:-1;;30785:15:0;;30780:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;30780:21:0::1;-1:-1:-1::0;;;;;30773:39:0::1;;30813:2;30773:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;30773:43:0::1;-1:-1:-1::0;;;;;30773:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;30773:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30773:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;30773:43:0;30827:44:::1;::::0;;30773:43:::1;30827:44:::0;;::::1;::::0;;;;;;;;;;;30773:43;;-1:-1:-1;30827:44:0::1;::::0;;;30862:4;;;;;;30827:44;::::1;::::0;30862:4;;30827:44;30862:4;30827:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;30868:2:0;;-1:-1:-1;30827:34:0::1;::::0;-1:-1:-1;;30827:44:0:i:1;:::-;30970:12:::0;30904:62:::1;30952:13:::0;30911:4;;-1:-1:-1;;30916:15:0;;30911:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;30911:21:0::1;-1:-1:-1::0;;;;;30904:39:0::1;;30944:2;30904:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;30904:43:0::1;-1:-1:-1::0;;;;;30904:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;30904:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30904:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;30904:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;30882:171;;;;-1:-1:-1::0;;;30882:171:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15813:1;30347:714:::0;;;;;;;:::o;31923:843::-;32190:8;15758:15;15746:8;:27;;15738:64;;;;;-1:-1:-1;;;15738:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15738:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32249:4:0::1;32224:29;:4:::0;;-1:-1:-1;;32229:15:0;;32224:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32224:21:0::1;-1:-1:-1::0;;;;;32224:29:0::1;;32216:71;;;::::0;;-1:-1:-1;;;32216:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32298:139;32344:4;;32349:1;32344:7;;;;;;32298:139;32448:55;32483:4;;32448:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32497:4:0::1;::::0;-1:-1:-1;32448:34:0::1;::::0;-1:-1:-1;;32448:55:0:i:1;:::-;32531:37;::::0;;-1:-1:-1;;;32531:37:0;;32562:4:::1;32531:37;::::0;::::1;::::0;;;32514:14:::1;::::0;-1:-1:-1;;;;;32538:4:0::1;32531:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;32531:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32531:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32531:37:0;;-1:-1:-1;32587:25:0;;::::1;;32579:81;;;;-1:-1:-1::0;;;32579:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32677:4;-1:-1:-1::0;;;;;32671:20:0::1;;32692:9;32671:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32671:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32671:31:0;;;;32713:45;32744:2;32748:9;32713:30;:45::i;25777:697::-:0;25993:21;25965:8;15758:15;15746:8;:27;;15738:64;;;;;-1:-1:-1;;;15738:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15738:64:0;;;;;;;;;;;;;;;26051:4:::1;-1:-1:-1::0;;;;;26040:15:0::1;:4;;26045:1;26040:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;26040:7:0::1;-1:-1:-1::0;;;;;26040:15:0::1;;26032:57;;;::::0;;-1:-1:-1;;;26032:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26110:56;26141:7;26150:9;26161:4;;26110:56;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26110:30:0::1;::::0;-1:-1:-1;;;26110:56:0:i:1;:::-;26100:66;;26216:12;26185:7;26210:1;26193:7;:14;:18;26185:27;;;;;;;;;;;;;;:43;;26177:99;;;;-1:-1:-1::0;;;26177:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26293:4;-1:-1:-1::0;;;;;26287:19:0::1;;26314:7;26322:1;26314:10;;;;;;;;;;;;;;26287:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26287:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26287:40:0;;;;;26351:4;-1:-1:-1::0;;;;;26345:20:0::1;;26366:51;26391:7;26400:4;;26405:1;26400:7;;;;;;26366:51;26419:7;26427:1;26419:10;;;;;;;;;;;;;;26345:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;26345:85:0::1;-1:-1:-1::0;;;;;26345:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26345:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26345:85:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;26345:85:0;26338:93:::1;;;;26442:24;26448:7;26457:4;;26442:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26463:2:0;;-1:-1:-1;26442:5:0::1;::::0;-1:-1:-1;;26442:24:0:i:1;:::-;25777:697:::0;;;;;;;;:::o;33276:261::-;33429:13;33467:62;33496:9;33507;33518:10;33467:28;:62::i;25165:606::-;25389:21;25370:8;15758:15;15746:8;:27;;15738:64;;;;;-1:-1:-1;;;15738:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15738:64:0;;;;;;;;;;;;;;;25433:55:::1;25463:7;25472:9;25483:4;;25433:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25433:29:0::1;::::0;-1:-1:-1;;;25433:55:0:i:1;:::-;25423:65;;25521:11;25507:7;25515:1;25507:10;;;;;;;;;;;;;;:25;;25499:77;;;;-1:-1:-1::0;;;25499:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15649:38:::0;;;:::o;32810:188::-;32907:12;32939:51;32962:7;32971:8;32981;32939:22;:51::i;22255:700::-;22521:14;22502:8;15758:15;15746:8;:27;;15738:64;;;;;-1:-1:-1;;;15738:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15738:64:0;;;;;;;;;;;;;;;22564:196:::1;22594:5;22614:4;22633:9;22657:14;22686:12;22721:4;22741:8;22564:15;:196::i;:::-;22810:38;::::0;;-1:-1:-1;;;22810:38:0;;22842:4:::1;22810:38;::::0;::::1;::::0;;;22548:212;;-1:-1:-1;22771:78:0::1;::::0;-1:-1:-1;22799:5:0;;22806:2;;-1:-1:-1;;;;;22810:23: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;22810:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22810:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;22810:38:0;22771:27:::1;:78::i;:::-;22866:4;-1:-1:-1::0;;;;;22860:20:0::1;;22881:9;22860:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;22860:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22860:31:0;;;;22902:45;22933:2;22937:9;22902:30;:45::i;31067:850::-:0;31327:8;15758:15;15746:8;:27;;15738:64;;;;;-1:-1:-1;;;15738:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15738:64:0;;;;;;;;;;;;;;;31372:4:::1;-1:-1:-1::0;;;;;31361:15:0::1;:4;;31366:1;31361:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31361:7:0::1;-1:-1:-1::0;;;;;31361:15:0::1;;31353:57;;;::::0;;-1:-1:-1;;;31353:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31421:13;31437:9;31421:25;;31463:4;-1:-1:-1::0;;;;;31457:19:0::1;;31484:8;31457:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31457:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31457:38:0;;;;;31519:4;-1:-1:-1::0;;;;;31513:20:0::1;;31534:51;31559:7;31568:4;;31573:1;31568:7;;;;;;31534:51;31587:8;31513:83;;;;;;;;;;;;;-1:-1:-1::0;;;;;31513:83:0::1;-1:-1:-1::0;;;;;31513:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31513:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31513:83:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31513:83:0;31506:91:::1;;;;31608:18;31636:4:::0;;-1:-1:-1;;31641:15:0;;31636:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31636:21:0::1;-1:-1:-1::0;;;;;31629:39:0::1;;31669:2;31629:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;31629:43:0::1;-1:-1:-1::0;;;;;31629:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31629:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31629:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31629:43:0;31683:44:::1;::::0;;31629:43:::1;31683:44:::0;;::::1;::::0;;;;;;;;;;;31629:43;;-1:-1:-1;31683:44:0::1;::::0;;;31718:4;;;;;;31683:44;::::1;::::0;31718:4;;31683:44;31718:4;31683:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;31724:2:0;;-1:-1:-1;31683:34:0::1;::::0;-1:-1:-1;;31683:44:0:i:1;:::-;31826:12:::0;31760:62:::1;31808:13:::0;31767:4;;-1:-1:-1;;31772:15:0;;31767:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31767:21:0::1;-1:-1:-1::0;;;;;31760:39:0::1;;31800:2;31760:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;31760:43:0::1;-1:-1:-1::0;;;;;31760:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;19274:865:0::0;19528:12;19542;19509:8;15758:15;15746:8;:27;;15738:64;;;;;-1:-1:-1;;;15738:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15738:64:0;;;;;;;;;;;;;;;19567:12:::1;19582:49;19607:7;19616:6;19624;19582:24;:49::i;:::-;19642:62;::::0;;-1:-1:-1;;;19642:62:0;;19676:10:::1;19642:62;::::0;::::1;::::0;-1:-1:-1;;;;;19642:33:0;::::1;:62:::0;;;;;;;;;;;;;;19567:64;;-1:-1:-1;19642:33:0;;::::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;19642:33:0;:62;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;19642:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19642:62:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;19772:29:0::1;::::0;;-1:-1:-1;;;19772:29:0;;-1:-1:-1;;;;;19772:29:0;;::::1;;::::0;::::1;::::0;;;19742:12:::1;::::0;;;19772:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;19742:12;19772:25;:29;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;19772:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19772:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19772:29:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;19772:29:0;-1:-1:-1;19813:14:0::1;19832:43;19860:6:::0;19868;19832:27:::1;:43::i;:::-;19812:63;;;19917:6;-1:-1:-1::0;;;;;19907:16:0::1;:6;-1:-1:-1::0;;;;;19907:16:0::1;;:58;;19948:7;19957;19907:58;;;19927:7;19936;19907:58;19886:79:::0;;-1:-1:-1;19886:79:0;-1:-1:-1;19984:21:0;;::::1;;19976:72;;;;-1:-1:-1::0;;;19976:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20078:10;20067:7;:21;;20059:72;;;;-1:-1:-1::0;;;20059:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15813:1;;;;19274:865:::0;;;;;;;;;;;:::o;15601:41::-;;;:::o;33545:253::-;33689:21;33735:55;33766:7;33775:8;33785:4;33735:30;:55::i;21507:669::-;21796:16;21814:14;21841:12;21856:46;21881:7;21890:5;21897:4;21856:24;:46::i;:::-;21841:61;;21913:10;21926;:33;;21950:9;21926:33;;;-1:-1:-1;;21926:33:0;21970:80;;;-1:-1:-1;;;21970:80:0;;21998:10;21970:80;;;;22018:4;21970:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21913:46;;-1:-1:-1;;;;;;21970:27:0;;;;;:80;;;;;-1:-1:-1;;21970:80:0;;;;;;;;-1:-1:-1;21970:27:0;:80;;;2:2:-1;;;;27:1;24;17:12;2:2;21970:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21970:80:0;;;;22088;22107:5;22114:9;22125:14;22141:12;22155:2;22159:8;22088:18;:80::i;:::-;22061:107;;;;-1:-1:-1;21507:669:0;-1:-1:-1;;;;;;;;;;;;;21507:669:0:o;17513:738::-;17801:12;17815;17829:14;17782:8;15758:15;15746:8;:27;;15738:64;;;;;-1:-1:-1;;;15738:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15738:64:0;;;;;;;;;;;;;;;17877:85:::1;17891:6;17899;17907:14;17923;17939:10;17951;17877:13;:85::i;:::-;17856:106:::0;;-1:-1:-1;17856:106:0;-1:-1:-1;17973:12:0::1;17988:49;18013:7;18022:6:::0;18030;17988:24:::1;:49::i;:::-;17973:64;;18048:66;18080:6;18088:10;18100:4;18106:7;18048:31;:66::i;:::-;18125;18157:6;18165:10;18177:4;18183:7;18125:31;:66::i;:::-;18229:4;-1:-1:-1::0;;;;;18214:25:0::1;;18240:2;18214:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;18214:29:0::1;-1:-1:-1::0;;;;;18214:29:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;18214:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;18214:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;18214:29:0;17513:738;;;;-1:-1:-1;18214:29:0;;-1:-1:-1;17513:738:0;;-1:-1:-1;;;;;;;;;17513:738:0:o;18257:974::-;18510:16;18528:14;18544;18491:8;15758:15;15746:8;:27;;15738:64;;;;;-1:-1:-1;;;15738:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15738:64:0;;;;;;;;;;;;;;;18598:176:::1;18626:5;18646:4;18665:18;18698:9;18722:14;18751:12;18598:13;:176::i;:::-;18571:203:::0;;-1:-1:-1;18571:203:0;-1:-1:-1;18785:12:0::1;18800:46;18825:7;18834:5:::0;18841:4:::1;18800:24;:46::i;:::-;18785:61;;18857:69;18889:5;18896:10;18908:4;18914:11;18857:31;:69::i;:::-;18943:4;-1:-1:-1::0;;;;;18937:19:0::1;;18964:9;18937:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;18937:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;18937:39:0;;;;;19000:4;-1:-1:-1::0;;;;;18994:20:0::1;;19015:4;19021:9;18994:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;18994:37:0::1;-1:-1:-1::0;;;;;18994:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;18994:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;18994:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;18994:37:0;18987:45:::1;;;;19070:4;-1:-1:-1::0;;;;;19055:25:0::1;;19081:2;19055:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;19055:29:0::1;-1:-1:-1::0;;;;;19055:29:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19055:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19055:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19055:29:0;;-1:-1:-1;19135:9:0::1;:21:::0;-1:-1:-1;19131:92:0::1;;;19158:65;19189:10;19213:9;19201;:21;19158:30;:65::i;:::-;15813:1;18257:974:::0;;;;;;;;;;;:::o;28170:810::-;28383:21;28355:8;15758:15;15746:8;:27;;15738:64;;;;;-1:-1:-1;;;15738:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15738:64:0;;;;;;;;;;;;;;;28441:4:::1;-1:-1:-1::0;;;;;28430:15:0::1;:4;;28435:1;28430:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28430:7:0::1;-1:-1:-1::0;;;;;28430:15:0::1;;28422:57;;;::::0;;-1:-1:-1;;;28422:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28500:55;28530:7;28539:9;28550:4;;28500:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28500:29:0::1;::::0;-1:-1:-1;;;28500:55:0:i:1;:::-;28490:65;;28588:9;28574:7;28582:1;28574:10;;;;;;;;;;;;;;:23;;28566:75;;;;-1:-1:-1::0;;;28566:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28658:4;-1:-1:-1::0;;;;;28652:19:0::1;;28679:7;28687:1;28679:10;;;;;;;;;;;;;;28652:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28652:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28652:40:0;;;;;28716:4;-1:-1:-1::0;;;;;28710:20:0::1;;28731:51;28756:7;28765:4;;28770:1;28765:7;;;;;;28731:51;28784:7;28792:1;28784:10;;;;;;;;;;;;;;28710:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;28710:85:0::1;-1:-1:-1::0;;;;;28710:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28710:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28710:85:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;28710:85:0;28703:93:::1;;;;28807:24;28813:7;28822:4;;28807:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28828:2:0;;-1:-1:-1;28807:5:0::1;::::0;-1:-1:-1;;28807:24:0:i:1;:::-;28894:7;28902:1;28894:10;;;;;;;;;;;;;;28882:9;:22;28878:94;;;28906:66;28937:10;28961:7;28969:1;28961:10;;;;;;;;;;;;;;28949:9;:22;28906:30;:66::i;1225:361::-:0;1420:45;;;-1:-1:-1;;;;;1420:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1420:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;1409:57:0;;;;1374:12;;1388:17;;1409:10;;;;1420:45;1409:57;;;25:18:-1;1409:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;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;;;1409: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;;1373:93:0;;;;1485:7;:57;;;;-1:-1:-1;1497:11:0;;:16;;:44;;;1528:4;1517:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1517:24:0;1497:44;1477:101;;;;;-1:-1:-1;;;1477:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:361;;;;;:::o;2004:195::-;2112:12;;;2074;2112;;;;;;;;;-1:-1:-1;;;;;2091:7:0;;;2105:5;;2091:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;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;;;2091:34: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;;2073:52:0;;;2144:7;2136:55;;;;-1:-1:-1;;;2136:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2004:195;;;:::o;12201:517::-;12294:14;12340:1;12329:8;:12;12321:68;;;;-1:-1:-1;;;12321:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12420:1;12408:9;:13;:31;;;;;12438:1;12425:10;:14;12408:31;12400:84;;;;-1:-1:-1;;;12400:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12495:20;12518:17;:8;12531:3;12518:17;:12;:17;:::i;:::-;12495:40;-1:-1:-1;12546:14:0;12563:31;12495:40;12583:10;12563:31;:19;:31;:::i;:::-;12546:48;-1:-1:-1;12605:16:0;12624:40;12648:15;12624:19;:9;12638:4;12624:19;:13;:19;:::i;:::-;:23;:40;:23;:40;:::i;:::-;12605:59;;12699:11;12687:9;:23;;;;;;;12201:517;-1:-1:-1;;;;;;;12201:517:0:o;13393:511::-;13494:21;13551:1;13536:4;:11;:16;;13528:59;;;;;-1:-1:-1;;;13528:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13619:4;:11;13608:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13608:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;13608:23:0;;13598:33;;13655:8;13642:7;13650:1;13642:10;;;;;;;;;;;;;:21;;;;;13679:6;13674:223;13705:1;13691:4;:11;:15;13687:1;:19;13674:223;;;13729:14;13745:15;13764:42;13776:7;13785:4;13790:1;13785:7;;;;;;;;;;;;;;13794:4;13799:1;13803;13799:5;13794:11;;;;;;;;;;;;;;13764;:42::i;:::-;13728:78;;;;13838:47;13851:7;13859:1;13851:10;;;;;;;;;;;;;;13863:9;13874:10;13838:12;:47::i;:::-;13821:7;13829:1;13833;13829:5;13821:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;13708:3:0;;13674:223;;;;13393:511;;;;;:::o;10675:478::-;10764:12;10790:14;10806;10824:26;10835:6;10843;10824:10;:26::i;:::-;10988:32;;;-1:-1:-1;;10988:32:0;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;10988:32:0;;;;;10978:43;;;;;;10891:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;10891:251:0;;;;;;;10881:262;;;;;;;;;10675:478;-1:-1:-1;;;;;10675:478:0:o;1594:402::-;1819:51;;;-1:-1:-1;;;;;1819:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1819:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;1808:63:0;;;;1773:12;;1787:17;;1808:10;;;;1819:51;1808:63;;;25:18:-1;1808:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;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;;;1808: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;;1772:99:0;;;;1890:7;:57;;;;-1:-1:-1;1902:11:0;;:16;;:44;;;1933:4;1922:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1922:24:0;1902:44;1882:106;;;;-1:-1:-1;;;1882:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1594:402;;;;;;:::o;23790:735::-;23897:6;23892:626;23923:1;23909:4;:11;:15;23905:1;:19;23892:626;;;23947:13;23962:14;23981:4;23986:1;23981:7;;;;;;;;;;;;;;23990:4;23995:1;23999;23995:5;23990:11;;;;;;;;;;;;;;23946:56;;;;24018:14;24037:42;24065:5;24072:6;24037:27;:42::i;:::-;24017:62;;;24094:14;24111:7;24119:1;24123;24119:5;24111:14;;;;;;;;;;;;;;24094:31;;24141:15;24158;24186:6;-1:-1:-1;;;;;24177:15:0;:5;-1:-1:-1;;;;;24177:15:0;;:61;;24219:9;24235:1;24177:61;;;24201:1;24205:9;24177:61;24140:98;;;;24253:10;24284:1;24270:4;:11;:15;24266:1;:19;:82;;24345:3;24266:82;;;24288:54;24313:7;24322:6;24330:4;24335:1;24339;24335:5;24330:11;;;;;;;;;;;;;;24288:24;:54::i;:::-;24253:95;;24378:48;24403:7;24412:5;24419:6;24378:24;:48::i;:::-;-1:-1:-1;;;;;24363:69:0;;24451:10;24463;24475:2;24489:1;24479:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;24479:12:0;87:42:-1;143:17;;-1:-1;24479:12:0;;24363:143;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24363:143:0;-1:-1:-1;;;;;24363:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;24363:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24363:143:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;23926:3:0;;;;;-1:-1:-1;23892:626:0;;-1:-1:-1;;;;;;;;23892:626:0;;;23790:735;;;:::o;13985:532::-;14086:21;14143:1;14128:4;:11;:16;;14120:59;;;;;-1:-1:-1;;;14120:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14211:4;:11;14200:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14200:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14200:23:0;;14190:33;;14264:9;14234:7;14259:1;14242:7;:14;:18;14234:27;;;;;;;;;;;;;;;;;:39;14298:11;;-1:-1:-1;;14298:15:0;14284:226;14315:5;;14284:226;;14343:14;14359:15;14378:42;14390:7;14399:4;14408:1;14404;:5;14399:11;;;;;;;;;;;;;;14412:4;14417:1;14412:7;;;;;;;14378:42;14342:78;;;;14452:46;14464:7;14472:1;14464:10;;;;;;;;;;;;;;14476:9;14487:10;14452:11;:46::i;:::-;14435:7;14447:1;14443;:5;14435:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;14322:3:0;14284:226;;29127:1214;29240:6;29235:1099;29266:1;29252:4;:11;:15;29248:1;:19;29235:1099;;;29290:13;29305:14;29324:4;29329:1;29324:7;;;;;;;;;;;;;;29333:4;29338:1;29342;29338:5;29333:11;;;;;;;;;;;;;;29289:56;;;;29361:14;29380:42;29408:5;29415:6;29380:27;:42::i;:::-;29360:62;;;29437:19;29474:48;29499:7;29508:5;29515:6;29474:24;:48::i;:::-;29437:86;;29538:16;29569:17;29657:13;29672;29690:4;-1:-1:-1;;;;;29690:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29690:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29690:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29690:18:0;;;;;;;29656:52;;;;;-1:-1:-1;29656:52:0;;-1:-1:-1;29724:17:0;;-1:-1:-1;;;;;29765:15:0;;;;;;;:61;;29807:8;29817;29765:61;;;29784:8;29794;29765:61;29723:103;;;;29855:56;29898:12;29862:5;-1:-1:-1;;;;;29855:23:0;;29887:4;29855:38;;;;;;;;;;;;;-1:-1:-1;;;;;29855:38:0;-1:-1:-1;;;;;29855:38:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;29855:56:0;29841:70;;29941:71;29971:11;29984:12;29998:13;29941:29;:71::i;:::-;29926:86;;29235:1099;;;;30043:15;30060;30088:6;-1:-1:-1;;;;;30079:15:0;:5;-1:-1:-1;;;;;30079:15:0;;:67;;30124:12;30143:1;30079:67;;;30103:1;30107:12;30079:67;30042:104;;;;30161:10;30192:1;30178:4;:11;:15;30174:1;:19;:82;;30253:3;30174:82;;;30196:54;30221:7;30230:6;30238:4;30243:1;30247;30243:5;30238:11;;;;;;;30196:54;30309:12;;;30319:1;30309:12;;;;;;;;;;-1:-1:-1;;;30271:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;30271:51:0;;;;;;;;;;;;;;;;;;;;;;30161:95;;-1:-1:-1;30271:9:0;;;;;;30281:10;;30293;;30161:95;;30309:12;;30271:51;;;;;;;;30309:12;;30271:51;;;;30309: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;30271:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30271:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;29269:3:0;;;;;-1:-1:-1;29235:1099:0;;-1:-1:-1;;;;;;;;;;29235:1099:0;9783:129;9867:5;;;9862:16;;;;9854:50;;;;;-1:-1:-1;;;9854:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;12839:472;12932:13;12978:1;12966:9;:13;12958:70;;;;-1:-1:-1;;;12958:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13059:1;13047:9;:13;:31;;;;;13077:1;13064:10;:14;13047:31;13039:84;;;;-1:-1:-1;;;13039:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13134:14;13151:34;13180:4;13151:24;:9;13165;13151:24;:13;:24;:::i;:::-;:28;:34;:28;:34;:::i;:::-;13134:51;-1:-1:-1;13196:16:0;13215:34;13245:3;13215:25;:10;13230:9;13215:25;:14;:25;:::i;:34::-;13196:53;;13271:32;13301:1;13284:11;13272:9;:23;;;;;;;13271:32;:29;:32;:::i;:::-;13260:43;12839:472;-1:-1:-1;;;;;;12839:472:0:o;11758:321::-;11840:12;11883:1;11873:7;:11;11865:61;;;;-1:-1:-1;;;11865:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11956:1;11945:8;:12;:28;;;;;11972:1;11961:8;:12;11945:28;11937:81;;;;-1:-1:-1;;;11937:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12063:8;12039:21;:7;12051:8;12039:21;:11;:21;:::i;:::-;:32;;;;;;;11758:321;-1:-1:-1;;;;11758:321:0:o;10234:349::-;10309:14;10325;10370:6;-1:-1:-1;;;;;10360:16:0;:6;-1:-1:-1;;;;;10360:16:0;;;10352:66;;;;-1:-1:-1;;;10352:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10457:6;-1:-1:-1;;;;;10448:15:0;:6;-1:-1:-1;;;;;10448:15:0;;:53;;10486:6;10494;10448:53;;;10467:6;10475;10448:53;10429:72;;-1:-1:-1;10429:72:0;-1:-1:-1;;;;;;10520:20:0;;10512:63;;;;;-1:-1:-1;;;10512:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10234:349;;;;;:::o;16117:1390::-;16430:50;;;-1:-1:-1;;;16430:50:0;;-1:-1:-1;;;;;16430:50:0;;;;;;;;;;;;;;;;16335:12;;;;;;16448:7;16430:34;;;;;;:50;;;;;;;;;;;;;;;:34;:50;;;2:2:-1;;;;27:1;24;17:12;2:2;16430:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16430:50:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16430:50:0;-1:-1:-1;;;;;16430:64:0;;16426:150;;;16511:53;;;-1:-1:-1;;;16511:53:0;;-1:-1:-1;;;;;16511:53:0;;;;;;;;;;;;;;;;16529:7;16511:37;;;;;;:53;;;;;;;;;;;;;;;-1:-1:-1;16511:37:0;:53;;;2:2:-1;;;;27:1;24;17:12;2:2;16511:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16511:53:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;16426:150:0;16587:13;16602;16619:53;16648:7;16657:6;16665;16619:28;:53::i;:::-;16586:86;;;;16687:8;16699:1;16687:13;:30;;;;-1:-1:-1;16704:13:0;;16687:30;16683:817;;;16756:14;;-1:-1:-1;16772:14:0;;-1:-1:-1;16683:817:0;;;16820:19;16842:58;16865:14;16881:8;16891;16842:22;:58::i;:::-;16820:80;;16937:14;16919;:32;16915:574;;16998:10;16980:14;:28;;16972:79;;;;-1:-1:-1;;;16972:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17092:14;;-1:-1:-1;17108:14:0;-1:-1:-1;17108:14:0;16915:574;;;17164:19;17186:58;17209:14;17225:8;17235;17186:22;:58::i;:::-;17164:80;;17288:14;17270;:32;;17263:40;;;;17348:10;17330:14;:28;;17322:79;;;;-1:-1:-1;;;17322:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17442:14;-1:-1:-1;17458:14:0;;-1:-1:-1;16915:574:0;16683:817;;16117:1390;;;;;;;;;;;:::o;9920:142::-;9972:6;9999;;;:30;;-1:-1:-1;;10014:5:0;;;10028:1;10023;10014:5;10023:1;10009:15;;;;;:20;9999:30;9991:63;;;;;-1:-1:-1;;;9991:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;9647:128;9731:5;;;9726:16;;;;9718:49;;;;;-1:-1:-1;;;9718:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;11211:434;11304:13;11319;11346:14;11365:26;11376:6;11384;11365:10;:26::i;:::-;11345:46;;;11402:32;11410:7;11419:6;11427;11402:7;:32::i;:::-;;11446:13;11461;11494:32;11502:7;11511:6;11519;11494:7;:32::i;:::-;-1:-1:-1;;;;;11479:60:0;;:62;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11479:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11479:62:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11479:62:0;;;;;;;11445:96;;;;;-1:-1:-1;11445:96:0;;-1:-1:-1;;;;;;11575:16:0;;;;;;;:62;;11618:8;11628;11575:62;;;11595:8;11605;11575:62;11552:85;;;;-1:-1:-1;11211:434:0;-1:-1:-1;;;;;;;11211:434:0:o

Swarm Source

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