Contract 0x94930a328162957ff1dd48900af67b5439336cbd 2

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xf8fc7aa289e2225146336c4372af705fccb98171226647df8dcc44d12eddda1fSwap Exact ETH F...202673912021-10-16 4:59:253 mins ago0x07167349938739d64d87a3d78ca98ff70b6d25b9 IN  0x94930a328162957ff1dd48900af67b5439336cbd22.5 MATIC0.003932712
0xea8832e9212b97c917909307acc1e002dd6ddf720865e7c5cb4da899f928bb21Swap Exact Token...202673442021-10-16 4:56:176 mins ago0x0e583969d9e782a0e739f340e176043f5653add1 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.0031218
0xc5a2cffe2dd007e352a830b386c3a85ade9d52be046f13b4c440caecd2d764f8Swap Exact Token...202673292021-10-16 4:55:177 mins ago0x03eb919de3416896fd6d66748f256a3fa8184f77 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.00388194
0x3ba199f13847d5aacbcd216371e9fce5d9e091a6bfd2101185c24230ec8d0358Swap Exact Token...202673092021-10-16 4:54:298 mins ago0x03eb919de3416896fd6d66748f256a3fa8184f77 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.00426651
0xad5e1b8d59327176cd1af78e245f7f86652daea472929cfac61c87b33b34962bRemove Liquidity...202672752021-10-16 4:53:219 mins ago0x03eb919de3416896fd6d66748f256a3fa8184f77 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.00700416
0x8003ba981ac55dddc39f4d6023fd2f8d52b6220885485bd73953c8740542431bSwap Exact Token...202672642021-10-16 4:52:599 mins ago0xa2ed727bdca0a3fa2ddc0aa40bfe751b6414ed8f IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.00603054
0x07465c4ded7a5d1b5f6e422c1c89563af97ef634a9d36242cc1caf975c487ec7Swap Exact Token...202672612021-10-16 4:52:499 mins ago0x150afc19f3592521f969fe33f620203253e441f5 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.00358911
0x257c8caa22dd3ca7c6b13c3e2fab693b153ce1dab5e0b15217a2743971e980e5Swap Exact Token...202672002021-10-16 4:50:4711 mins ago0x1db23744ad02d25c153750d68e58f2c01a6fa691 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.0031218
0x7388f731a1485eab3c54f26bec88f71288251e218e07f86a1fdc65b77d539dc2Swap Exact Token...202671852021-10-16 4:50:1312 mins ago0xffe6212baf6c88850dcd6511cd32be11c50d3a61 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.007404045
0x66717734ef3b8b1ebb140e5b4d66190f6868fc3dfb75b20593961e95d334149dSwap Exact Token...202670752021-10-16 4:46:2916 mins ago0x6e6d6b2b24313a66021cbf3588dbb79da8a76a7f IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.00071475
0xdb1977788714bf963b93ebf8e2834ff61befdb03efe5b94afe220e18adb12904Swap Exact Token...202670752021-10-16 4:46:2916 mins ago0x6e6d6b2b24313a66021cbf3588dbb79da8a76a7f IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.000929175
0xbbe8d8443cb5ab62b31cf21a681ad0b15bbdc6416ae7efc7d3a79311ef2facffSwap Exact Token...202670752021-10-16 4:46:2916 mins ago0x6e6d6b2b24313a66021cbf3588dbb79da8a76a7f IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.00071475
0x9bc8d32a3b521287c205bcf61843c63f73a7e684726bb7f77244b39c01cebdb9Swap Exact Token...202670722021-10-16 4:46:2316 mins ago0x150afc19f3592521f969fe33f620203253e441f5 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.005752758
0x61ced33faee9ec3d1425704e70f28def3f292dccd91ccbdad8bc1814f0621780Remove Liquidity...202670712021-10-16 4:46:1716 mins ago0x40e388b0e3aa56577c0820f33d4cf62223898bbc IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.00597987
0xe41ade1f4faa112ef51896e89d774b8b52b3fcf4386d961b09e589cf88d2ee48Swap Exact Token...202670592021-10-16 4:45:5316 mins ago0x150afc19f3592521f969fe33f620203253e441f5 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.00495327
0x61f46b87120e529993faa7069da67f571c48d51a3db646e4bcc0034df6ed20ecSwap Exact Token...202669972021-10-16 4:43:2519 mins ago0x20a1e36cb8e1e15aa1f75477e2e8816c0b393ae0 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.0031218
0x78b9641ad0da2679a4b549f4e6c9ac20259abf30a7d9cd238f8b41868b46beafSwap Exact Token...202669962021-10-16 4:43:2119 mins ago0x005c7aa4001747cd4bf25c777318a13191a182ac IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.00307023
0x84ec3e88853449a4aab1581858416f5171837ef93d3448a79402a2aa069e1affSwap Exact Token...202669612021-10-16 4:41:0121 mins ago0x29fb459cffda707ef61d51f4bca2691cb54b9fbc IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.006530305
0x3f02814ee6f4bc8ecdbfb1f7682426648f9d5bf42ff3e4f37baf150ad4675bdaSwap Exact Token...202669372021-10-16 4:39:3323 mins ago0x40e388b0e3aa56577c0820f33d4cf62223898bbc IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.00308187
0x91cc99fc072f4781be81859b798e4d012b3704cce216d56cd06c8ff745183c00Swap Exact Token...202669302021-10-16 4:39:1923 mins ago0x13cd6a1dd3baa5faa8c8c77e790e93cb92b3b655 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.031218
0x4c598a795a09347fc7d5c36c4cdd85ba13407ce384456931c5e617c6025b6d82Remove Liquidity202669092021-10-16 4:38:3723 mins ago0x40e388b0e3aa56577c0820f33d4cf62223898bbc IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.00458667
0xb5fa4d8b2dfca24226109ca98855598af7e9be52d5edb413b86342eb455b8defSwap Exact Token...202668302021-10-16 4:35:5526 mins ago0x2ade677311e55ae2a8b5a36cb56fa5120c19ae4d IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.00787143
0xf7980956d5d911b6fc1b27bd10992201ac666ff75d0c6e18cf7cb5901490baf9Remove Liquidity...202668222021-10-16 4:35:3926 mins ago0xe5763188efc1327f2df6a7dc87adb0d422405839 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.00642484
0xd8cf28ef6b8b7741dc6d6891dbdcb5489995dc3c0452aabf0683f1c656d3f52bSwap Exact Token...202667932021-10-16 4:34:3727 mins ago0xf6a636cea1edc82c8ea18fe02ce3932fec092897 IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.00388194
0x186aea127c9b267d8f936acc1d7ea82c505feb116a3a5f8401dcbc463c9b3639Swap Exact Token...202667642021-10-16 4:33:3928 mins ago0x2ade677311e55ae2a8b5a36cb56fa5120c19ae4d IN  0x94930a328162957ff1dd48900af67b5439336cbd0 MATIC0.00439482
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x8511e1ccf9e50fc589003010381da971e529973a79337fa032c3f3c4ec3ede7c202674192021-10-16 5:00:252 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0x02a2a70ea280d7ba003bebce91a25b28a29c95c90.001837378938879012 MATIC
0x8511e1ccf9e50fc589003010381da971e529973a79337fa032c3f3c4ec3ede7c202674192021-10-16 5:00:252 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd0.001837378938879012 MATIC
0x8511e1ccf9e50fc589003010381da971e529973a79337fa032c3f3c4ec3ede7c202674192021-10-16 5:00:252 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0x02a2a70ea280d7ba003bebce91a25b28a29c95c90.00048937306416416 MATIC
0x8511e1ccf9e50fc589003010381da971e529973a79337fa032c3f3c4ec3ede7c202674192021-10-16 5:00:252 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd0.00048937306416416 MATIC
0xf8fc7aa289e2225146336c4372af705fccb98171226647df8dcc44d12eddda1f202673912021-10-16 4:59:253 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd Polygon: WMATIC Token22.5 MATIC
0xea8832e9212b97c917909307acc1e002dd6ddf720865e7c5cb4da899f928bb21202673442021-10-16 4:56:176 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0x0e583969d9e782a0e739f340e176043f5653add10.500494954117683041 MATIC
0xea8832e9212b97c917909307acc1e002dd6ddf720865e7c5cb4da899f928bb21202673442021-10-16 4:56:176 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd0.500494954117683041 MATIC
0xc5a2cffe2dd007e352a830b386c3a85ade9d52be046f13b4c440caecd2d764f8202673292021-10-16 4:55:177 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0x03eb919de3416896fd6d66748f256a3fa8184f7720.904960399638988621 MATIC
0xc5a2cffe2dd007e352a830b386c3a85ade9d52be046f13b4c440caecd2d764f8202673292021-10-16 4:55:177 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd20.904960399638988621 MATIC
0x3ba199f13847d5aacbcd216371e9fce5d9e091a6bfd2101185c24230ec8d0358202673092021-10-16 4:54:298 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0x03eb919de3416896fd6d66748f256a3fa8184f771.952386394322631822 MATIC
0x3ba199f13847d5aacbcd216371e9fce5d9e091a6bfd2101185c24230ec8d0358202673092021-10-16 4:54:298 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd1.952386394322631822 MATIC
0xad5e1b8d59327176cd1af78e245f7f86652daea472929cfac61c87b33b34962b202672752021-10-16 4:53:219 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0x03eb919de3416896fd6d66748f256a3fa8184f7720.325428951121084741 MATIC
0xad5e1b8d59327176cd1af78e245f7f86652daea472929cfac61c87b33b34962b202672752021-10-16 4:53:219 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd20.325428951121084741 MATIC
0x257c8caa22dd3ca7c6b13c3e2fab693b153ce1dab5e0b15217a2743971e980e5202672002021-10-16 4:50:4711 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0x1db23744ad02d25c153750d68e58f2c01a6fa6916.350726167021243098 MATIC
0x257c8caa22dd3ca7c6b13c3e2fab693b153ce1dab5e0b15217a2743971e980e5202672002021-10-16 4:50:4711 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd6.350726167021243098 MATIC
0x61ced33faee9ec3d1425704e70f28def3f292dccd91ccbdad8bc1814f0621780202670712021-10-16 4:46:1716 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0x40e388b0e3aa56577c0820f33d4cf62223898bbc13.322295975467829158 MATIC
0x61ced33faee9ec3d1425704e70f28def3f292dccd91ccbdad8bc1814f0621780202670712021-10-16 4:46:1716 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd13.322295975467829158 MATIC
0x61f46b87120e529993faa7069da67f571c48d51a3db646e4bcc0034df6ed20ec202669972021-10-16 4:43:2519 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0x20a1e36cb8e1e15aa1f75477e2e8816c0b393ae01.181793024320297443 MATIC
0x61f46b87120e529993faa7069da67f571c48d51a3db646e4bcc0034df6ed20ec202669972021-10-16 4:43:2519 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd1.181793024320297443 MATIC
0x91cc99fc072f4781be81859b798e4d012b3704cce216d56cd06c8ff745183c00202669302021-10-16 4:39:1923 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0x13cd6a1dd3baa5faa8c8c77e790e93cb92b3b65514.060810781245107752 MATIC
0x91cc99fc072f4781be81859b798e4d012b3704cce216d56cd06c8ff745183c00202669302021-10-16 4:39:1923 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd14.060810781245107752 MATIC
0xf7980956d5d911b6fc1b27bd10992201ac666ff75d0c6e18cf7cb5901490baf9202668222021-10-16 4:35:3926 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0xe5763188efc1327f2df6a7dc87adb0d422405839181.835138970839061112 MATIC
0xf7980956d5d911b6fc1b27bd10992201ac666ff75d0c6e18cf7cb5901490baf9202668222021-10-16 4:35:3926 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd181.835138970839061112 MATIC
0xd8cf28ef6b8b7741dc6d6891dbdcb5489995dc3c0452aabf0683f1c656d3f52b202667932021-10-16 4:34:3727 mins ago 0x94930a328162957ff1dd48900af67b5439336cbd0xf6a636cea1edc82c8ea18fe02ce3932fec09289748.433848784762432411 MATIC
0xd8cf28ef6b8b7741dc6d6891dbdcb5489995dc3c0452aabf0683f1c656d3f52b202667932021-10-16 4:34:3727 mins ago Polygon: WMATIC Token 0x94930a328162957ff1dd48900af67b5439336cbd48.433848784762432411 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.