Contract 0x94930a328162957ff1dd48900af67b5439336cbd 2

 
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0x1036e931b690c766e99b1b95807f1ac7493e2d3d9603aa6d0b350f531812ae67Swap Exact Token...409461142023-03-30 16:59:223 hrs 19 mins ago0xede8c74cb64f7afeca20b4eb3bbe8f34dbba6af3 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.035779147795123.249721994
0x1af563a457f58dff82d9007c31dcd1a7f2b49affd9cd689feb538c5b05df96a2Swap Exact Token...409461142023-03-30 16:59:223 hrs 19 mins ago0x0b44ba58ec7b5983e4b51575ee2b80fde655dfe0 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.006040146977 133.927870902
0x113f0698ef7c2cf6529acf731b8c36994bf36923f1ae537cf9ee66bd143fb4b7Swap Exact Token...409461132023-03-30 16:59:203 hrs 19 mins ago0x0b44ba58ec7b5983e4b51575ee2b80fde655dfe0 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.016526308319 131.500364589
0xaf95913801b61767dcdaa2c3c1c2508dd4bd4c05cd1a8ea879f3436556c92751Swap Exact Token...409460972023-03-30 16:58:463 hrs 20 mins ago0xede8c74cb64f7afeca20b4eb3bbe8f34dbba6af3 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.023960198948130.403447003
0xd675b7a1a58721d44ed62b18b8684676d03b583c4c8e220789ee7596bc20032bSwap Exact Token...409458812023-03-30 16:51:063 hrs 27 mins ago0x0b44ba58ec7b5983e4b51575ee2b80fde655dfe0 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.017721128024 141.007583243
0x57dca31ab14e05a653e8c37dac997d048a9655ee027b0c927c20e1e87e196427Swap Exact Token...409457122023-03-30 16:45:083 hrs 33 mins ago0x0b44ba58ec7b5983e4b51575ee2b80fde655dfe0 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.013676380726 108.823399456
0x433390f2c1aad47c60703220f5ba797ef97de3d6eecc13022ea5bdcdcdfdfdd5Swap Exact Token...409455742023-03-30 16:40:143 hrs 38 mins ago0x0b44ba58ec7b5983e4b51575ee2b80fde655dfe0 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.015144107685 120.502149872
0xc9f7b1d32b8a26e87332591b49b649a5369ac41c0150d009f1d87aa60d00e4acSwap Exact Token...409454392023-03-30 16:35:263 hrs 43 mins ago0x0b44ba58ec7b5983e4b51575ee2b80fde655dfe0 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.023126765679 184.037987947
0x6ea4f702e38b43bf6472683623180220f2d3a77bc4ad4ee127e50656d28545d1Swap Exact Token...409449852023-03-30 16:18:503 hrs 59 mins ago0x0b44ba58ec7b5983e4b51575ee2b80fde655dfe0 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.015626566684 124.352965348
0xc63de0f5a74af0b599126251b228b50fff98d24aa42af791721a445c8e1da102Swap Exact Token...409448722023-03-30 16:14:504 hrs 3 mins ago0x0b44ba58ec7b5983e4b51575ee2b80fde655dfe0 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.018711885776 148.905292543
0x9ec279fe8914a911136150ebb21a832dc93d5c3dd7c80ca75bbd48cdbc68d6eeAdd Liquidity409366512023-03-30 11:16:469 hrs 2 mins ago0x60a37a0c137b3d2bbb086ebdab1535833799d36c IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.021615148445120.350265839
0x8e15e259f72f8db7853f892e50226fd79937b18eb7d75f07d405fd1036d813e7Swap Exact Token...409365382023-03-30 11:12:469 hrs 6 mins ago0x60a37a0c137b3d2bbb086ebdab1535833799d36c IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.019459218992110.603335241
0xf38039add620304d051745630a3814a9b4016f176a48ef6b12609d98b080eb77Swap Exact Token...409364902023-03-30 11:11:049 hrs 7 mins ago0x60a37a0c137b3d2bbb086ebdab1535833799d36c IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.011438727311109.154410672
0xc794157370bc1e84cae55dd106825a5fbe5b74bc41e495bff28c4b4391a8217bAdd Liquidity409337722023-03-30 9:31:4410 hrs 47 mins ago0xd50dc9cc16c025a5ee506974e575676298f963f8 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.023215895478 132.776067938
0xcfc2ca19f24e6f848586f86aed82227331b499c5ef631b37c113be69e1dce495Add Liquidity409333312023-03-30 9:15:3611 hrs 3 mins ago0xd50dc9cc16c025a5ee506974e575676298f963f8 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.028024375559 157.135751267
0xf72b95ca0ec494f5d4bb3cebff43433f3b91d131e7fedc21b83559e46256c8d3Swap Exact ETH F...409332462023-03-30 9:12:3211 hrs 6 mins ago0xd50dc9cc16c025a5ee506974e575676298f963f8 IN  0x94930a328162957ff1dd48900af67b5439336cbd85.000732 MATIC0.015443305398 149.818639878
0xb5abf60d106f4027fb1aaadd8547852f38ec1313417d59256b7181de7c56ddb9Swap Exact Token...409331922023-03-30 9:10:0811 hrs 8 mins ago0xd50dc9cc16c025a5ee506974e575676298f963f8 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.017439763881 114.566453922
0x539e76ee5f9ace9f5d2678fb5cfe067b783498ee8550ba317dd9393361fa5c83Swap Exact Token...409325492023-03-30 8:47:0211 hrs 31 mins ago0x838a73193077853196486c24de209e333bfb74a5 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.018475691798 157.408725937
0xb31cb8e8e08ea413a68bfdd636ddcc1d5f59a1d0d354e9bea4baa7c0936ed6e6Swap Exact Token...409325222023-03-30 8:45:5211 hrs 32 mins ago0x838a73193077853196486c24de209e333bfb74a5 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.016569232835 141.191386973
0x5633d99c0e671eeea757b6b3e37b6104ca7e903a602e9b75abf2bc0ab362d110Swap Exact Token...409321682023-03-30 8:32:4811 hrs 46 mins ago0xc389def9aa9882b323075df5872b6142984d137f IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.020000933436 170.368604546
0x2089c206ab45daf824441d0760df82c1e6a259de6516914f66ab02664b45dc6fSwap Exact Token...409321382023-03-30 8:31:4411 hrs 47 mins ago0xc389def9aa9882b323075df5872b6142984d137f IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.030552777436 176.090610331
0xb1a64f559ab75f39c4574372e3587d1f1ac8c11279c319281e91f26c0d6c227fSwap Exact Token...409319542023-03-30 8:25:1411 hrs 53 mins ago0x850dbca54b35c3228094f98bfe0bfd75a22ff768 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.012761222161 113.34341864
0xafb41ef60bde51af3625f9b0d1351f28d306420a62d91b7775efc7d03a883808Swap Exact Token...409318132023-03-30 8:20:1411 hrs 58 mins ago0x40e388b0e3aa56577c0820f33d4cf62223898bbc IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.017510409346 149.154238966
0xeb83d5c47b67848d52af5c1c5218634063a09a3a2c6c9d68da665526f04b3a7dSwap Exact Token...409317922023-03-30 8:19:3011 hrs 59 mins ago0x40e388b0e3aa56577c0820f33d4cf62223898bbc IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.016149464135 137.600341972
0x9bdf9ac3f9f78e2f8fc7470612f426c00a2bde705382539e8cb15d030ba4b50eSwap Exact Token...409311992023-03-30 7:57:2412 hrs 21 mins ago0x4614ca553926cb5a87ed1b5102c576fcd61b4978 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.013107488387110.425344462
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x1036e931b690c766e99b1b95807f1ac7493e2d3d9603aa6d0b350f531812ae67409461142023-03-30 16:59:223 hrs 19 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0xede8c74cb64f7afeca20b4eb3bbe8f34dbba6af30.240370545989142541 MATIC
0x1036e931b690c766e99b1b95807f1ac7493e2d3d9603aa6d0b350f531812ae67409461142023-03-30 16:59:223 hrs 19 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd0.240370545989142541 MATIC
0x113f0698ef7c2cf6529acf731b8c36994bf36923f1ae537cf9ee66bd143fb4b7409461132023-03-30 16:59:203 hrs 19 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0x0b44ba58ec7b5983e4b51575ee2b80fde655dfe082.069254208257269069 MATIC
0x113f0698ef7c2cf6529acf731b8c36994bf36923f1ae537cf9ee66bd143fb4b7409461132023-03-30 16:59:203 hrs 19 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd82.069254208257269069 MATIC
0xaf95913801b61767dcdaa2c3c1c2508dd4bd4c05cd1a8ea879f3436556c92751409460972023-03-30 16:58:463 hrs 20 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0xede8c74cb64f7afeca20b4eb3bbe8f34dbba6af32.802987629742054922 MATIC
0xaf95913801b61767dcdaa2c3c1c2508dd4bd4c05cd1a8ea879f3436556c92751409460972023-03-30 16:58:463 hrs 20 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd2.802987629742054922 MATIC
0xd675b7a1a58721d44ed62b18b8684676d03b583c4c8e220789ee7596bc20032b409458812023-03-30 16:51:063 hrs 27 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0x0b44ba58ec7b5983e4b51575ee2b80fde655dfe082.95814603159281702 MATIC
0xd675b7a1a58721d44ed62b18b8684676d03b583c4c8e220789ee7596bc20032b409458812023-03-30 16:51:063 hrs 27 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd82.95814603159281702 MATIC
0x57dca31ab14e05a653e8c37dac997d048a9655ee027b0c927c20e1e87e196427409457122023-03-30 16:45:083 hrs 33 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0x0b44ba58ec7b5983e4b51575ee2b80fde655dfe086.55955388078159083 MATIC
0x57dca31ab14e05a653e8c37dac997d048a9655ee027b0c927c20e1e87e196427409457122023-03-30 16:45:083 hrs 33 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd86.55955388078159083 MATIC
0x433390f2c1aad47c60703220f5ba797ef97de3d6eecc13022ea5bdcdcdfdfdd5409455742023-03-30 16:40:143 hrs 38 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0x0b44ba58ec7b5983e4b51575ee2b80fde655dfe089.05097088831847657 MATIC
0x433390f2c1aad47c60703220f5ba797ef97de3d6eecc13022ea5bdcdcdfdfdd5409455742023-03-30 16:40:143 hrs 38 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd89.05097088831847657 MATIC
0xc9f7b1d32b8a26e87332591b49b649a5369ac41c0150d009f1d87aa60d00e4ac409454392023-03-30 16:35:263 hrs 43 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0x0b44ba58ec7b5983e4b51575ee2b80fde655dfe091.297241536555139745 MATIC
0xc9f7b1d32b8a26e87332591b49b649a5369ac41c0150d009f1d87aa60d00e4ac409454392023-03-30 16:35:263 hrs 43 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd91.297241536555139745 MATIC
0x6ea4f702e38b43bf6472683623180220f2d3a77bc4ad4ee127e50656d28545d1409449852023-03-30 16:18:503 hrs 59 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0x0b44ba58ec7b5983e4b51575ee2b80fde655dfe091.139806779836404651 MATIC
0x6ea4f702e38b43bf6472683623180220f2d3a77bc4ad4ee127e50656d28545d1409449852023-03-30 16:18:503 hrs 59 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd91.139806779836404651 MATIC
0xc63de0f5a74af0b599126251b228b50fff98d24aa42af791721a445c8e1da102409448722023-03-30 16:14:504 hrs 3 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0x0b44ba58ec7b5983e4b51575ee2b80fde655dfe091.065936342375086798 MATIC
0xc63de0f5a74af0b599126251b228b50fff98d24aa42af791721a445c8e1da102409448722023-03-30 16:14:504 hrs 3 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd91.065936342375086798 MATIC
0xf72b95ca0ec494f5d4bb3cebff43433f3b91d131e7fedc21b83559e46256c8d3409332462023-03-30 9:12:3211 hrs 6 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd Polygon: WMATIC Token85.000732 MATIC
0x9bdf9ac3f9f78e2f8fc7470612f426c00a2bde705382539e8cb15d030ba4b50e409311992023-03-30 7:57:2412 hrs 21 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0x4614ca553926cb5a87ed1b5102c576fcd61b497866.214043481624021895 MATIC
0x9bdf9ac3f9f78e2f8fc7470612f426c00a2bde705382539e8cb15d030ba4b50e409311992023-03-30 7:57:2412 hrs 21 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd66.214043481624021895 MATIC
0xbc2870b681a94c4f7aea6b4520edc1acc9a0ecd52c330c430a5f5b2472d0ea4c409284962023-03-30 6:16:4614 hrs 2 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0xda64c924d23698b7d0f5e10f41702591ae1d87c84.224510493601923174 MATIC
0xbc2870b681a94c4f7aea6b4520edc1acc9a0ecd52c330c430a5f5b2472d0ea4c409284962023-03-30 6:16:4614 hrs 2 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd4.224510493601923174 MATIC
0x9c433cde786f46924f914cab21ce254f25e4378cd6bdc7b00ce3ee01fee03200409209782023-03-30 1:31:3218 hrs 47 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0x83b4c060c965d645daf1336d1f3b3accd084f0ac0.951632454966742171 MATIC
0x9c433cde786f46924f914cab21ce254f25e4378cd6bdc7b00ce3ee01fee03200409209782023-03-30 1:31:3218 hrs 47 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd0.951632454966742171 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CatRouter

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 14: CatRouter.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity =0.6.12;

import './CatLibrary.sol';
import './SafeMath.sol';
import './TransferHelper.sol';
import './ICatRouter02.sol';
import './ICatFactory.sol';
import './IERC20.sol';
import './IWETH.sol';

contract CatRouter is ICatRouter02 {
    using SafeMathUniswap for uint;

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

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'CatRouter: 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 (ICatFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            ICatFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = CatLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = CatLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'CatRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = CatLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'CatRouter: 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 = CatLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = ICatPair(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 = CatLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = ICatPair(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 = CatLibrary.pairFor(factory, tokenA, tokenB);
        ICatPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = ICatPair(pair).burn(to);
        (address token0,) = CatLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'CatRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'CatRouter: 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 = CatLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        ICatPair(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 = CatLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        ICatPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountETH) {
        (, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IERC20Uniswap(token).balanceOf(address(this)));
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountETH) {
        address pair = CatLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        ICatPair(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,) = CatLibrary.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 ? CatLibrary.pairFor(factory, output, path[i + 2]) : _to;
            ICatPair(CatLibrary.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 = CatLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'CatRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, CatLibrary.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 = CatLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'CatRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, CatLibrary.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, 'CatRouter: INVALID_PATH');
        amounts = CatLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'CatRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(CatLibrary.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, 'CatRouter: INVALID_PATH');
        amounts = CatLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'CatRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, CatLibrary.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, 'CatRouter: INVALID_PATH');
        amounts = CatLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'CatRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, CatLibrary.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, 'CatRouter: INVALID_PATH');
        amounts = CatLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'CatRouter: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(CatLibrary.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,) = CatLibrary.sortTokens(input, output);
            ICatPair pair = ICatPair(CatLibrary.pairFor(factory, input, output));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
            (uint reserve0, uint reserve1,) = pair.getReserves();
            (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
            amountInput = IERC20Uniswap(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = CatLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? CatLibrary.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, CatLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20Uniswap(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20Uniswap(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'CatRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'CatRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(CatLibrary.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC20Uniswap(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20Uniswap(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'CatRouter: 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, 'CatRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, CatLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20Uniswap(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'CatRouter: 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 CatLibrary.quote(amountA, reserveA, reserveB);
    }

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

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

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

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

File 2 of 14: CatLibrary.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

import './ICatPair.sol';

import "./SafeMath.sol";

library CatLibrary {
    using SafeMathUniswap for uint;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'CatLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'CatLibrary: 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'3cad6f9e70e13835b4f07e5dd475f25a109450b22811d0437da51e66c161255a' // init code hash
            ))));
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = ICatPair(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, 'CatLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'CatLibrary: 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, 'CatLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'CatLibrary: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(9976);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(10000).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, 'CatLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'CatLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(10000);
        uint denominator = reserveOut.sub(amountOut).mul(9976);
        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, 'CatLibrary: 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, 'CatLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint i = path.length - 1; i > 0; i--) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

File 3 of 14: ICatCallee.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

interface ICatCallee {
    function uniswapV2Call(address sender, uint amount0, uint amount1, bytes calldata data) external;
}

File 4 of 14: ICatERC20.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

interface ICatERC20 {
    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;
}

File 5 of 14: ICatFactory.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

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

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

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

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

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

File 6 of 14: ICatPair.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

File 7 of 14: ICatRouter01.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.6.2;

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

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

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

File 8 of 14: ICatRouter02.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.6.2;

import './ICatRouter01.sol';

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

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

File 9 of 14: IERC20.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

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

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

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

File 10 of 14: IWETH.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

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

File 11 of 14: Math.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity =0.6.12;

// a library for performing various math operations

library Math {
    function min(uint x, uint y) internal pure returns (uint z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

File 12 of 14: SafeMath.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity =0.6.12;

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

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

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

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

File 13 of 14: TransferHelper.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.6.0;

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

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

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

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

File 14 of 14: UQ112x112.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity =0.6.12;

// a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))

// range: [0, 2**112 - 1]
// resolution: 1 / 2**112

library UQ112x112 {
    uint224 constant Q112 = 2**112;

    // encode a uint112 as a UQ112x112
    function encode(uint112 y) internal pure returns (uint224 z) {
        z = uint224(y) * Q112; // never overflows
    }

    // divide a UQ112x112 by a uint112, returning a UQ112x112
    function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {
        z = x / uint224(y);
    }
}

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

60c060405234801561001057600080fd5b50604051620046ad380380620046ad8339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614528620001856000398061015f5280610ce45280610d1f5280610e16528061103452806113be528061152452806118d352806119ae5280611a885280611b565280611c9c5280611d245280611f605280611fdb528061208f528061215b52806121f05280612264528061277352806129dd5280612a335280612a675280612adb5280612c695280612dac5280612e34525080610ea45280610f7b52806110fa5280611133528061126e528061144c528061150252806116725280611be95280611d565280611eb0528061229652806124d452806126f85280612721528061275152806128be5280612a115280612cfc5280612e6652806136e7528061372a52806139ff5280613b755280613f92528061404b52806140fe52506145286000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110f3945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611129565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b038135169060200135611223565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561136e565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356114fa565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611608565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b038135169060200135611885565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b0e565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611e58565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611e65565b34801561088157600080fd5b5061088a611f5e565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611f82565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611f8f565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b038135169060200135612115565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612486565b348015610a1c57600080fd5b5061088a6126f6565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061271a945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612747565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e0013561285b565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a0013561298e565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612c21565b6000808242811015610cde576040805162461bcd60e51b815260206004820152601260248201526000805160206143b9833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612486565b9093509150610d1d898685612f9a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da58583613104565b50965096945050505050565b6000610dbe8484846131fc565b949350505050565b60608142811015610e0c576040805162461bcd60e51b815260206004820152601260248201526000805160206143b9833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9f576040805162461bcd60e51b81526020600482015260176024820152600080516020614449833981519152604482015290519081900360640190fd5b610efd7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132d492505050565b91508682600184510381518110610f1057fe5b60200260200101511015610f555760405162461bcd60e51b81526004018080602001828103825260258152602001806143d96025913960400191505060405180910390fd5b610ff386866000818110610f6557fe5b905060200201356001600160a01b031633610fd97f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fa757fe5b905060200201356001600160a01b03168b8b6001818110610fc457fe5b905060200201356001600160a01b031661341b565b85600081518110610fe657fe5b60200260200101516134db565b61103282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613638915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061107157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110af57600080fd5b505af11580156110c3573d6000803e3d6000fd5b505050506110e884836001855103815181106110db57fe5b6020026020010151613104565b509695505050505050565b60606111207f00000000000000000000000000000000000000000000000000000000000000008484613875565b90505b92915050565b60008060006111597f00000000000000000000000000000000000000000000000000000000000000008f8f61341b565b9050600087611168578c61116c565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111e257600080fd5b505af11580156111f6573d6000803e3d6000fd5b505050506112098f8f8f8f8f8f8f612486565b809450819550505050509b509b9950505050505050505050565b60608142811015611269576040805162461bcd60e51b815260206004820152601260248201526000805160206143b9833981519152604482015290519081900360640190fd5b6112c77f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132d492505050565b915086826001845103815181106112da57fe5b6020026020010151101561131f5760405162461bcd60e51b81526004018080602001828103825260258152602001806143d96025913960400191505060405180910390fd5b61132f86866000818110610f6557fe5b6110e882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613638915050565b606081428110156113b4576040805162461bcd60e51b815260206004820152601260248201526000805160206143b9833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106113ee57fe5b905060200201356001600160a01b03166001600160a01b031614611447576040805162461bcd60e51b81526020600482015260176024820152600080516020614449833981519152604482015290519081900360640190fd5b6114a57f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061387592505050565b915086826000815181106114b557fe5b60200260200101511115610f555760405162461bcd60e51b81526004018080602001828103825260218152602001806144696021913960400191505060405180910390fd5b6000806115487f00000000000000000000000000000000000000000000000000000000000000008d7f000000000000000000000000000000000000000000000000000000000000000061341b565b9050600086611557578b61155b565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115d157600080fd5b505af11580156115e5573d6000803e3d6000fd5b505050506115f78d8d8d8d8d8d611f8f565b9d9c50505050505050505050505050565b804281101561164c576040805162461bcd60e51b815260206004820152601260248201526000805160206143b9833981519152604482015290519081900360640190fd5b6116c18585600081811061165c57fe5b905060200201356001600160a01b0316336116bb7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b905060200201356001600160a01b03168a8a6001818110610fc457fe5b8a6134db565b6000858560001981018181106116d357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561172f57600080fd5b505afa158015611743573d6000803e3d6000fd5b505050506040513d602081101561175957600080fd5b5051604080516020888102828101820190935288825292935061179b9290918991899182918501908490808284376000920191909152508892506139a8915050565b8661183e82888860001981018181106117b057fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b505afa158015611820573d6000803e3d6000fd5b505050506040513d602081101561183657600080fd5b505190613caa565b101561187b5760405162461bcd60e51b81526004018080602001828103825260258152602001806143d96025913960400191505060405180910390fd5b5050505050505050565b80428110156118c9576040805162461bcd60e51b815260206004820152601260248201526000805160206143b9833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061190357fe5b905060200201356001600160a01b03166001600160a01b03161461195c576040805162461bcd60e51b81526020600482015260176024820152600080516020614449833981519152604482015290519081900360640190fd5b61196c8585600081811061165c57fe5b6119aa8585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506139a8915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a1957600080fd5b505afa158015611a2d573d6000803e3d6000fd5b505050506040513d6020811015611a4357600080fd5b5051905086811015611a865760405162461bcd60e51b81526004018080602001828103825260258152602001806143d96025913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611aec57600080fd5b505af1158015611b00573d6000803e3d6000fd5b5050505061187b8482613104565b60608142811015611b54576040805162461bcd60e51b815260206004820152601260248201526000805160206143b9833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611b8b57fe5b905060200201356001600160a01b03166001600160a01b031614611be4576040805162461bcd60e51b81526020600482015260176024820152600080516020614449833981519152604482015290519081900360640190fd5b611c427f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132d492505050565b91508682600184510381518110611c5557fe5b60200260200101511015611c9a5760405162461bcd60e51b81526004018080602001828103825260258152602001806143d96025913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611cd657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d0957600080fd5b505af1158015611d1d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d827f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110611d8f57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611ddd57600080fd5b505af1158015611df1573d6000803e3d6000fd5b505050506040513d6020811015611e0757600080fd5b5051611e0f57fe5b611e4e82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613638915050565b5095945050505050565b6000610dbe848484613cfa565b60608142811015611eab576040805162461bcd60e51b815260206004820152601260248201526000805160206143b9833981519152604482015290519081900360640190fd5b611f097f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061387592505050565b91508682600081518110611f1957fe5b6020026020010151111561131f5760405162461bcd60e51b81526004018080602001828103825260218152602001806144696021913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe848484613dd2565b60008142811015611fd5576040805162461bcd60e51b815260206004820152601260248201526000805160206143b9833981519152604482015290519081900360640190fd5b612004887f00000000000000000000000000000000000000000000000000000000000000008989893089612486565b90508092505061208d88858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561205c57600080fd5b505afa158015612070573d6000803e3d6000fd5b505050506040513d602081101561208657600080fd5b5051612f9a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120f357600080fd5b505af1158015612107573d6000803e3d6000fd5b505050506110e88483613104565b8042811015612159576040805162461bcd60e51b815260206004820152601260248201526000805160206143b9833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061219057fe5b905060200201356001600160a01b03166001600160a01b0316146121e9576040805162461bcd60e51b81526020600482015260176024820152600080516020614449833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561224957600080fd5b505af115801561225d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122c27f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561230957600080fd5b505af115801561231d573d6000803e3d6000fd5b505050506040513d602081101561233357600080fd5b505161233b57fe5b60008686600019810181811061234d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156123a957600080fd5b505afa1580156123bd573d6000803e3d6000fd5b505050506040513d60208110156123d357600080fd5b505160408051602089810282810182019093528982529293506124159290918a918a9182918501908490808284376000920191909152508992506139a8915050565b8761183e828989600019810181811061242a57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b60008082428110156124cd576040805162461bcd60e51b815260206004820152601260248201526000805160206143b9833981519152604482015290519081900360640190fd5b60006124fa7f00000000000000000000000000000000000000000000000000000000000000008c8c61341b565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561255557600080fd5b505af1158015612569573d6000803e3d6000fd5b505050506040513d602081101561257f57600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156125cc57600080fd5b505af11580156125e0573d6000803e3d6000fd5b505050506040513d60408110156125f657600080fd5b508051602090910151909250905060006126108e8e613e8e565b509050806001600160a01b03168e6001600160a01b031614612633578183612636565b82825b90975095508a871015612690576040805162461bcd60e51b815260206004820181905260248201527f436174526f757465723a20494e53554646494349454e545f415f414d4f554e54604482015290519081900360640190fd5b898610156126e5576040805162461bcd60e51b815260206004820181905260248201527f436174526f757465723a20494e53554646494349454e545f425f414d4f554e54604482015290519081900360640190fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111207f000000000000000000000000000000000000000000000000000000000000000084846132d4565b60008060006127977f00000000000000000000000000000000000000000000000000000000000000008e7f000000000000000000000000000000000000000000000000000000000000000061341b565b90506000876127a6578c6127aa565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561282057600080fd5b505af1158015612834573d6000803e3d6000fd5b505050506128468e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b600080600083428110156128a4576040805162461bcd60e51b815260206004820152601260248201526000805160206143b9833981519152604482015290519081900360640190fd5b6128b28c8c8c8c8c8c613f82565b909450925060006128e47f00000000000000000000000000000000000000000000000000000000000000008e8e61341b565b90506128f28d3383886134db565b6128fe8c3383876134db565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561294d57600080fd5b505af1158015612961573d6000803e3d6000fd5b505050506040513d602081101561297757600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156129d7576040805162461bcd60e51b815260206004820152601260248201526000805160206143b9833981519152604482015290519081900360640190fd5b612a058a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613f82565b90945092506000612a577f00000000000000000000000000000000000000000000000000000000000000008c7f000000000000000000000000000000000000000000000000000000000000000061341b565b9050612a658b3383886134db565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612ac057600080fd5b505af1158015612ad4573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b5057600080fd5b505af1158015612b64573d6000803e3d6000fd5b505050506040513d6020811015612b7a57600080fd5b5051612b8257fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612bd157600080fd5b505af1158015612be5573d6000803e3d6000fd5b505050506040513d6020811015612bfb57600080fd5b5051925034841015612c1357612c1333853403613104565b505096509650969350505050565b60608142811015612c67576040805162461bcd60e51b815260206004820152601260248201526000805160206143b9833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612c9e57fe5b905060200201356001600160a01b03166001600160a01b031614612cf7576040805162461bcd60e51b81526020600482015260176024820152600080516020614449833981519152604482015290519081900360640190fd5b612d557f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061387592505050565b91503482600081518110612d6557fe5b60200260200101511115612daa5760405162461bcd60e51b81526004018080602001828103825260218152602001806144696021913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612de657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e1957600080fd5b505af1158015612e2d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612e927f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110612e9f57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612eed57600080fd5b505af1158015612f01573d6000803e3d6000fd5b505050506040513d6020811015612f1757600080fd5b5051612f1f57fe5b612f5e82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613638915050565b81600081518110612f6b57fe5b6020026020010151341115611e4e57611e4e3383600081518110612f8b57fe5b60200260200101513403613104565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106130175780518252601f199092019160209182019101612ff8565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613079576040519150601f19603f3d011682016040523d82523d6000602084013e61307e565b606091505b50915091508180156130ac5750805115806130ac57508080602001905160208110156130a957600080fd5b50515b6130fd576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131505780518252601f199092019160209182019101613131565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146131b2576040519150601f19603f3d011682016040523d82523d6000602084013e6131b7565b606091505b50509050806131f75760405162461bcd60e51b815260040180806020018281038252602381526020018061448a6023913960400191505060405180910390fd5b505050565b600080841161323c5760405162461bcd60e51b81526004018080602001828103825260258152602001806144246025913960400191505060405180910390fd5b60008311801561324c5750600082115b6132875760405162461bcd60e51b81526004018080602001828103825260228152602001806144ad6022913960400191505060405180910390fd5b6000613295856126f861423f565b905060006132a3828561423f565b905060006132bd836132b78861271061423f565b906142a2565b90508082816132c857fe5b04979650505050505050565b6060600282511015613328576040805162461bcd60e51b8152602060048201526018602482015277086c2e898d2c4e4c2e4f27440929cac82989288bea082a8960431b604482015290519081900360640190fd5b815167ffffffffffffffff8111801561334057600080fd5b5060405190808252806020026020018201604052801561336a578160200160208202803683370190505b509050828160008151811061337b57fe5b60200260200101818152505060005b6001835103811015613413576000806133cd878685815181106133a957fe5b60200260200101518786600101815181106133c057fe5b60200260200101516142f1565b915091506133ef8484815181106133e057fe5b602002602001015183836131fc565b8484600101815181106133fe57fe5b6020908102919091010152505060010161338a565b509392505050565b600080600061342a8585613e8e565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f3cad6f9e70e13835b4f07e5dd475f25a109450b22811d0437da51e66c161255a609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106135605780518252601f199092019160209182019101613541565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146135c2576040519150601f19603f3d011682016040523d82523d6000602084013e6135c7565b606091505b50915091508180156135f55750805115806135f557508080602001905160208110156135f257600080fd5b50515b6136305760405162461bcd60e51b81526004018080602001828103825260248152602001806144cf6024913960400191505060405180910390fd5b505050505050565b60005b600183510381101561386f5760008084838151811061365657fe5b602002602001015185846001018151811061366d57fe5b60200260200101519150915060006136858383613e8e565b509050600087856001018151811061369957fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146136c7578260006136cb565b6000835b91509150600060028a510388106136e25788613723565b6137237f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061371657fe5b602002602001015161341b565b90506137507f0000000000000000000000000000000000000000000000000000000000000000888861341b565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f19166020018201604052801561378d576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156137f55781810151838201526020016137dd565b50505050905090810190601f1680156138225780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561384457600080fd5b505af1158015613858573d6000803e3d6000fd5b50506001909901985061363b975050505050505050565b50505050565b60606002825110156138c9576040805162461bcd60e51b8152602060048201526018602482015277086c2e898d2c4e4c2e4f27440929cac82989288bea082a8960431b604482015290519081900360640190fd5b815167ffffffffffffffff811180156138e157600080fd5b5060405190808252806020026020018201604052801561390b578160200160208202803683370190505b509050828160018351038151811061391f57fe5b60209081029190910101528151600019015b8015613413576000806139618786600186038151811061394d57fe5b60200260200101518786815181106133c057fe5b9150915061398384848151811061397457fe5b60200260200101518383613cfa565b84600185038151811061399257fe5b6020908102919091010152505060001901613931565b60005b60018351038110156131f7576000808483815181106139c657fe5b60200260200101518584600101815181106139dd57fe5b60200260200101519150915060006139f58383613e8e565b5090506000613a257f0000000000000000000000000000000000000000000000000000000000000000858561341b565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613a6657600080fd5b505afa158015613a7a573d6000803e3d6000fd5b505050506040513d6060811015613a9057600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613ac6578284613ac9565b83835b91509150613b1e828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b9550613b2b8683836131fc565b945050505050600080856001600160a01b0316886001600160a01b031614613b5557826000613b59565b6000835b91509150600060028c51038a10613b70578a613ba4565b613ba47f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061371657fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613c2e578181015183820152602001613c16565b50505050905090810190601f168015613c5b5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613c7d57600080fd5b505af1158015613c91573d6000803e3d6000fd5b50506001909b019a506139ab9950505050505050505050565b80820382811115611123576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6000808411613d3a5760405162461bcd60e51b81526004018080602001828103825260268152602001806143fe6026913960400191505060405180910390fd5b600083118015613d4a5750600082115b613d855760405162461bcd60e51b81526004018080602001828103825260228152602001806144ad6022913960400191505060405180910390fd5b6000613d9d612710613d97868861423f565b9061423f565b90506000613db16126f8613d978689613caa565b9050613dc86001828481613dc157fe5b04906142a2565b9695505050505050565b6000808411613e28576040805162461bcd60e51b815260206004820152601f60248201527f4361744c6962726172793a20494e53554646494349454e545f414d4f554e5400604482015290519081900360640190fd5b600083118015613e385750600082115b613e735760405162461bcd60e51b81526004018080602001828103825260228152602001806144ad6022913960400191505060405180910390fd5b82613e7e858461423f565b81613e8557fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613ef8576040805162461bcd60e51b815260206004820152601f60248201527f4361744c6962726172793a204944454e544943414c5f41444452455353455300604482015290519081900360640190fd5b826001600160a01b0316846001600160a01b031610613f18578284613f1b565b83835b90925090506001600160a01b038216613f7b576040805162461bcd60e51b815260206004820152601860248201527f4361744c6962726172793a205a45524f5f414444524553530000000000000000604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561400e57600080fd5b505afa158015614022573d6000803e3d6000fd5b505050506040513d602081101561403857600080fd5b50516001600160a01b031614156140f6577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b1580156140c957600080fd5b505af11580156140dd573d6000803e3d6000fd5b505050506040513d60208110156140f357600080fd5b50505b6000806141247f00000000000000000000000000000000000000000000000000000000000000008b8b6142f1565b91509150816000148015614136575080155b1561414657879350869250614232565b6000614153898484613dd2565b90508781116141bc57858110156141b1576040805162461bcd60e51b815260206004820181905260248201527f436174526f757465723a20494e53554646494349454e545f425f414d4f554e54604482015290519081900360640190fd5b889450925082614230565b60006141c9898486613dd2565b9050898111156141d557fe5b8781101561422a576040805162461bcd60e51b815260206004820181905260248201527f436174526f757465723a20494e53554646494349454e545f415f414d4f554e54604482015290519081900360640190fd5b94508793505b505b5050965096945050505050565b600081158061425a5750508082028282828161425757fe5b04145b611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006143008585613e8e565b50905060008061431188888861341b565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561434957600080fd5b505afa15801561435d573d6000803e3d6000fd5b505050506040513d606081101561437357600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b03878116908416146143a65780826143a9565b81815b9099909850965050505050505056fe436174526f757465723a20455850495245440000000000000000000000000000436174526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e544361744c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e544361744c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54436174526f757465723a20494e56414c49445f50415448000000000000000000436174526f757465723a204558434553534956455f494e5055545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45444361744c6962726172793a20494e53554646494349454e545f4c49515549444954595472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a2646970667358221220fbf806c3ef5444d196e970063831e6786fd12184e29ae5106c9b5b0b1e55b0a064736f6c634300060c0033000000000000000000000000477ce834ae6b7ab003cce4bc4d8697763ff456fa0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270

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

000000000000000000000000477ce834ae6b7ab003cce4bc4d8697763ff456fa0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270

-----Decoded View---------------
Arg [0] : _factory (address): 0x477ce834ae6b7ab003cce4bc4d8697763ff456fa
Arg [1] : _WETH (address): 0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000477ce834ae6b7ab003cce4bc4d8697763ff456fa
Arg [1] : 0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270


Deployed ByteCode Sourcemap

249:17743:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;701:10;-1:-1:-1;;;;;715:4:1;701:18;;694:26;;;;249:17743;;;;;4658:653;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4658:653:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16999:248;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16999:248:1;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;11526:810;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11526:810:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11526:810:1;;;;;;;;;;;;-1:-1:-1;11526:810:1;-1:-1:-1;;;;;;11526:810:1;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17751:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17751:239:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17751:239:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17751:239:1;;-1:-1:-1;17751:239:1;;-1:-1:-1;;;;;17751:239:1:i;5316:651::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5316:651:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;8887:597::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8887:597:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8887:597:1;;;;;;;;;;;;-1:-1:-1;8887:597:1;-1:-1:-1;;;;;;8887:597:1;;;;;;;;:::i;10733:788::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10733:788:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10733:788:1;;;;;;;;;;;;-1:-1:-1;10733:788:1;-1:-1:-1;;;;;;10733:788:1;;;;;;;;:::i;7384:691::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7384:691:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14427:700::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14427:700:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14427:700:1;;;;;;;;;;;;-1:-1:-1;14427:700:1;-1:-1:-1;;;;;;14427:700:1;;;;;;;;:::i;15961:811::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15961:811:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15961:811:1;;;;;;;;;;;;-1:-1:-1;15961:811:1;-1:-1:-1;;;;;;15961:811:1;;;;;;;;:::i;10069:659::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10069:659:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10069:659:1;;;;;;;;;;;;-1:-1:-1;10069:659:1;-1:-1:-1;;;;;;10069:659:1;;;;;;;;:::i;17253:247::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17253:247:1;;;;;;;;;;;;:::i;9489:575::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9489:575:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9489:575:1;;;;;;;;;;;;-1:-1:-1;9489:575:1;-1:-1:-1;;;;;;9489:575:1;;;;;;;;:::i;374:38::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;374:38:1;;;;;;;;;;;;;;16813:180;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16813:180:1;;;;;;;;;;;;:::i;6692:687::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6692:687:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15132:824::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15132:824:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15132:824:1;;;;;;;;;;;;-1:-1:-1;15132:824:1;-1:-1:-1;;;;;;15132:824:1;;;;;;;;:::i;3840:813::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3840:813:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;327:41::-;;;;;;;;;;;;;:::i;17506:239::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17506:239:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17506:239:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17506:239:1;;-1:-1:-1;17506:239:1;;-1:-1:-1;;;;;17506:239:1:i;5972:644::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5972:644:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2145:711::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2145:711:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;2861:939;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2861:939:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12341:770::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12341:770:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12341:770:1;;;;;;;;;;;;-1:-1:-1;12341:770:1;-1:-1:-1;;;;;;12341:770:1;;;;;;;;:::i;4658:653::-;4888:16;4906:14;4869:8;480:15;468:8;:27;;460:58;;;;;-1:-1:-1;;;460:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;460:58:1;;;;;;;;;;;;;;;4959:188:::1;4988:5;5007:4;5025:9;5048:14;5076:12;5110:4;5129:8;4959:15;:188::i;:::-;4932:215:::0;;-1:-1:-1;4932:215:1;-1:-1:-1;5157:51:1::1;5185:5:::0;5192:2;4932:215;5157:27:::1;:51::i;:::-;5224:4;-1:-1:-1::0;;;;;5218:20:1::1;;5239:9;5218:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;5259:45;5290:2;5294:9;5259:30;:45::i;:::-;4658:653:::0;;;;;;;;;;:::o;16999:248::-;17147:14;17184:56;17208:8;17218:9;17229:10;17184:23;:56::i;:::-;17177:63;16999:248;-1:-1:-1;;;;16999:248:1:o;11526:810::-;11735:21;11708:8;480:15;468:8;:27;;460:58;;;;;-1:-1:-1;;;460:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;460:58:1;;;;;;;;;;;;;;;-1:-1:-1;;;;;11805:4:1::1;11780:29;:4:::0;;-1:-1:-1;;11785:15:1;;11780:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;11780:21:1::1;-1:-1:-1::0;;;;;11780:29:1::1;;11772:65;;;::::0;;-1:-1:-1;;;11772:65:1;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;11772:65:1;;;;;;;;;;;;;::::1;;11857:49;11882:7;11891:8;11901:4;;11857:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;11857:24:1::1;::::0;-1:-1:-1;;;11857:49:1:i:1;:::-;11847:59;;11955:12;11924:7;11949:1;11932:7;:14;:18;11924:27;;;;;;;;;;;;;;:43;;11916:93;;;;-1:-1:-1::0;;;11916:93:1::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12019:133;12064:4;;12069:1;12064:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;12064:7:1::1;12073:10;12085:45;12104:7;12113:4;;12118:1;12113:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;12113:7:1::1;12122:4;;12127:1;12122:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;12122:7:1::1;12085:18;:45::i;:::-;12132:7;12140:1;12132:10;;;;;;;;;;;;;;12019:31;:133::i;:::-;12162:35;12168:7;12177:4;;12162:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;12191:4:1::1;::::0;-1:-1:-1;12162:5:1::1;::::0;-1:-1:-1;;12162:35:1:i:1;:::-;12213:4;-1:-1:-1::0;;;;;12207:20:1::1;;12228:7;12253:1;12236:7;:14;:18;12228:27;;;;;;;;;;;;;;12207:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;12266:63;12297:2;12301:7;12326:1;12309:7;:14;:18;12301:27;;;;;;;;;;;;;;12266:30;:63::i;:::-;11526:810:::0;;;;;;;;;:::o;17751:239::-;17890:21;17934:49;17958:7;17967:9;17978:4;17934:23;:49::i;:::-;17927:56;;17751:239;;;;;:::o;5316:651::-;5613:12;5627;5651;5666:43;5685:7;5694:6;5702;5666:18;:43::i;:::-;5651:58;;5719:10;5732;:33;;5756:9;5732:33;;;-1:-1:-1;;5732:33:1;5775:74;;;-1:-1:-1;;;5775:74:1;;5797:10;5775:74;;;;5817:4;5775:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5719:46;;-1:-1:-1;;;;;;5775:21:1;;;;;:74;;;;;-1:-1:-1;;5775:74:1;;;;;;;;-1:-1:-1;5775:21:1;:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5880:80;5896:6;5904;5912:9;5923:10;5935;5947:2;5951:8;5880:15;:80::i;:::-;5859:101;;;;;;;;5316:651;;;;;;;;;;;;;;;;:::o;8887:597::-;9105:21;9086:8;480:15;468:8;:27;;460:58;;;;;-1:-1:-1;;;460:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;460:58:1;;;;;;;;;;;;;;;9148:49:::1;9173:7;9182:8;9192:4;;9148:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;9148:24:1::1;::::0;-1:-1:-1;;;9148:49:1:i:1;:::-;9138:59;;9246:12;9215:7;9240:1;9223:7;:14;:18;9215:27;;;;;;;;;;;;;;:43;;9207:93;;;;-1:-1:-1::0;;;9207:93:1::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9310:133;9355:4;;9360:1;9355:7;;;;;;9310:133;9453:24;9459:7;9468:4;;9453:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;9474:2:1;;-1:-1:-1;9453:5:1::1;::::0;-1:-1:-1;;9453:24:1:i:1;10733:788::-:0;10942:21;10915:8;480:15;468:8;:27;;460:58;;;;;-1:-1:-1;;;460:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;460:58:1;;;;;;;;;;;;;;;-1:-1:-1;;;;;11012:4:1::1;10987:29;:4:::0;;-1:-1:-1;;10992:15:1;;10987:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;10987:21:1::1;-1:-1:-1::0;;;;;10987:29:1::1;;10979:65;;;::::0;;-1:-1:-1;;;10979:65:1;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;10979:65:1;;;;;;;;;;;;;::::1;;11064:49;11088:7;11097:9;11108:4;;11064:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;11064:23:1::1;::::0;-1:-1:-1;;;11064:49:1:i:1;:::-;11054:59;;11145:11;11131:7;11139:1;11131:10;;;;;;;;;;;;;;:25;;11123:71;;;;-1:-1:-1::0;;;11123:71:1::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7384:691:::0;7694:14;7720:12;7735:40;7754:7;7763:5;7770:4;7735:18;:40::i;:::-;7720:55;;7785:10;7798;:33;;7822:9;7798:33;;;-1:-1:-1;;7798:33:1;7841:74;;;-1:-1:-1;;;7841:74:1;;7863:10;7841:74;;;;7883:4;7841:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7785:46;;-1:-1:-1;;;;;;7841:21:1;;;;;:74;;;;;-1:-1:-1;;7841:74:1;;;;;;;;-1:-1:-1;7841:21:1;:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7937:131;7998:5;8005:9;8016:14;8032:12;8046:2;8050:8;7937:47;:131::i;:::-;7925:143;7384:691;-1:-1:-1;;;;;;;;;;;;;7384:691:1:o;14427:700::-;14655:8;480:15;468:8;:27;;460:58;;;;;-1:-1:-1;;;460:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;460:58:1;;;;;;;;;;;;;;;14675:131:::1;14720:4;;14725:1;14720:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;14720:7:1::1;14729:10;14741:45;14760:7;14769:4;;14774:1;14769:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;14769:7:1::1;14778:4;;14783:1;14778:7;;;;;;14741:45;14788:8;14675:31;:131::i;:::-;14816:18;14851:4:::0;;-1:-1:-1;;14856:15:1;;14851:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;14851:21:1::1;-1:-1:-1::0;;;;;14837:46:1::1;;14884:2;14837:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;14837:50:1::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;14837:50:1;14897:44:::1;::::0;;14837:50:::1;14897:44:::0;;::::1;::::0;;;;;;;;;;;14837:50;;-1:-1:-1;14897:44:1::1;::::0;;;14932:4;;;;;;14897:44;::::1;::::0;14932:4;;14897:44;14932:4;14897:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;14938:2:1;;-1:-1:-1;14897:34:1::1;::::0;-1:-1:-1;;14897:44:1:i:1;:::-;15045:12:::0;14972:69:::1;15027:13:::0;14986:4;;-1:-1:-1;;14991:15:1;;14986:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;14986:21:1::1;-1:-1:-1::0;;;;;14972:46:1::1;;15019:2;14972:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;14972:50:1::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;14972:50:1;;:54:::1;:69::i;:::-;:85;;14951:169;;;;-1:-1:-1::0;;;14951:169:1::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;528:1;14427:700:::0;;;;;;;:::o;15961:811::-;16218:8;480:15;468:8;:27;;460:58;;;;;-1:-1:-1;;;460:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;460:58:1;;;;;;;;;;;;;;;-1:-1:-1;;;;;16275:4:1::1;16250:29;:4:::0;;-1:-1:-1;;16255:15:1;;16250:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;16250:21:1::1;-1:-1:-1::0;;;;;16250:29:1::1;;16242:65;;;::::0;;-1:-1:-1;;;16242:65:1;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;16242:65:1;;;;;;;;;;;;;::::1;;16317:131;16362:4;;16367:1;16362:7;;;;;;16317:131;16458:55;16493:4;;16458:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;16507:4:1::1;::::0;-1:-1:-1;16458:34:1::1;::::0;-1:-1:-1;;16458:55:1:i:1;:::-;16523:14;16554:4;-1:-1:-1::0;;;;;16540:29:1::1;;16578:4;16540:44;;;;;;;;;;;;;-1:-1:-1::0;;;;;16540:44:1::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;16540:44:1;;-1:-1:-1;16602:25:1;;::::1;;16594:75;;;;-1:-1:-1::0;;;16594:75:1::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16685:4;-1:-1:-1::0;;;;;16679:20:1::1;;16700:9;16679:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16720:45;16751:2;16755:9;16720:30;:45::i;10069:659::-:0;10279:21;10252:8;480:15;468:8;:27;;460:58;;;;;-1:-1:-1;;;460:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;460:58:1;;;;;;;;;;;;;;;10335:4:::1;-1:-1:-1::0;;;;;10324:15:1::1;:4;;10329:1;10324:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;10324:7:1::1;-1:-1:-1::0;;;;;10324:15:1::1;;10316:51;;;::::0;;-1:-1:-1;;;10316:51:1;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;10316:51:1;;;;;;;;;;;;;::::1;;10387:50;10412:7;10421:9;10432:4;;10387:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;10387:24:1::1;::::0;-1:-1:-1;;;10387:50:1:i:1;:::-;10377:60;;10486:12;10455:7;10480:1;10463:7;:14;:18;10455:27;;;;;;;;;;;;;;:43;;10447:93;;;;-1:-1:-1::0;;;10447:93:1::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10556:4;-1:-1:-1::0;;;;;10550:19:1::1;;10577:7;10585:1;10577:10;;;;;;;;;;;;;;10550:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;10613:4;-1:-1:-1::0;;;;;10607:20:1::1;;10628:45;10647:7;10656:4;;10661:1;10656:7;;;;;;10628:45;10675:7;10683:1;10675:10;;;;;;;;;;;;;;10607:79;;;;;;;;;;;;;-1:-1:-1::0;;;;;10607:79:1::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;10607:79:1;10600:87:::1;;;;10697:24;10703:7;10712:4;;10697:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;10718:2:1;;-1:-1:-1;10697:5:1::1;::::0;-1:-1:-1;;10697:24:1:i:1;:::-;10069:659:::0;;;;;;;;:::o;17253:247::-;17401:13;17437:56;17460:9;17471;17482:10;17437:22;:56::i;9489:575::-;9707:21;9688:8;480:15;468:8;:27;;460:58;;;;;-1:-1:-1;;;460:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;460:58:1;;;;;;;;;;;;;;;9750:49:::1;9774:7;9783:9;9794:4;;9750:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;9750:23:1::1;::::0;-1:-1:-1;;;9750:49:1:i:1;:::-;9740:59;;9831:11;9817:7;9825:1;9817:10;;;;;;;;;;;;;;:25;;9809:71;;;;-1:-1:-1::0;;;9809:71:1::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;374:38:::0;;;:::o;16813:180::-;16910:12;16941:45;16958:7;16967:8;16977;16941:16;:45::i;6692:687::-;6951:14;6932:8;480:15;468:8;:27;;460:58;;;;;-1:-1:-1;;;460:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;460:58:1;;;;;;;;;;;;;;;6993:188:::1;7022:5;7041:4;7059:9;7082:14;7110:12;7144:4;7163:8;6993:15;:188::i;:::-;6977:204;;;;;;7191:85;7219:5;7226:2;7244:5;-1:-1:-1::0;;;;;7230:30:1::1;;7269:4;7230:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;7230:45:1::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;7230:45:1;7191:27:::1;:85::i;:::-;7292:4;-1:-1:-1::0;;;;;7286:20:1::1;;7307:9;7286:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;7327:45;7358:2;7362:9;7327:30;:45::i;15132:824::-:0;15382:8;480:15;468:8;:27;;460:58;;;;;-1:-1:-1;;;460:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;460:58:1;;;;;;;;;;;;;;;15425:4:::1;-1:-1:-1::0;;;;;15414:15:1::1;:4;;15419:1;15414:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;15414:7:1::1;-1:-1:-1::0;;;;;15414:15:1::1;;15406:51;;;::::0;;-1:-1:-1;;;15406:51:1;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;15406:51:1;;;;;;;;;;;;;::::1;;15467:13;15483:9;15467:25;;15508:4;-1:-1:-1::0;;;;;15502:19:1::1;;15529:8;15502:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;15563:4;-1:-1:-1::0;;;;;15557:20:1::1;;15578:45;15597:7;15606:4;;15611:1;15606:7;;;;;;15578:45;15625:8;15557:77;;;;;;;;;;;;;-1:-1:-1::0;;;;;15557:77:1::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;15557:77:1;15550:85:::1;;;;15645:18;15680:4:::0;;-1:-1:-1;;15685:15:1;;15680:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;15680:21:1::1;-1:-1:-1::0;;;;;15666:46:1::1;;15713:2;15666:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;15666:50:1::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;15666:50:1;15726:44:::1;::::0;;15666:50:::1;15726:44:::0;;::::1;::::0;;;;;;;;;;;15666:50;;-1:-1:-1;15726:44:1::1;::::0;;;15761:4;;;;;;15726:44;::::1;::::0;15761:4;;15726:44;15761:4;15726:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;15767:2:1;;-1:-1:-1;15726:34:1::1;::::0;-1:-1:-1;;15726:44:1:i:1;:::-;15874:12:::0;15801:69:::1;15856:13:::0;15815:4;;-1:-1:-1;;15820:15:1;;15815:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;15815:21:1::1;-1:-1:-1::0;;;;;15801:46:1::1;;15848:2;15801:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;15801:50:1::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;3840:813:::0;4086:12;4100;4067:8;480:15;468:8;:27;;460:58;;;;;-1:-1:-1;;;460:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;460:58:1;;;;;;;;;;;;;;;4124:12:::1;4139:43;4158:7;4167:6;4175;4139:18;:43::i;:::-;4192:56;::::0;;-1:-1:-1;;;4192:56:1;;4220:10:::1;4192:56;::::0;::::1;::::0;-1:-1:-1;;;;;4192:27:1;::::1;:56:::0;;;;;;;;;;;;;;4124:58;;-1:-1:-1;4192:27:1;;::::1;::::0;:56;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;4192:27:1;:56;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;4315:23:1::1;::::0;;-1:-1:-1;;;4315:23:1;;-1:-1:-1;;;;;4315:23:1;;::::1;;::::0;::::1;::::0;;;4285:12:::1;::::0;;;4315:19;;::::1;::::0;::::1;::::0;:23;;;;;;;;;;;4285:12;4315:19;:23;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;4315:23:1;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;4315:23:1;-1:-1:-1;4349:14:1::1;4368:37;4390:6:::0;4398;4368:21:::1;:37::i;:::-;4348:57;;;4446:6;-1:-1:-1::0;;;;;4436:16:1::1;:6;-1:-1:-1::0;;;;;4436:16:1::1;;:58;;4477:7;4486;4436:58;;;4456:7;4465;4436:58;4415:79:::0;;-1:-1:-1;4415:79:1;-1:-1:-1;4512:21:1;;::::1;;4504:66;;;::::0;;-1:-1:-1;;;4504:66:1;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;4599:10;4588:7;:21;;4580:66;;;::::0;;-1:-1:-1;;;4580:66:1;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;528:1;;;;3840:813:::0;;;;;;;;;;;:::o;327:41::-;;;:::o;17506:239::-;17645:21;17689:49;17714:7;17723:8;17733:4;17689:24;:49::i;5972:644::-;6253:16;6271:14;6297:12;6312:40;6331:7;6340:5;6347:4;6312:18;:40::i;:::-;6297:55;;6362:10;6375;:33;;6399:9;6375:33;;;-1:-1:-1;;6375:33:1;6418:74;;;-1:-1:-1;;;6418:74:1;;6440:10;6418:74;;;;6460:4;6418:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6362:46;;-1:-1:-1;;;;;;6418:21:1;;;;;:74;;;;;-1:-1:-1;;6418:74:1;;;;;;;;-1:-1:-1;6418:21:1;:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6529:80;6548:5;6555:9;6566:14;6582:12;6596:2;6600:8;6529:18;:80::i;:::-;6502:107;;;;-1:-1:-1;5972:644:1;-1:-1:-1;;;;;;;;;;;;;5972:644:1:o;2145:711::-;2424:12;2438;2452:14;2405:8;480:15;468:8;:27;;460:58;;;;;-1:-1:-1;;;460:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;460:58:1;;;;;;;;;;;;;;;2499:85:::1;2513:6;2521;2529:14;2545;2561:10;2573;2499:13;:85::i;:::-;2478:106:::0;;-1:-1:-1;2478:106:1;-1:-1:-1;2594:12:1::1;2609:43;2628:7;2637:6:::0;2645;2609:18:::1;:43::i;:::-;2594:58;;2662:66;2694:6;2702:10;2714:4;2720:7;2662:31;:66::i;:::-;2738;2770:6;2778:10;2790:4;2796:7;2738:31;:66::i;:::-;2835:4;-1:-1:-1::0;;;;;2826:19:1::1;;2846:2;2826:23;;;;;;;;;;;;;-1:-1:-1::0;;;;;2826:23:1::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;2826:23:1;2145:711;;;;-1:-1:-1;2826:23:1;;-1:-1:-1;2145:711:1;;-1:-1:-1;;;;;;;;;2145:711:1:o;2861:939::-;3107:16;3125:14;3141;3088:8;480:15;468:8;:27;;460:58;;;;;-1:-1:-1;;;460:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;460:58:1;;;;;;;;;;;;;;;3194:169:::1;3221:5;3240:4;3258:18;3290:9;3313:14;3341:12;3194:13;:169::i;:::-;3167:196:::0;;-1:-1:-1;3167:196:1;-1:-1:-1;3373:12:1::1;3388:40;3407:7;3416:5:::0;3423:4:::1;3388:18;:40::i;:::-;3373:55;;3438:69;3470:5;3477:10;3489:4;3495:11;3438:31;:69::i;:::-;3523:4;-1:-1:-1::0;;;;;3517:19:1::1;;3544:9;3517:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;3579:4;-1:-1:-1::0;;;;;3573:20:1::1;;3594:4;3600:9;3573:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;3573:37:1::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;3573:37:1;3566:45:::1;;;;3642:4;-1:-1:-1::0;;;;;3633:19:1::1;;3653:2;3633:23;;;;;;;;;;;;;-1:-1:-1::0;;;;;3633:23:1::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;3633:23:1;;-1:-1:-1;3705:9:1::1;:21:::0;-1:-1:-1;3701:92:1::1;;;3728:65;3759:10;3783:9;3771;:21;3728:30;:65::i;:::-;528:1;2861:939:::0;;;;;;;;;;;:::o;12341:770::-;12548:21;12521:8;480:15;468:8;:27;;460:58;;;;;-1:-1:-1;;;460:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;460:58:1;;;;;;;;;;;;;;;12604:4:::1;-1:-1:-1::0;;;;;12593:15:1::1;:4;;12598:1;12593:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;12593:7:1::1;-1:-1:-1::0;;;;;12593:15:1::1;;12585:51;;;::::0;;-1:-1:-1;;;12585:51:1;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;12585:51:1;;;;;;;;;;;;;::::1;;12656:49;12680:7;12689:9;12700:4;;12656:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;12656:23:1::1;::::0;-1:-1:-1;;;12656:49:1:i:1;:::-;12646:59;;12737:9;12723:7;12731:1;12723:10;;;;;;;;;;;;;;:23;;12715:69;;;;-1:-1:-1::0;;;12715:69:1::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12800:4;-1:-1:-1::0;;;;;12794:19:1::1;;12821:7;12829:1;12821:10;;;;;;;;;;;;;;12794:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;12857:4;-1:-1:-1::0;;;;;12851:20:1::1;;12872:45;12891:7;12900:4;;12905:1;12900:7;;;;;;12872:45;12919:7;12927:1;12919:10;;;;;;;;;;;;;;12851:79;;;;;;;;;;;;;-1:-1:-1::0;;;;;12851:79:1::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;12851:79:1;12844:87:::1;;;;12941:24;12947:7;12956:4;;12941:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;12962:2:1;;-1:-1:-1;12941:5:1::1;::::0;-1:-1:-1;;12941:24:1:i:1;:::-;13026:7;13034:1;13026:10;;;;;;;;;;;;;;13014:9;:22;13010:94;;;13038:66;13069:10;13093:7;13101:1;13093:10;;;;;;;;;;;;;;13081:9;:22;13038:30;:66::i;563:357:12:-:0;756:45;;;-1:-1:-1;;;;;756:45:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;756:45:12;-1:-1:-1;;;756:45:12;;;745:57;;;;710:12;;724:17;;745:10;;;;756:45;745:57;;;756:45;745:57;;756:45;745:57;;;;;;;;;;-1:-1:-1;;745:57:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;709:93;;;;820:7;:57;;;;-1:-1:-1;832:11:12;;:16;;:44;;;863:4;852:24;;;;;;;;;;;;;;;-1:-1:-1;852:24:12;832:44;812:101;;;;;-1:-1:-1;;;812:101:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;563:357;;;;;:::o;1330:192::-;1437:12;;;1399;1437;;;;;;;;;-1:-1:-1;;;;;1416:7:12;;;1430:5;;1416:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1416:34:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1398:52;;;1468:7;1460:55;;;;-1:-1:-1;;;1460:55:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1330:192;;;:::o;2139:500:0:-;2232:14;2277:1;2266:8;:12;2258:62;;;;-1:-1:-1;;;2258:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2350:1;2338:9;:13;:31;;;;;2368:1;2355:10;:14;2338:31;2330:78;;;;-1:-1:-1;;;2330:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2418:20;2441:18;:8;2454:4;2441:12;:18::i;:::-;2418:41;-1:-1:-1;2469:14:0;2486:31;2418:41;2506:10;2486:19;:31::i;:::-;2469:48;-1:-1:-1;2527:16:0;2546:41;2571:15;2546:20;:9;2560:5;2546:13;:20::i;:::-;:24;;:41::i;:::-;2527:60;;2621:11;2609:9;:23;;;;;;;2139:500;-1:-1:-1;;;;;;;2139:500:0:o;3292:497::-;3393:21;3449:1;3434:4;:11;:16;;3426:53;;;;;-1:-1:-1;;;3426:53:0;;;;;;;;;;;;-1:-1:-1;;;3426:53:0;;;;;;;;;;;;;;;3510:4;:11;3499:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3499:23:0;;3489:33;;3545:8;3532:7;3540:1;3532:10;;;;;;;;;;;;;:21;;;;;3568:6;3563:220;3594:1;3580:4;:11;:15;3576:1;:19;3563:220;;;3617:14;3633:15;3652:42;3664:7;3673:4;3678:1;3673:7;;;;;;;;;;;;;;3682:4;3687:1;3691;3687:5;3682:11;;;;;;;;;;;;;;3652;:42::i;:::-;3616:78;;;;3725:47;3738:7;3746:1;3738:10;;;;;;;;;;;;;;3750:9;3761:10;3725:12;:47::i;:::-;3708:7;3716:1;3720;3716:5;3708:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;3597:3:0;;3563:220;;;;3292:497;;;;;:::o;699:470::-;788:12;813:14;829;847:26;858:6;866;847:10;:26::i;:::-;1007:32;;;-1:-1:-1;;1007:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;997:43;;;;;;-1:-1:-1;;;;;;913:246:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;903:257;;;;;;;;;699:470;-1:-1:-1;;;;;699:470:0:o;926:398:12:-;1149:51;;;-1:-1:-1;;;;;1149:51:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1149:51:12;-1:-1:-1;;;1149:51:12;;;1138:63;;;;1103:12;;1117:17;;1138:10;;;;1149:51;1138:63;;;1149:51;1138:63;;1149:51;1138:63;;;;;;;;;;-1:-1:-1;;1138:63:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1102:99;;;;1219:7;:57;;;;-1:-1:-1;1231:11:12;;:16;;:44;;;1262:4;1251:24;;;;;;;;;;;;;;;-1:-1:-1;1251:24:12;1231:44;1211:106;;;;-1:-1:-1;;;1211:106:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;926:398;;;;;;:::o;8182:700:1:-;8288:6;8283:593;8314:1;8300:4;:11;:15;8296:1;:19;8283:593;;;8337:13;8352:14;8371:4;8376:1;8371:7;;;;;;;;;;;;;;8380:4;8385:1;8389;8385:5;8380:11;;;;;;;;;;;;;;8336:56;;;;8407:14;8426:36;8448:5;8455:6;8426:21;:36::i;:::-;8406:56;;;8476:14;8493:7;8501:1;8505;8501:5;8493:14;;;;;;;;;;;;;;8476:31;;8522:15;8539;8567:6;-1:-1:-1;;;;;8558:15:1;:5;-1:-1:-1;;;;;8558:15:1;;:61;;8600:9;8616:1;8558:61;;;8582:1;8586:9;8558:61;8521:98;;;;8633:10;8664:1;8650:4;:11;:15;8646:1;:19;:76;;8719:3;8646:76;;;8668:48;8687:7;8696:6;8704:4;8709:1;8713;8709:5;8704:11;;;;;;;;;;;;;;8668:18;:48::i;:::-;8633:89;;8745:42;8764:7;8773:5;8780:6;8745:18;:42::i;:::-;-1:-1:-1;;;;;8736:57:1;;8811:10;8823;8835:2;8849:1;8839:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8839:12:1;;8736:129;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8736:129:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8317:3:1;;;;;-1:-1:-1;8283:593:1;;-1:-1:-1;;;;;;;;8283:593:1;;;8182:700;;;:::o;3867:518:0:-;3968:21;4024:1;4009:4;:11;:16;;4001:53;;;;;-1:-1:-1;;;4001:53:0;;;;;;;;;;;;-1:-1:-1;;;4001:53:0;;;;;;;;;;;;;;;4085:4;:11;4074:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4074:23:0;;4064:33;;4137:9;4107:7;4132:1;4115:7;:14;:18;4107:27;;;;;;;;;;;;;;;;;:39;4170:11;;-1:-1:-1;;4170:15:0;4156:223;4187:5;;4156:223;;4214:14;4230:15;4249:42;4261:7;4270:4;4279:1;4275;:5;4270:11;;;;;;;;;;;;;;4283:4;4288:1;4283:7;;;;;;;4249:42;4213:78;;;;4322:46;4334:7;4342:1;4334:10;;;;;;;;;;;;;;4346:9;4357:10;4322:11;:46::i;:::-;4305:7;4317:1;4313;:5;4305:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;4194:3:0;4156:223;;13254:1168:1;13366:6;13361:1055;13392:1;13378:4;:11;:15;13374:1;:19;13361:1055;;;13415:13;13430:14;13449:4;13454:1;13449:7;;;;;;;;;;;;;;13458:4;13463:1;13467;13463:5;13458:11;;;;;;;;;;;;;;13414:56;;;;13485:14;13504:36;13526:5;13533:6;13504:21;:36::i;:::-;13484:56;;;13554:13;13579:42;13598:7;13607:5;13614:6;13579:18;:42::i;:::-;13554:68;;13636:16;13666:17;13752:13;13767;13785:4;-1:-1:-1;;;;;13785:16:1;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13785:18:1;;;;;;;-1:-1:-1;;;;;13751:52:1;;;;-1:-1:-1;13751:52:1;;-1:-1:-1;13818:17:1;;-1:-1:-1;;;;;13859:15:1;;;;;;;:61;;13901:8;13911;13859:61;;;13878:8;13888;13859:61;13817:103;;;;13948:63;13998:12;13962:5;-1:-1:-1;;;;;13948:30:1;;13987:4;13948:45;;;;;;;;;;;;;-1:-1:-1;;;;;13948:45:1;;;;;;;;;;;;;;;;;;;;;;;;;;:63;13934:77;;14040:65;14064:11;14077:12;14091:13;14040:23;:65::i;:::-;14025:80;;13361:1055;;;;14134:15;14151;14179:6;-1:-1:-1;;;;;14170:15:1;:5;-1:-1:-1;;;;;14170:15:1;;:67;;14215:12;14234:1;14170:67;;;14194:1;14198:12;14170:67;14133:104;;;;14251:10;14282:1;14268:4;:11;:15;14264:1;:19;:76;;14337:3;14264:76;;;14286:48;14305:7;14314:6;14322:4;14327:1;14331;14327:5;14322:11;;;;;;;14286:48;14392:12;;;14402:1;14392:12;;;;;;;;;;-1:-1:-1;;;14354:51:1;;;;;;;;;;;;;;-1:-1:-1;;;;;14354:51:1;;;;;;;;;;;;;;;;;;;;;;14251:89;;-1:-1:-1;14354:9:1;;;;;;14364:10;;14376;;14251:89;;14392:12;;14354:51;;;;;;;;14392:12;;14354:51;;;;14392:12;;14354:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13395:3:1;;;;;-1:-1:-1;13361:1055:1;;-1:-1:-1;;;;;;;;;;13361:1055:1;331:127:11;414:5;;;409:16;;;;401:50;;;;;-1:-1:-1;;;401:50:11;;;;;;;;;;;;-1:-1:-1;;;401:50:11;;;;;;;;;;;;;;2757:456:0;2850:13;2895:1;2883:9;:13;2875:64;;;;-1:-1:-1;;;2875:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2969:1;2957:9;:13;:31;;;;;2987:1;2974:10;:14;2957:31;2949:78;;;;-1:-1:-1;;;2949:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3037:14;3054:35;3083:5;3054:24;:9;3068;3054:13;:24::i;:::-;:28;;:35::i;:::-;3037:52;-1:-1:-1;3099:16:0;3118:35;3148:4;3118:25;:10;3133:9;3118:14;:25::i;:35::-;3099:54;;3174:32;3204:1;3187:11;3175:9;:23;;;;;;;3174:29;:32::i;:::-;3163:43;2757:456;-1:-1:-1;;;;;;2757:456:0:o;1715:305::-;1797:12;1839:1;1829:7;:11;1821:55;;;;;-1:-1:-1;;;1821:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1905:1;1894:8;:12;:28;;;;;1921:1;1910:8;:12;1894:28;1886:75;;;;-1:-1:-1;;;1886:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2005:8;1981:21;:7;1993:8;1981:11;:21::i;:::-;:32;;;;;;;1715:305;-1:-1:-1;;;;1715:305:0:o;277:333::-;352:14;368;412:6;-1:-1:-1;;;;;402:16:0;:6;-1:-1:-1;;;;;402:16:0;;;394:60;;;;;-1:-1:-1;;;394:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;492:6;-1:-1:-1;;;;;483:15:0;:6;-1:-1:-1;;;;;483:15:0;;:53;;521:6;529;483:53;;;502:6;510;483:53;464:72;;-1:-1:-1;464:72:0;-1:-1:-1;;;;;;554:20:0;;546:57;;;;;-1:-1:-1;;;546:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;277:333;;;;;:::o;819:1321:1:-;1030:12;1044;1179:1;-1:-1:-1;;;;;1123:58:1;1135:7;-1:-1:-1;;;;;1123:28:1;;1152:6;1160;1123:44;;;;;;;;;;;;;-1:-1:-1;;;;;1123:44:1;;;;;;-1:-1:-1;;;;;1123:44:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1123:44:1;-1:-1:-1;;;;;1123:58:1;;1119:136;;;1209:7;-1:-1:-1;;;;;1197:31:1;;1229:6;1237;1197:47;;;;;;;;;;;;;-1:-1:-1;;;;;1197:47:1;;;;;;-1:-1:-1;;;;;1197:47:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1119:136:1;1265:13;1280;1297:47;1320:7;1329:6;1337;1297:22;:47::i;:::-;1264:80;;;;1358:8;1370:1;1358:13;:30;;;;-1:-1:-1;1375:13:1;;1358:30;1354:780;;;1426:14;;-1:-1:-1;1442:14:1;;-1:-1:-1;1354:780:1;;;1488:19;1510:52;1527:14;1543:8;1553;1510:16;:52::i;:::-;1488:74;;1598:14;1580;:32;1576:548;;1658:10;1640:14;:28;;1632:73;;;;;-1:-1:-1;;;1632:73:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1745:14;;-1:-1:-1;1761:14:1;-1:-1:-1;1761:14:1;1576:548;;;1815:19;1837:52;1854:14;1870:8;1880;1837:16;:52::i;:::-;1815:74;;1932:14;1914;:32;;1907:40;;;;1991:10;1973:14;:28;;1965:73;;;;;-1:-1:-1;;;1965:73:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2078:14;-1:-1:-1;2094:14:1;;-1:-1:-1;1576:548:1;1354:780;;819:1321;;;;;;;;;;;:::o;464:140:11:-;516:6;542;;;:30;;-1:-1:-1;;557:5:11;;;571:1;566;557:5;566:1;552:15;;;;;:20;542:30;534:63;;;;;-1:-1:-1;;;534:63:11;;;;;;;;;;;;-1:-1:-1;;;534:63:11;;;;;;;;;;;;;;199:126;282:5;;;277:16;;;;269:49;;;;;-1:-1:-1;;;269:49:11;;;;;;;;;;;;-1:-1:-1;;;269:49:11;;;;;;;;;;;;;;1224:381:0;1317:13;1332;1358:14;1377:26;1388:6;1396;1377:10;:26::i;:::-;1357:46;;;1414:13;1429;1456:32;1464:7;1473:6;1481;1456:7;:32::i;:::-;-1:-1:-1;;;;;1447:54:0;;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1447:56:0;;;;;;;-1:-1:-1;;;;;1413:90:0;;;;-1:-1:-1;1413:90:0;;-1:-1:-1;;;;;;1536:16:0;;;;;;;:62;;1579:8;1589;1536:62;;;1556:8;1566;1536:62;1513:85;;;;-1:-1:-1;1224:381:0;-1:-1:-1;;;;;;;1224:381:0:o

Swarm Source

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