FTM Price: $0.571759 (-1.68%)
Gas: 9 GWei
 

Sponsored

Transaction Hash
Method
Block
From
To
Value
Add Liquidity835935522024-06-24 2:10:4641 mins ago1719195046IN
0x33da53f7...Db4AAa470
0 FTM0.003225189.62146872
Swap Exact Token...835935172024-06-24 2:10:0142 mins ago1719195001IN
0x33da53f7...Db4AAa470
0 FTM0.002384969.62146872
Swap Exact Token...835934872024-06-24 2:09:2443 mins ago1719194964IN
0x33da53f7...Db4AAa470
0 FTM0.0024269.61538288
Swap Exact Token...835933352024-06-24 2:05:4846 mins ago1719194748IN
0x33da53f7...Db4AAa470
0 FTM0.002919019.62651827
Add Liquidity835920392024-06-24 1:37:121 hr ago1719193032IN
0x33da53f7...Db4AAa470
0 FTM0.0037458210.66734533
Add Liquidity835917862024-06-24 1:32:391 hr ago1719192759IN
0x33da53f7...Db4AAa470
0 FTM0.0036099410.66734533
Remove Liquidity835903002024-06-24 1:03:031 hr ago1719190983IN
0x33da53f7...Db4AAa470
0 FTM0.001744110.21604005
Remove Liquidity835901282024-06-24 0:59:561 hr ago1719190796IN
0x33da53f7...Db4AAa470
0 FTM0.0019372910.41818429
Remove Liquidity835898862024-06-24 0:56:001 hr ago1719190560IN
0x33da53f7...Db4AAa470
0 FTM0.0020661710.41818429
Remove Liquidity835897862024-06-24 0:54:321 hr ago1719190472IN
0x33da53f7...Db4AAa470
0 FTM0.0025692910.52164824
Remove Liquidity835890712024-06-24 0:40:332 hrs ago1719189633IN
0x33da53f7...Db4AAa470
0 FTM0.0023674710.09204594
Remove Liquidity835860542024-06-23 23:41:073 hrs ago1719186067IN
0x33da53f7...Db4AAa470
0 FTM0.0031969615
Add Liquidity835851172024-06-23 23:23:193 hrs ago1719184999IN
0x33da53f7...Db4AAa470
0 FTM0.0029729510
Add Liquidity835848232024-06-23 23:17:173 hrs ago1719184637IN
0x33da53f7...Db4AAa470
0 FTM0.0039718810
Add Liquidity835847192024-06-23 23:14:583 hrs ago1719184498IN
0x33da53f7...Db4AAa470
0 FTM0.0030910111
Add Liquidity835807122024-06-23 21:55:064 hrs ago1719179706IN
0x33da53f7...Db4AAa470
0 FTM0.0040823914.10002992
Add Liquidity835806712024-06-23 21:54:124 hrs ago1719179652IN
0x33da53f7...Db4AAa470
0 FTM0.0024564112
Add Liquidity835803022024-06-23 21:46:345 hrs ago1719179194IN
0x33da53f7...Db4AAa470
0 FTM0.0044270411.97657782
Remove Liquidity835759312024-06-23 20:32:286 hrs ago1719174748IN
0x33da53f7...Db4AAa470
0 FTM0.001845967
Remove Liquidity835756712024-06-23 20:27:586 hrs ago1719174478IN
0x33da53f7...Db4AAa470
0 FTM0.001955427
Remove Liquidity835754232024-06-23 20:23:446 hrs ago1719174224IN
0x33da53f7...Db4AAa470
0 FTM0.001879327
Remove Liquidity835753542024-06-23 20:22:346 hrs ago1719174154IN
0x33da53f7...Db4AAa470
0 FTM0.001765477
Add Liquidity835752482024-06-23 20:20:386 hrs ago1719174038IN
0x33da53f7...Db4AAa470
0 FTM0.05006027149
Add Liquidity835749892024-06-23 20:16:036 hrs ago1719173763IN
0x33da53f7...Db4AAa470
0 FTM0.002406018.04918622
Add Liquidity835749722024-06-23 20:15:386 hrs ago1719173738IN
0x33da53f7...Db4AAa470
0 FTM0.002735418.04918622
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To Value
835572442024-06-23 14:54:0811 hrs ago1719154448
0x33da53f7...Db4AAa470
67.91174412 FTM
835373532024-06-23 8:26:0018 hrs ago1719131160
0x33da53f7...Db4AAa470
10.52519239 FTM
835373532024-06-23 8:26:0018 hrs ago1719131160
0x33da53f7...Db4AAa470
10.52519239 FTM
835288832024-06-23 5:50:0621 hrs ago1719121806
0x33da53f7...Db4AAa470
2,280 FTM
834938042024-06-22 19:31:4731 hrs ago1719084707
0x33da53f7...Db4AAa470
123.68319567 FTM
834938042024-06-22 19:31:4731 hrs ago1719084707
0x33da53f7...Db4AAa470
123.68319567 FTM
834937782024-06-22 19:31:2031 hrs ago1719084680
0x33da53f7...Db4AAa470
2,939.74178966 FTM
834937782024-06-22 19:31:2031 hrs ago1719084680
0x33da53f7...Db4AAa470
2,939.74178966 FTM
834918352024-06-22 18:52:2532 hrs ago1719082345
0x33da53f7...Db4AAa470
28 FTM
834917872024-06-22 18:51:4332 hrs ago1719082303
0x33da53f7...Db4AAa470
27.02688704 FTM
834917872024-06-22 18:51:4332 hrs ago1719082303
0x33da53f7...Db4AAa470
27.02688704 FTM
834915792024-06-22 18:48:4032 hrs ago1719082120
0x33da53f7...Db4AAa470
36 FTM
834915462024-06-22 18:48:1232 hrs ago1719082092
0x33da53f7...Db4AAa470
25.68214592 FTM
834915462024-06-22 18:48:1232 hrs ago1719082092
0x33da53f7...Db4AAa470
25.68214592 FTM
834914772024-06-22 18:47:1832 hrs ago1719082038
0x33da53f7...Db4AAa470
11.7373035 FTM
834914382024-06-22 18:46:4332 hrs ago1719082003
0x33da53f7...Db4AAa470
16.91808495 FTM
834914382024-06-22 18:46:4332 hrs ago1719082003
0x33da53f7...Db4AAa470
16.91808495 FTM
834913792024-06-22 18:45:5332 hrs ago1719081953
0x33da53f7...Db4AAa470
45 FTM
834822972024-06-22 15:52:1535 hrs ago1719071535
0x33da53f7...Db4AAa470
500 FTM
834778322024-06-22 14:30:1536 hrs ago1719066615
0x33da53f7...Db4AAa470
500 FTM
834778042024-06-22 14:29:4036 hrs ago1719066580
0x33da53f7...Db4AAa470
300 FTM
834762382024-06-22 13:56:5736 hrs ago1719064617
0x33da53f7...Db4AAa470
0.08776264 FTM
834762382024-06-22 13:56:5736 hrs ago1719064617
0x33da53f7...Db4AAa470
4.31600569 FTM
834762382024-06-22 13:56:5736 hrs ago1719064617
0x33da53f7...Db4AAa470
4.40376833 FTM
834762382024-06-22 13:56:5736 hrs ago1719064617
0x33da53f7...Db4AAa470
4.40376833 FTM
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SolidlyExtendedRouter03

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at ftmscan.com on 2023-09-18
*/

/**
 *Submitted for verification at gnosisscan.io on 2023-09-17
*/

// SPDX-License-Identifier: Unlicensed
// Solidly Extended - Router Staker
// ftm.guru's extension of Solidly Extended to Stake Liquidity into Gauge, directly.

// Solidly Extended
// ftm.guru's extension of Solidly's periphery (Router)
// https://github.com/andrecronje/solidly/blob/master/contracts/BaseV1-periphery.sol
//
// BaseV1Router02.sol : Supporting Fee-on-transfer Tokens
// https://github.com/ftm1337/solidly-with-FoT/blob/master/contracts/BaseV1-periphery.sol


/**v1.3.17
 *0x2aa07920E4ecb4ea8C801D9DFEce63875623B285
 *Submitted for verification at FtmScan.com on 2023-04-03
*/
/**v1.1.0
 *0x1A05EB736873485655F29a37DEf8a0AA87F5a447
 *Submitted for verification at FtmScan.com on 2022-11-18
*/

/**
 *  EQUALIZER EXCHANGE
 *  The New Liquidity Hub of Fantom chain!
 *  https://equalizer.exchange  (Dapp)
 *  https://discord.gg/MaMhbgHMby   (Community)
 *
 *
 *
 *  Version: 2.0.5
 *  - RouterStaker is a drop-in replacement for Router2
 *  - Stakes all added liquidity directly into the related EqualizerV2 gauge.
 *
 *  Version: 1.3.17
 *	- Add Support for Fee-on-Transfer tokens (Original work Based on "Solidly Extended" by ftm.guru)
 *	- Remove "calculation" of Pair Address and instead use Factory.pairFor
 *
 *
 *  Contributors:
 *   -   Andre Cronje, Solidly.Exchange
 *   -   543#3017 (Sam), ftm.guru & Equalizer.exchange
 *
 *
*/
// File: contracts/interfaces/IRouter.sol


pragma solidity 0.8.9;

interface IRouter {
    function pairFor(
        address tokenA,
        address tokenB,
        bool stable
    ) external view returns (address pair);
}

// File: contracts/interfaces/IWETH.sol


pragma solidity 0.8.9;

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

// File: contracts/interfaces/IPairFactory.sol


pragma solidity 0.8.9;

interface IPairFactory {
    function isPaused() external view returns (bool);
    function allPairsLength() external view returns (uint);
    function isPair(address pair) external view returns (bool);
    function getFee(bool _stable) external view returns(uint256);
    function pairCodeHash() external pure returns (bytes32);
    function getPair(address tokenA, address token, bool stable) external view returns (address);
    function getInitializable() external view returns (address, address, bool);
    function createPair(address tokenA, address tokenB, bool stable) external returns (address pair);
}

// File: contracts/interfaces/IPair.sol


pragma solidity 0.8.9;

interface IPair {
    function metadata() external view returns (uint dec0, uint dec1, uint r0, uint r1, bool st, address t0, address t1);
    function claimFees() external returns (uint, uint);
    function tokens() external returns (address, address);
    function transferFrom(address src, address dst, uint amount) external returns (bool);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function burn(address to) external returns (uint amount0, uint amount1);
    function mint(address to) external returns (uint liquidity);
    function getReserves() external view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast);
    function getAmountOut(uint, address) external view returns (uint);
}

// File: contracts/interfaces/IGaugeEquivalent.sol


pragma solidity 0.8.9;

interface IGaugeEquivalent {
    function deposit(uint256 amount) external;
    function depositFor(address _user, uint256 amount) external;
    function depositAll() external;
    function depositAllFor(address _user) external;
}

// File: contracts/interfaces/IVoter.sol


pragma solidity 0.8.9;

interface IVoter {
    function gauges(address _pool) external view returns (address _gauge);
}

// File: contracts/interfaces/IERC20.sol


pragma solidity 0.8.9;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function transfer(address recipient, uint amount) external returns (bool);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function balanceOf(address) external view returns (uint);
    function transferFrom(address sender, address recipient, uint amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
}

// File: contracts/libraries/Math.sol


pragma solidity 0.8.9;

library Math {
    function max(uint a, uint b) internal pure returns (uint) {
        return a >= b ? a : b;
    }
    function min(uint a, uint b) internal pure returns (uint) {
        return a < b ? a : b;
    }
    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;
        }
    }
    function cbrt(uint256 n) internal pure returns (uint256) { unchecked {
        uint256 x = 0;
        for (uint256 y = 1 << 255; y > 0; y >>= 3) {
            x <<= 1;
            uint256 z = 3 * x * (x + 1) + 1;
            if (n / y >= z) {
                n -= y * z;
                x += 1;
            }
        }
        return x;
    }}
}

// File: contracts/Router.sol


pragma solidity 0.8.9;







// Solidly Extended - Router Staker
// ftm.guru's extension of Solidly Extended to Stake Liquidity into Gauge, directly.
contract SolidlyExtendedRouter03 is IRouter {
    struct Route {
        address from;
        address to;
        bool stable;
    }

    uint internal constant MINIMUM_LIQUIDITY = 10**3;
    address public immutable factory;
    IWETH public immutable weth;
    IVoter public immutable voter;
    bytes32 public immutable pairCodeHash;

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, "Equalizer Router: EXPIRED");
        _;
    }

    constructor(address _factory, address _weth, address _voter) {
        factory = _factory;
        pairCodeHash = IPairFactory(_factory).pairCodeHash();
        weth = IWETH(_weth);
        voter = IVoter(_voter);
    }

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

    function sortTokens(address tokenA, address tokenB) public pure returns (address token0, address token1) {
        require(tokenA != tokenB, "Equalizer Router: IDENTICAL_ADDRESSES");
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), "Equalizer Router: ZERO_ADDRESS");
    }

    /// @dev calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address tokenA, address tokenB, bool stable) public view returns (address pair) {
        /*
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint160(uint256(keccak256(abi.encodePacked(
            hex'ff',
            factory,
            keccak256(abi.encodePacked(token0, token1, stable)),
            pairCodeHash // init code hash
        )))));
        */
        return IPairFactory(factory).getPair(tokenA,tokenB,stable);
    }

    /// @dev given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quoteLiquidity(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, "Equalizer Router: INSUFFICIENT_AMOUNT");
        require(reserveA > 0 && reserveB > 0, "Equalizer Router: INSUFFICIENT_LIQUIDITY");
        amountB = amountA * reserveB / reserveA;
    }

    /// @dev fetches and sorts the reserves for a pair
    function getReserves(address tokenA, address tokenB, bool stable) public view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IPair(pairFor(tokenA, tokenB, stable)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }

    /// @dev performs chained getAmountOut calculations on any number of pairs
    function getAmountOut(uint amountIn, address tokenIn, address tokenOut) public view returns (uint amount, bool stable) {
        address pair = pairFor(tokenIn, tokenOut, true);
        uint amountStable;
        uint amountVolatile;
        if (IPairFactory(factory).isPair(pair)) {
            amountStable = IPair(pair).getAmountOut(amountIn, tokenIn);
        }
        pair = pairFor(tokenIn, tokenOut, false);
        if (IPairFactory(factory).isPair(pair)) {
            amountVolatile = IPair(pair).getAmountOut(amountIn, tokenIn);
        }
        return amountStable > amountVolatile ? (amountStable, true) : (amountVolatile, false);
    }

    /// @dev performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(uint amountIn, Route[] memory routes) public view returns (uint[] memory amounts) {
        require(routes.length >= 1, "Equalizer Router: INVALID_PATH");
        amounts = new uint[](routes.length+1);
        amounts[0] = amountIn;
        for (uint i = 0; i < routes.length; i++) {
            address pair = pairFor(routes[i].from, routes[i].to, routes[i].stable);
            if (IPairFactory(factory).isPair(pair)) {
                amounts[i+1] = IPair(pair).getAmountOut(amounts[i], routes[i].from);
            }
        }
    }

    function isPair(address pair) external view returns (bool) {
        return IPairFactory(factory).isPair(pair);
    }

    function quoteAddLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired
    ) external view returns (uint amountA, uint amountB, uint liquidity) {
        // create the pair if it doesn't exist yet
        address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable);
        (uint reserveA, uint reserveB) = (0,0);
        uint _totalSupply = 0;
        if (_pair != address(0)) {
            _totalSupply = IERC20(_pair).totalSupply();
            (reserveA, reserveB) = getReserves(tokenA, tokenB, stable);
        }
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
            liquidity = Math.sqrt(amountA * amountB) - MINIMUM_LIQUIDITY;
        } else {

            uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                (amountA, amountB) = (amountADesired, amountBOptimal);
                liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB);
            } else {
                uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA);
                (amountA, amountB) = (amountAOptimal, amountBDesired);
                liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB);
            }
        }
    }

    function quoteRemoveLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity
    ) external view returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable);

        if (_pair == address(0)) {
            return (0,0);
        }

        (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable);
        uint _totalSupply = IERC20(_pair).totalSupply();

        amountA = liquidity * reserveA / _totalSupply; // using balances ensures pro-rata distribution
        amountB = liquidity * reserveB / _totalSupply; // using balances ensures pro-rata distribution

    }

    function _addLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal returns (uint amountA, uint amountB) {
        require(amountADesired >= amountAMin, "Equalizer Router: invalid desired amountA");
        require(amountBDesired >= amountBMin, "Equalizer Router: invalid desired amountB");
        // create the pair if it doesn't exist yet
        address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable);
        if (_pair == address(0)) {
            _pair = IPairFactory(factory).createPair(tokenA, tokenB, stable);
        }
        (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, "Equalizer Router: INSUFFICIENT_B_AMOUNT");
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, "Equalizer Router: INSUFFICIENT_A_AMOUNT");
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, stable, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = pairFor(tokenA, tokenB, stable);
        _safeTransferFrom(tokenA, msg.sender, pair, amountA);
        _safeTransferFrom(tokenB, msg.sender, pair, amountB);
        { // sub-scope interactions
            address _gauge = voter.gauges(pair);
            if(_gauge == address(0)) {
                liquidity = IPair(pair).mint(to);
            }
            else {
                liquidity = IPair(pair).mint(address(this));
                if(IERC20(pair).allowance(address(this),_gauge) < liquidity) {
                    IERC20(pair).approve(_gauge,type(uint256).max);
                }
                IGaugeEquivalent(_gauge).depositAllFor(to);
            }
        }
    }

    function addLiquidityETH(
        address token,
        bool stable,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            address(weth),
            stable,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = pairFor(token, address(weth), stable);
        _safeTransferFrom(token, msg.sender, pair, amountToken);
        weth.deposit{value: amountETH}();
        assert(weth.transfer(pair, amountETH));
        { // sub-scope interactions
            address _gauge = voter.gauges(pair);
            if(_gauge == address(0)) {
                liquidity = IPair(pair).mint(to);
            }
            else {
                liquidity = IPair(pair).mint(address(this));
                if(IERC20(pair).allowance(address(this),_gauge) < liquidity) {
                    IERC20(pair).approve(_gauge,type(uint256).max);
                }
                IGaugeEquivalent(_gauge).depositAllFor(to);
            }
        }
        // refund dust eth, if any
        if (msg.value > amountETH) _safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = pairFor(tokenA, tokenB, stable);
        require(IPair(pair).transferFrom(msg.sender, pair, liquidity), "Equalizer Router: transfer failed"); // send liquidity to pair
        (uint amount0, uint amount1) = IPair(pair).burn(to);
        (address token0,) = sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, "Equalizer Router: INSUFFICIENT_A_AMOUNT");
        require(amountB >= amountBMin, "Equalizer Router: INSUFFICIENT_B_AMOUNT");
    }

    function removeLiquidityETH(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            address(weth),
            stable,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        _safeTransfer(token, to, amountToken);
        weth.withdraw(amountETH);
        _safeTransferETH(to, amountETH);
    }

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB) {
        address pair = pairFor(tokenA, tokenB, stable);
        {
            uint value = approveMax ? type(uint).max : liquidity;
            IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        }

        (amountA, amountB) = removeLiquidity(tokenA, tokenB, stable, liquidity, amountAMin, amountBMin, to, deadline);
    }

    function removeLiquidityETHWithPermit(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH) {
        address pair = pairFor(token, address(weth), stable);
        uint value = approveMax ? type(uint).max : liquidity;
        IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** SWAP ****
    /// @dev requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, Route[] memory routes, address _to) internal virtual {
        for (uint i = 0; i < routes.length; i++) {
            (address token0,) = sortTokens(routes[i].from, routes[i].to);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = routes[i].from == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < routes.length - 1 ? pairFor(routes[i+1].from, routes[i+1].to, routes[i+1].stable) : _to;
            IPair(pairFor(routes[i].from, routes[i].to, routes[i].stable)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }

    function swapExactTokensForTokensSimple(
        uint amountIn,
        uint amountOutMin,
        address tokenFrom,
        address tokenTo,
        bool stable,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory amounts) {
        Route[] memory routes = new Route[](1);
        routes[0].from = tokenFrom;
        routes[0].to = tokenTo;
        routes[0].stable = stable;
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, "Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT");
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, to);
    }

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        Route[] calldata routes,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory amounts) {
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, "Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT");
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, to);
    }

    function swapExactETHForTokens(uint amountOutMin, Route[] calldata routes, address to, uint deadline)
    external
    payable
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(routes[0].from == address(weth), "Equalizer Router: INVALID_PATH");
        amounts = getAmountsOut(msg.value, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, "Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT");
        weth.deposit{value: amounts[0]}();
        assert(weth.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]));
        _swap(amounts, routes, to);
    }

    function swapExactTokensForETH(uint amountIn, uint amountOutMin, Route[] calldata routes, address to, uint deadline)
    external
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(routes[routes.length - 1].to == address(weth), "Equalizer Router: INVALID_PATH");
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, "Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT");
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, address(this));
        weth.withdraw(amounts[amounts.length - 1]);
        _safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function UNSAFE_swapExactTokensForTokens(
        uint[] memory amounts,
        Route[] calldata routes,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory) {
        _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]);
        _swap(amounts, routes, to);
        return amounts;
    }

    /***************************************************************************************************************************
     ***************************************************************************************************************************
     ** Experimental Extension [ftm.guru/solidly/BaseV1Router02]
     ***************************************************************************************************************************
     */

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens)****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            address(weth),
            stable,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        _safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
        weth.withdraw(amountETH);
        _safeTransferETH(to, amountETH);
    }
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH) {
        address pair = pairFor(token, address(weth), stable);
        uint value = approveMax ? type(uint).max : liquidity;
        IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETHSupportingFeeOnTransferTokens(
            token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline
        );
    }
    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(Route[] calldata routes, address _to) internal virtual {
        for (uint i; i < routes.length; i++) {
        	(address input, address output) = (routes[i].from, routes[i].to);
            (address token0,) = sortTokens(input, output);
            IPair pair = IPair(pairFor(routes[i].from, routes[i].to, routes[i].stable));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
            (uint reserve0, uint reserve1,) = pair.getReserves();
            (uint reserveInput,) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
            amountInput = IERC20(input).balanceOf(address(pair)) - (reserveInput);
            (amountOutput,) = getAmountOut(amountInput, input, output);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < routes.length - 1 ? pairFor(routes[i+1].from, routes[i+1].to, routes[i+1].stable) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        Route[] calldata routes,
        address to,
        uint deadline
    ) external ensure(deadline) {
        _safeTransferFrom(
        	routes[0].from,
        	msg.sender,
        	pairFor(routes[0].from, routes[0].to, routes[0].stable),
        	amountIn
        );
        uint balanceBefore = IERC20(routes[routes.length - 1].to).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(routes, to);
        require(
            IERC20(routes[routes.length - 1].to).balanceOf(to) - (balanceBefore) >= amountOutMin,
            'Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        Route[] calldata routes,
        address to,
        uint deadline
    )
        external
        payable
        ensure(deadline)
    {
        require(routes[0].from == address(weth), 'Equalizer Router: INVALID_PATH');
        uint amountIn = msg.value;
        weth.deposit{value: amountIn}();
        assert(weth.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn));
        uint balanceBefore = IERC20(routes[routes.length - 1].to).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(routes, to);
        require(
            IERC20(routes[routes.length - 1].to).balanceOf(to) - (balanceBefore) >= amountOutMin,
            'Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        Route[] calldata routes,
        address to,
        uint deadline
    )
        external
        ensure(deadline)
    {
        require(routes[routes.length - 1].to == address(weth), 'Equalizer Router: INVALID_PATH');
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn
        );
        _swapSupportingFeeOnTransferTokens(routes, address(this));
        uint amountOut = IERC20(address(weth)).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT');
        weth.withdraw(amountOut);
        _safeTransferETH(to, amountOut);
    }


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

    function _safeTransfer(address token, address to, uint256 value) internal {
        require(token.code.length > 0, "Equalizer Router: invalid token");
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "Equalizer Router: token transfer failed");
    }

    function _safeTransferFrom(address token, address from, address to, uint256 value) internal {
        require(token.code.length > 0, "Equalizer Router: invalid token");
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "Equalizer Router: token transfer failed");
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_voter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct SolidlyExtendedRouter03.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"UNSAFE_swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"bool","name":"stable","type":"bool"},{"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":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct SolidlyExtendedRouter03.Route[]","name":"routes","type":"tuple[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairCodeHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"}],"name":"quoteAddLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"quoteRemoveLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"bool","name":"stable","type":"bool"},{"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":"bool","name":"stable","type":"bool"},{"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":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"bool","name":"stable","type":"bool"},{"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":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct SolidlyExtendedRouter03.Route[]","name":"routes","type":"tuple[]"},{"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"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct SolidlyExtendedRouter03.Route[]","name":"routes","type":"tuple[]"},{"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"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct SolidlyExtendedRouter03.Route[]","name":"routes","type":"tuple[]"},{"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"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct SolidlyExtendedRouter03.Route[]","name":"routes","type":"tuple[]"},{"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"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct SolidlyExtendedRouter03.Route[]","name":"routes","type":"tuple[]"},{"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":"tokenFrom","type":"address"},{"internalType":"address","name":"tokenTo","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSimple","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct SolidlyExtendedRouter03.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"contract IVoter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101006040523480156200001257600080fd5b50604051620050c7380380620050c78339810160408190526200003591620000ef565b6001600160a01b038316608081905260408051631355724960e31b81529051639aab924891600480820192602092909190829003018186803b1580156200007b57600080fd5b505afa15801562000090573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000b6919062000139565b60e0526001600160a01b0391821660a0521660c0525062000153565b80516001600160a01b0381168114620000ea57600080fd5b919050565b6000806000606084860312156200010557600080fd5b6200011084620000d2565b92506200012060208501620000d2565b91506200013060408501620000d2565b90509250925092565b6000602082840312156200014c57600080fd5b5051919050565b60805160a05160c05160e051614e5a6200026d600039600061050e0152600081816103240152818161127d0152612c0c0152600081816101cb0152818161029801528181610aba01528181610cf901528181610f89015281816118fd01528181611a1001528181611abf01528181611f6c01528181611fea0152818161207f0152818161229d015281816123500152818161240a01528181612a3e01528181612a7401528181612aa901528181612b6201528181612f5301528181612fa30152818161304a01526132f101526000818161058301528181610e0001528181611071015281816115b9015281816116eb015281816125af0152818161274101528181613120015281816138f601526139a60152614e5a6000f3fe6080604052600436106101bb5760003560e01c80637301e3c8116100ec578063b7e0d4c01161008a578063e2d9d4dc11610064578063e2d9d4dc146105c5578063e5e31b13146105e5578063f41766d814610615578063fe411f141461063557600080fd5b8063b7e0d4c01461055e578063c45a015514610571578063d7b0e0a5146105a557600080fd5b80639881fcb4116100c65780639881fcb4146104bc57806398a0fb3c146104dc5780639aab9248146104fc578063a32b1fcd1461053e57600080fd5b80637301e3c81461046957806376c72751146104895780637af728c81461049c57600080fd5b80634c1ee03e116101595780635e1e6325116101335780635e1e6325146103e15780635e60dab51461041657806367ffb66a146104365780636cc1ae131461044957600080fd5b80634c1ee03e14610346578063544caa56146103665780635a47ddc3146103a657600080fd5b80633fc8cef3116101955780633fc8cef3146102865780634386e63c146102d2578063448725b4146102f257806346c96aac1461031257600080fd5b80630dede6c4146101ff57806313dcfc591461023957806318a130861461026657600080fd5b366101fa57336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101f8576101f8614121565b005b600080fd5b34801561020b57600080fd5b5061021f61021a366004614168565b610655565b604080519283526020830191909152015b60405180910390f35b34801561024557600080fd5b506102596102543660046141ed565b61087a565b6040516102309190614268565b34801561027257600080fd5b506102596102813660046142f1565b610a8d565b34801561029257600080fd5b506102ba7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610230565b3480156102de57600080fd5b5061021f6102ed366004614364565b610df9565b3480156102fe57600080fd5b5061021f61030d3660046143c6565b610f7e565b34801561031e57600080fd5b506102ba7f000000000000000000000000000000000000000000000000000000000000000081565b34801561035257600080fd5b506102ba610361366004614470565b611057565b34801561037257600080fd5b506103866103813660046144bb565b611102565b604080516001600160a01b03938416815292909116602083015201610230565b3480156103b257600080fd5b506103c66103c13660046144f4565b6111fa565b60408051938452602084019290925290820152606001610230565b3480156103ed57600080fd5b506104016103fc366004614583565b611581565b60408051928352901515602083015201610230565b34801561042257600080fd5b5061021f610431366004614470565b611811565b6102596104443660046145ba565b6118d8565b34801561045557600080fd5b506101f86104643660046142f1565b611c67565b34801561047557600080fd5b5061025961048436600461468c565b611e73565b6101f86104973660046145ba565b611f49565b3480156104a857600080fd5b506101f86104b73660046142f1565b612272565b3480156104c857600080fd5b506102596104d73660046147ce565b612499565b3480156104e857600080fd5b506103c66104f7366004614874565b612739565b34801561050857600080fd5b506105307f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610230565b34801561054a57600080fd5b5061021f6105593660046148cf565b612957565b6103c661056c36600461498b565b612a12565b34801561057d57600080fd5b506102ba7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b157600080fd5b5061021f6105c036600461498b565b612f29565b3480156105d157600080fd5b5061021f6105e03660046143c6565b61303f565b3480156105f157600080fd5b506106056106003660046149e6565b6130fe565b6040519015158152602001610230565b34801561062157600080fd5b506102596106303660046142f1565b6131a2565b34801561064157600080fd5b5061021f61065036600461498b565b6132c7565b60008082428110156106825760405162461bcd60e51b815260040161067990614a03565b60405180910390fd5b600061068f8c8c8c611057565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd90606401602060405180830381600087803b1580156106e057600080fd5b505af11580156106f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107189190614a3a565b61076e5760405162461bcd60e51b815260206004820152602160248201527f457175616c697a657220526f757465723a207472616e73666572206661696c656044820152601960fa1b6064820152608401610679565b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb44906024016040805180830381600087803b1580156107b557600080fd5b505af11580156107c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ed9190614a57565b9150915060006107fd8f8f611102565b509050806001600160a01b03168f6001600160a01b031614610820578183610823565b82825b90975095508a8710156108485760405162461bcd60e51b815260040161067990614a7b565b898610156108685760405162461bcd60e51b815260040161067990614ac2565b50505050509850989650505050505050565b6060814281101561089d5760405162461bcd60e51b815260040161067990614a03565b604080516001808252818301909252600091816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816108b457905050905087816000815181106108f7576108f7614b09565b6020026020010151600001906001600160a01b031690816001600160a01b031681525050868160008151811061092f5761092f614b09565b6020026020010151602001906001600160a01b031690816001600160a01b031681525050858160008151811061096757610967614b09565b60209081029190910101519015156040909101526109858a82612499565b92508883600185516109979190614b35565b815181106109a7576109a7614b09565b602002602001015110156109cd5760405162461bcd60e51b815260040161067990614b4c565b610a75816000815181106109e3576109e3614b09565b60200260200101516000015133610a5584600081518110610a0657610a06614b09565b60200260200101516000015185600081518110610a2557610a25614b09565b60200260200101516020015186600081518110610a4457610a44614b09565b602002602001015160400151611057565b86600081518110610a6857610a68614b09565b60200260200101516133a4565b610a808382876134f2565b5050979650505050505050565b60608142811015610ab05760405162461bcd60e51b815260040161067990614a03565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610ae7600182614b35565b818110610af657610af6614b09565b9050606002016020016020810190610b0e91906149e6565b6001600160a01b031614610b345760405162461bcd60e51b815260040161067990614b98565b610b90888787808060200260200160405190810160405280939291908181526020016000905b82821015610b8657610b7760608302860136819003810190614bcf565b81526020019060010190610b5a565b5050505050612499565b9150868260018451610ba29190614b35565b81518110610bb257610bb2614b09565b60200260200101511015610bd85760405162461bcd60e51b815260040161067990614b4c565b610c9a86866000818110610bee57610bee614b09565b610c0492602060609092020190810191506149e6565b33610c8789896000818110610c1b57610c1b614b09565b610c3192602060609092020190810191506149e6565b8a8a6000818110610c4457610c44614b09565b9050606002016020016020810190610c5c91906149e6565b8b8b6000818110610c6f57610c6f614b09565b90506060020160400160208101906103619190614beb565b85600081518110610a6857610a68614b09565b610cf7828787808060200260200160405190810160405280939291908181526020016000905b82821015610cec57610cdd60608302860136819003810190614bcf565b81526020019060010190610cc0565b5050505050306134f2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551610d359190614b35565b81518110610d4557610d45614b09565b60200260200101516040518263ffffffff1660e01b8152600401610d6b91815260200190565b602060405180830381600087803b158015610d8557600080fd5b505af1158015610d99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbd9190614c08565b50610dee848360018551610dd19190614b35565b81518110610de157610de1614b09565b6020026020010151613747565b509695505050505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308888886040518463ffffffff1660e01b8152600401610e4e93929190614c21565b60206040518083038186803b158015610e6657600080fd5b505afa158015610e7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9e9190614c45565b90506001600160a01b038116610ebb576000809250925050610f75565b600080610ec9898989611811565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f0857600080fd5b505afa158015610f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f409190614c08565b905080610f4d8489614c62565b610f579190614c81565b955080610f648389614c62565b610f6e9190614c81565b9450505050505b94509492505050565b6000806000610fae8e7f00000000000000000000000000000000000000000000000000000000000000008f611057565b9050600087610fbd578c610fc1565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610ffc903390309086908f908e908e908e90600401614ca3565b600060405180830381600087803b15801561101657600080fd5b505af115801561102a573d6000803e3d6000fd5b5050505061103d8f8f8f8f8f8f8f612f29565b809450819550505050509b509b9950505050505050505050565b6040516306801cc360e41b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636801cc30906110aa90879087908790600401614c21565b60206040518083038186803b1580156110c257600080fd5b505afa1580156110d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fa9190614c45565b949350505050565b600080826001600160a01b0316846001600160a01b031614156111755760405162461bcd60e51b815260206004820152602560248201527f457175616c697a657220526f757465723a204944454e544943414c5f41444452604482015264455353455360d81b6064820152608401610679565b826001600160a01b0316846001600160a01b031610611195578284611198565b83835b90925090506001600160a01b0382166111f35760405162461bcd60e51b815260206004820152601e60248201527f457175616c697a657220526f757465723a205a45524f5f4144445245535300006044820152606401610679565b9250929050565b600080600083428110156112205760405162461bcd60e51b815260040161067990614a03565b61122f8d8d8d8d8d8d8d613815565b909450925060006112418e8e8e611057565b905061124f8e3383886133a4565b61125b8d3383876133a4565b60405163b9a09fd560e01b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063b9a09fd59060240160206040518083038186803b1580156112c157600080fd5b505afa1580156112d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f99190614c45565b90506001600160a01b03811661138b576040516335313c2160e11b81526001600160a01b038981166004830152831690636a62784290602401602060405180830381600087803b15801561134c57600080fd5b505af1158015611360573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113849190614c08565b935061156f565b6040516335313c2160e11b81523060048201526001600160a01b03831690636a62784290602401602060405180830381600087803b1580156113cc57600080fd5b505af11580156113e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114049190614c08565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152919550859184169063dd62ed3e9060440160206040518083038186803b15801561145057600080fd5b505afa158015611464573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114889190614c08565b10156115135760405163095ea7b360e01b81526001600160a01b038281166004830152600019602483015283169063095ea7b390604401602060405180830381600087803b1580156114d957600080fd5b505af11580156114ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115119190614a3a565b505b604051633010d8ef60e01b81526001600160a01b038981166004830152821690633010d8ef90602401600060405180830381600087803b15801561155657600080fd5b505af115801561156a573d6000803e3d6000fd5b505050505b50505099509950999650505050505050565b600080600061159285856001611057565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b139060240160206040518083038186803b1580156115fd57600080fd5b505afa158015611611573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116359190614a3a565b156116bd576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a9060440160206040518083038186803b15801561168257600080fd5b505afa158015611696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ba9190614c08565b91505b6116c987876000611057565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b139060240160206040518083038186803b15801561172f57600080fd5b505afa158015611743573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117679190614a3a565b156117ef576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a9060440160206040518083038186803b1580156117b457600080fd5b505afa1580156117c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ec9190614c08565b90505b8082116117fe57806000611802565b8160015b94509450505050935093915050565b60008060006118208686611102565b509050600080611831888888611057565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561186957600080fd5b505afa15801561187d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a19190614ce4565b5091509150826001600160a01b0316886001600160a01b0316146118c65780826118c9565b81815b90999098509650505050505050565b606081428110156118fb5760405162461bcd60e51b815260040161067990614a03565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061193857611938614b09565b61194e92602060609092020190810191506149e6565b6001600160a01b0316146119745760405162461bcd60e51b815260040161067990614b98565b6119c6348787808060200260200160405190810160405280939291908181526020016000905b82821015610b86576119b760608302860136819003810190614bcf565b8152602001906001019061199a565b91508682600184516119d89190614b35565b815181106119e8576119e8614b09565b60200260200101511015611a0e5760405162461bcd60e51b815260040161067990614b4c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611a5057611a50614b09565b60200260200101516040518263ffffffff1660e01b81526004016020604051808303818588803b158015611a8357600080fd5b505af1158015611a97573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611abc9190614c08565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611b5688886000818110611b0257611b02614b09565b611b1892602060609092020190810191506149e6565b89896000818110611b2b57611b2b614b09565b9050606002016020016020810190611b4391906149e6565b8a8a6000818110610c6f57610c6f614b09565b84600081518110611b6957611b69614b09565b60200260200101516040518363ffffffff1660e01b8152600401611ba29291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b158015611bbc57600080fd5b505af1158015611bd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf49190614a3a565b611c0057611c00614121565b611c5d828787808060200260200160405190810160405280939291908181526020016000905b82821015611c5257611c4360608302860136819003810190614bcf565b81526020019060010190611c26565b5050505050866134f2565b5095945050505050565b8042811015611c885760405162461bcd60e51b815260040161067990614a03565b611cd185856000818110611c9e57611c9e614b09565b611cb492602060609092020190810191506149e6565b33611ccb88886000818110611b0257611b02614b09565b8a6133a4565b60008585611ce0600182614b35565b818110611cef57611cef614b09565b9050606002016020016020810190611d0791906149e6565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a082319060240160206040518083038186803b158015611d4a57600080fd5b505afa158015611d5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d829190614c08565b9050611d8f868686613afb565b86818787611d9e600182614b35565b818110611dad57611dad614b09565b9050606002016020016020810190611dc591906149e6565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b60206040518083038186803b158015611e0957600080fd5b505afa158015611e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e419190614c08565b611e4b9190614b35565b1015611e695760405162461bcd60e51b815260040161067990614b4c565b5050505050505050565b60608142811015611e965760405162461bcd60e51b815260040161067990614a03565b611eec86866000818110611eac57611eac614b09565b611ec292602060609092020190810191506149e6565b33611ed989896000818110610c1b57610c1b614b09565b8a600081518110610a6857610a68614b09565b611f3e878787808060200260200160405190810160405280939291908181526020016000905b82821015611c5257611f2f60608302860136819003810190614bcf565b81526020019060010190611f12565b509495945050505050565b8042811015611f6a5760405162461bcd60e51b815260040161067990614a03565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000818110611fa757611fa7614b09565b611fbd92602060609092020190810191506149e6565b6001600160a01b031614611fe35760405162461bcd60e51b815260040161067990614b98565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016020604051808303818588803b15801561204357600080fd5b505af1158015612057573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061207c9190614c08565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6120c288886000818110611b0257611b02614b09565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b15801561210a57600080fd5b505af115801561211e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121429190614a3a565b61214e5761214e614121565b6000868661215d600182614b35565b81811061216c5761216c614b09565b905060600201602001602081019061218491906149e6565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a082319060240160206040518083038186803b1580156121c757600080fd5b505afa1580156121db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ff9190614c08565b905061220c878787613afb565b8781888861221b600182614b35565b81811061222a5761222a614b09565b905060600201602001602081019061224291906149e6565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a0823190602401611df1565b80428110156122935760405162461bcd60e51b815260040161067990614a03565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685856122ca600182614b35565b8181106122d9576122d9614b09565b90506060020160200160208101906122f191906149e6565b6001600160a01b0316146123175760405162461bcd60e51b815260040161067990614b98565b61232d85856000818110611c9e57611c9e614b09565b612338858530613afb565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561239a57600080fd5b505afa1580156123ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d29190614c08565b9050868110156123f45760405162461bcd60e51b815260040161067990614b4c565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401602060405180830381600087803b15801561245657600080fd5b505af115801561246a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248e9190614c08565b50611e698482613747565b60606001825110156124bd5760405162461bcd60e51b815260040161067990614b98565b81516124ca906001614d12565b67ffffffffffffffff8111156124e2576124e2614621565b60405190808252806020026020018201604052801561250b578160200160208202803683370190505b509050828160008151811061252257612522614b09565b60200260200101818152505060005b825181101561273257600061258d84838151811061255157612551614b09565b60200260200101516000015185848151811061256f5761256f614b09565b602002602001015160200151868581518110610a4457610a44614b09565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b139060240160206040518083038186803b1580156125f357600080fd5b505afa158015612607573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262b9190614a3a565b1561271f57806001600160a01b031663f140a35a84848151811061265157612651614b09565b602002602001015186858151811061266b5761266b614b09565b6020026020010151600001516040518363ffffffff1660e01b81526004016126a69291909182526001600160a01b0316602082015260400190565b60206040518083038186803b1580156126be57600080fd5b505afa1580156126d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f69190614c08565b83612702846001614d12565b8151811061271257612712614b09565b6020026020010181815250505b508061272a81614d2a565b915050612531565b5092915050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b815260040161278f93929190614c21565b60206040518083038186803b1580156127a757600080fd5b505afa1580156127bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127df9190614c45565b9050600080806001600160a01b0384161561287857836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561282d57600080fd5b505afa158015612841573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128659190614c08565b90506128728c8c8c611811565b90935091505b82158015612884575081155b156128b5578896508795506103e86128a461289f888a614c62565b613e73565b6128ae9190614b35565b9450612948565b60006128c28a8585613ee3565b905088811161290a57899750955085612903846128df848b614c62565b6128e99190614c81565b846128f4858b614c62565b6128fe9190614c81565b613fc4565b9550612946565b60006129178a8587613ee3565b98508997508890506129428561292d8584614c62565b6129379190614c81565b856128f4868c614c62565b9650505b505b50505050955095509592505050565b60008060006129678f8f8f611057565b9050600087612976578c61297a565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906129b5903390309086908f908e908e908e90600401614ca3565b600060405180830381600087803b1580156129cf57600080fd5b505af11580156129e3573d6000803e3d6000fd5b50505050506129f88f8f8f8f8f8f8f8f610655565b8093508194505050509c509c9a5050505050505050505050565b60008060008342811015612a385760405162461bcd60e51b815260040161067990614a03565b612a678b7f00000000000000000000000000000000000000000000000000000000000000008c8c348d8d613815565b90945092506000612a998c7f00000000000000000000000000000000000000000000000000000000000000008d611057565b9050612aa78c3383886133a4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016020604051808303818588803b158015612b0257600080fd5b505af1158015612b16573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b3b9190614c08565b5060405163a9059cbb60e01b81526001600160a01b038281166004830152602482018690527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b158015612ba657600080fd5b505af1158015612bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bde9190614a3a565b612bea57612bea614121565b60405163b9a09fd560e01b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063b9a09fd59060240160206040518083038186803b158015612c5057600080fd5b505afa158015612c64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c889190614c45565b90506001600160a01b038116612d1a576040516335313c2160e11b81526001600160a01b038981166004830152831690636a62784290602401602060405180830381600087803b158015612cdb57600080fd5b505af1158015612cef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d139190614c08565b9350612efe565b6040516335313c2160e11b81523060048201526001600160a01b03831690636a62784290602401602060405180830381600087803b158015612d5b57600080fd5b505af1158015612d6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d939190614c08565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152919550859184169063dd62ed3e9060440160206040518083038186803b158015612ddf57600080fd5b505afa158015612df3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e179190614c08565b1015612ea25760405163095ea7b360e01b81526001600160a01b038281166004830152600019602483015283169063095ea7b390604401602060405180830381600087803b158015612e6857600080fd5b505af1158015612e7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea09190614a3a565b505b604051633010d8ef60e01b81526001600160a01b038981166004830152821690633010d8ef90602401600060405180830381600087803b158015612ee557600080fd5b505af1158015612ef9573d6000803e3d6000fd5b505050505b5083341115612f1a57612f1a33612f158634614b35565b613747565b50509750975097945050505050565b6000808242811015612f4d5760405162461bcd60e51b815260040161067990614a03565b612f7d8a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b610655565b9093509150612f8d8a8685613fdc565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401602060405180830381600087803b158015612fef57600080fd5b505af1158015613003573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130279190614c08565b506130328583613747565b5097509795505050505050565b600080600061306f8e7f00000000000000000000000000000000000000000000000000000000000000008f611057565b905060008761307e578c613082565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906130bd903390309086908f908e908e908e90600401614ca3565b600060405180830381600087803b1580156130d757600080fd5b505af11580156130eb573d6000803e3d6000fd5b5050505061103d8f8f8f8f8f8f8f6132c7565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b139060240160206040518083038186803b15801561316457600080fd5b505afa158015613178573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319c9190614a3a565b92915050565b606081428110156131c55760405162461bcd60e51b815260040161067990614a03565b613217888787808060200260200160405190810160405280939291908181526020016000905b82821015610b865761320860608302860136819003810190614bcf565b815260200190600101906131eb565b91508682600184516132299190614b35565b8151811061323957613239614b09565b6020026020010151101561325f5760405162461bcd60e51b815260040161067990614b4c565b61327586866000818110610bee57610bee614b09565b610dee828787808060200260200160405190810160405280939291908181526020016000905b82821015611c52576132b860608302860136819003810190614bcf565b8152602001906001019061329b565b60008082428110156132eb5760405162461bcd60e51b815260040161067990614a03565b61331b8a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b610655565b6040516370a0823160e01b81523060048201529194509250612f8d908b9087906001600160a01b038316906370a082319060240160206040518083038186803b15801561336757600080fd5b505afa15801561337b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339f9190614c08565b613fdc565b6000846001600160a01b03163b116133fe5760405162461bcd60e51b815260206004820152601f60248201527f457175616c697a657220526f757465723a20696e76616c696420746f6b656e006044820152606401610679565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916134629190614d71565b6000604051808303816000865af19150503d806000811461349f576040519150601f19603f3d011682016040523d82523d6000602084013e6134a4565b606091505b50915091508180156134ce5750805115806134ce5750808060200190518101906134ce9190614a3a565b6134ea5760405162461bcd60e51b815260040161067990614d8d565b505050505050565b60005b825181101561374157600061354484838151811061351557613515614b09565b60200260200101516000015185848151811061353357613533614b09565b602002602001015160200151611102565b509050600085613555846001614d12565b8151811061356557613565614b09565b60200260200101519050600080836001600160a01b031687868151811061358e5761358e614b09565b6020026020010151600001516001600160a01b0316146135b0578260006135b4565b6000835b915091506000600188516135c89190614b35565b86106135d45786613647565b613647886135e3886001614d12565b815181106135f3576135f3614b09565b6020026020010151600001518988600161360d9190614d12565b8151811061361d5761361d614b09565b6020026020010151602001518a8960016136379190614d12565b81518110610a4457610a44614b09565b905061369a88878151811061365e5761365e614b09565b60200260200101516000015189888151811061367c5761367c614b09565b6020026020010151602001518a8981518110610a4457610a44614b09565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156136d7576020820181803683370190505b506040518563ffffffff1660e01b81526004016136f79493929190614dd4565b600060405180830381600087803b15801561371157600080fd5b505af1158015613725573d6000803e3d6000fd5b505050505050505050808061373990614d2a565b9150506134f5565b50505050565b604080516000808252602082019092526001600160a01b0384169083906040516137719190614d71565b60006040518083038185875af1925050503d80600081146137ae576040519150601f19603f3d011682016040523d82523d6000602084013e6137b3565b606091505b50509050806138105760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b6064820152608401610679565b505050565b6000808386101561387a5760405162461bcd60e51b815260206004820152602960248201527f457175616c697a657220526f757465723a20696e76616c6964206465736972656044820152686420616d6f756e744160b81b6064820152608401610679565b828510156138dc5760405162461bcd60e51b815260206004820152602960248201527f457175616c697a657220526f757465723a20696e76616c696420646573697265604482015268321030b6b7bab73a2160b91b6064820152608401610679565b6040516306801cc360e41b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636801cc309061392f908d908d908d90600401614c21565b60206040518083038186803b15801561394757600080fd5b505afa15801561395b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061397f9190614c45565b90506001600160a01b038116613a34576040516320b7f73960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906382dfdce4906139df908d908d908d90600401614c21565b602060405180830381600087803b1580156139f957600080fd5b505af1158015613a0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a319190614c45565b90505b600080613a428c8c8c611811565b91509150816000148015613a54575080155b15613a6457889450879350613aec565b6000613a718a8484613ee3565b9050888111613aa55786811015613a9a5760405162461bcd60e51b815260040161067990614ac2565b899550935083613aea565b6000613ab28a8486613ee3565b90508a811115613ac457613ac4614121565b88811015613ae45760405162461bcd60e51b815260040161067990614a7b565b95508894505b505b50505097509795505050505050565b60005b8281101561374157600080858584818110613b1b57613b1b614b09565b613b3192602060609092020190810191506149e6565b868685818110613b4357613b43614b09565b9050606002016020016020810190613b5b91906149e6565b915091506000613b6b8383611102565b5090506000613bd7888887818110613b8557613b85614b09565b613b9b92602060609092020190810191506149e6565b898988818110613bad57613bad614b09565b9050606002016020016020810190613bc591906149e6565b8a8a89818110610c6f57610c6f614b09565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613c1857600080fd5b505afa158015613c2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c509190614ce4565b50915091506000866001600160a01b0316896001600160a01b031614613c77578183613c7a565b82825b506040516370a0823160e01b81526001600160a01b03888116600483015291925082918b16906370a082319060240160206040518083038186803b158015613cc157600080fd5b505afa158015613cd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cf99190614c08565b613d039190614b35565b9450613d10858a8a611581565b5080945050505050600080856001600160a01b0316886001600160a01b031614613d3c57826000613d40565b6000835b90925090506000613d5260018d614b35565b8a10613d5e578a613de3565b613de38d8d613d6e8d6001614d12565b818110613d7d57613d7d614b09565b613d9392602060609092020190810191506149e6565b8e8e613da08e6001614d12565b818110613daf57613daf614b09565b9050606002016020016020810190613dc791906149e6565b8f8f613dd48f6001614d12565b818110610c6f57610c6f614b09565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f90613e259086908690869060248101614dd4565b600060405180830381600087803b158015613e3f57600080fd5b505af1158015613e53573d6000803e3d6000fd5b505050505050505050505050508080613e6b90614d2a565b915050613afe565b60006003821115613ed45750806000613e8d600283614c81565b613e98906001614d12565b90505b81811015613ece57905080600281613eb38186614c81565b613ebd9190614d12565b613ec79190614c81565b9050613e9b565b50919050565b8115613ede575060015b919050565b6000808411613f425760405162461bcd60e51b815260206004820152602560248201527f457175616c697a657220526f757465723a20494e53554646494349454e545f416044820152641353d5539560da1b6064820152608401610679565b600083118015613f525750600082115b613faf5760405162461bcd60e51b815260206004820152602860248201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4c604482015267495155494449545960c01b6064820152608401610679565b82613fba8386614c62565b6110fa9190614c81565b6000818310613fd35781613fd5565b825b9392505050565b6000836001600160a01b03163b116140365760405162461bcd60e51b815260206004820152601f60248201527f457175616c697a657220526f757465723a20696e76616c696420746f6b656e006044820152606401610679565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916140929190614d71565b6000604051808303816000865af19150503d80600081146140cf576040519150601f19603f3d011682016040523d82523d6000602084013e6140d4565b606091505b50915091508180156140fe5750805115806140fe5750808060200190518101906140fe9190614a3a565b61411a5760405162461bcd60e51b815260040161067990614d8d565b5050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b038116811461414c57600080fd5b50565b8035613ede81614137565b801515811461414c57600080fd5b600080600080600080600080610100898b03121561418557600080fd5b883561419081614137565b975060208901356141a081614137565b965060408901356141b08161415a565b9550606089013594506080890135935060a0890135925060c08901356141d581614137565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a03121561420857600080fd5b8735965060208801359550604088013561422181614137565b9450606088013561423181614137565b935060808801356142418161415a565b925060a088013561425181614137565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b818110156142a057835183529284019291840191600101614284565b50909695505050505050565b60008083601f8401126142be57600080fd5b50813567ffffffffffffffff8111156142d657600080fd5b6020830191508360206060830285010111156111f357600080fd5b60008060008060008060a0878903121561430a57600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561432f57600080fd5b61433b89828a016142ac565b909550935050606087013561434f81614137565b80925050608087013590509295509295509295565b6000806000806080858703121561437a57600080fd5b843561438581614137565b9350602085013561439581614137565b925060408501356143a58161415a565b9396929550929360600135925050565b803560ff81168114613ede57600080fd5b60008060008060008060008060008060006101608c8e0312156143e857600080fd5b8b356143f381614137565b9a5060208c01356144038161415a565b995060408c0135985060608c0135975060808c0135965060a08c013561442881614137565b955060c08c0135945060e08c013561443f8161415a565b935061444e6101008d016143b5565b92506101208c013591506101408c013590509295989b509295989b9093969950565b60008060006060848603121561448557600080fd5b833561449081614137565b925060208401356144a081614137565b915060408401356144b08161415a565b809150509250925092565b600080604083850312156144ce57600080fd5b82356144d981614137565b915060208301356144e981614137565b809150509250929050565b60008060008060008060008060006101208a8c03121561451357600080fd5b893561451e81614137565b985060208a013561452e81614137565b975060408a013561453e8161415a565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a013561456a81614137565b809250506101008a013590509295985092959850929598565b60008060006060848603121561459857600080fd5b8335925060208401356145aa81614137565b915060408401356144b081614137565b6000806000806000608086880312156145d257600080fd5b85359450602086013567ffffffffffffffff8111156145f057600080fd5b6145fc888289016142ac565b909550935050604086013561461081614137565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561466057614660614621565b604052919050565b600067ffffffffffffffff82111561468257614682614621565b5060051b60200190565b6000806000806000608086880312156146a457600080fd5b853567ffffffffffffffff808211156146bc57600080fd5b818801915088601f8301126146d057600080fd5b813560206146e56146e083614668565b614637565b82815260059290921b8401810191818101908c84111561470457600080fd5b948201945b8386101561472257853582529482019490820190614709565b9950508901359250508082111561473857600080fd5b50614745888289016142ac565b909550935061461090506040870161414f565b60006060828403121561476a57600080fd5b6040516060810181811067ffffffffffffffff8211171561478d5761478d614621565b604052905080823561479e81614137565b815260208301356147ae81614137565b602082015260408301356147c18161415a565b6040919091015292915050565b600080604083850312156147e157600080fd5b8235915060208084013567ffffffffffffffff81111561480057600080fd5b8401601f8101861361481157600080fd5b803561481f6146e082614668565b8181526060918202830184019184820191908984111561483e57600080fd5b938501935b83851015614864576148558a86614758565b83529384019391850191614843565b5080955050505050509250929050565b600080600080600060a0868803121561488c57600080fd5b853561489781614137565b945060208601356148a781614137565b935060408601356148b78161415a565b94979396509394606081013594506080013592915050565b6000806000806000806000806000806000806101808d8f0312156148f257600080fd5b8c356148fd81614137565b9b5060208d013561490d81614137565b9a5060408d013561491d8161415a565b995060608d0135985060808d0135975060a08d0135965060c08d013561494281614137565b955060e08d013594506101008d013561495a8161415a565b93506149696101208e016143b5565b92506101408d013591506101608d013590509295989b509295989b509295989b565b600080600080600080600060e0888a0312156149a657600080fd5b87356149b181614137565b965060208801356149c18161415a565b955060408801359450606088013593506080880135925060a088013561425181614137565b6000602082840312156149f857600080fd5b8135613fd581614137565b60208082526019908201527f457175616c697a657220526f757465723a204558504952454400000000000000604082015260600190565b600060208284031215614a4c57600080fd5b8151613fd58161415a565b60008060408385031215614a6a57600080fd5b505080516020909101519092909150565b60208082526027908201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4160408201526617d05353d5539560ca1b606082015260800190565b60208082526027908201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4260408201526617d05353d5539560ca1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015614b4757614b47614b1f565b500390565b6020808252602c908201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4f60408201526b155514155517d05353d5539560a21b606082015260800190565b6020808252601e908201527f457175616c697a657220526f757465723a20494e56414c49445f504154480000604082015260600190565b600060608284031215614be157600080fd5b613fd58383614758565b600060208284031215614bfd57600080fd5b8135613fd58161415a565b600060208284031215614c1a57600080fd5b5051919050565b6001600160a01b039384168152919092166020820152901515604082015260600190565b600060208284031215614c5757600080fd5b8151613fd581614137565b6000816000190483118215151615614c7c57614c7c614b1f565b500290565b600082614c9e57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b600080600060608486031215614cf957600080fd5b8351925060208401519150604084015190509250925092565b60008219821115614d2557614d25614b1f565b500190565b6000600019821415614d3e57614d3e614b1f565b5060010190565b60005b83811015614d60578181015183820152602001614d48565b838111156137415750506000910152565b60008251614d83818460208701614d45565b9190910192915050565b60208082526027908201527f457175616c697a657220526f757465723a20746f6b656e207472616e736665726040820152660819985a5b195960ca1b606082015260800190565b84815283602082015260018060a01b03831660408201526080606082015260008251806080840152614e0d8160a0850160208701614d45565b601f01601f19169190910160a0019594505050505056fea2646970667358221220014c2acfdb2fbedc68073bbc14fe41b5e3b8f441a311b78ed356232ff3c571ef64736f6c63430008090033000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83000000000000000000000000e3d1a117df7dcac2eb0ac8219341bad92f18dac1

Deployed Bytecode

0x6080604052600436106101bb5760003560e01c80637301e3c8116100ec578063b7e0d4c01161008a578063e2d9d4dc11610064578063e2d9d4dc146105c5578063e5e31b13146105e5578063f41766d814610615578063fe411f141461063557600080fd5b8063b7e0d4c01461055e578063c45a015514610571578063d7b0e0a5146105a557600080fd5b80639881fcb4116100c65780639881fcb4146104bc57806398a0fb3c146104dc5780639aab9248146104fc578063a32b1fcd1461053e57600080fd5b80637301e3c81461046957806376c72751146104895780637af728c81461049c57600080fd5b80634c1ee03e116101595780635e1e6325116101335780635e1e6325146103e15780635e60dab51461041657806367ffb66a146104365780636cc1ae131461044957600080fd5b80634c1ee03e14610346578063544caa56146103665780635a47ddc3146103a657600080fd5b80633fc8cef3116101955780633fc8cef3146102865780634386e63c146102d2578063448725b4146102f257806346c96aac1461031257600080fd5b80630dede6c4146101ff57806313dcfc591461023957806318a130861461026657600080fd5b366101fa57336001600160a01b037f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8316146101f8576101f8614121565b005b600080fd5b34801561020b57600080fd5b5061021f61021a366004614168565b610655565b604080519283526020830191909152015b60405180910390f35b34801561024557600080fd5b506102596102543660046141ed565b61087a565b6040516102309190614268565b34801561027257600080fd5b506102596102813660046142f1565b610a8d565b34801561029257600080fd5b506102ba7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8381565b6040516001600160a01b039091168152602001610230565b3480156102de57600080fd5b5061021f6102ed366004614364565b610df9565b3480156102fe57600080fd5b5061021f61030d3660046143c6565b610f7e565b34801561031e57600080fd5b506102ba7f000000000000000000000000e3d1a117df7dcac2eb0ac8219341bad92f18dac181565b34801561035257600080fd5b506102ba610361366004614470565b611057565b34801561037257600080fd5b506103866103813660046144bb565b611102565b604080516001600160a01b03938416815292909116602083015201610230565b3480156103b257600080fd5b506103c66103c13660046144f4565b6111fa565b60408051938452602084019290925290820152606001610230565b3480156103ed57600080fd5b506104016103fc366004614583565b611581565b60408051928352901515602083015201610230565b34801561042257600080fd5b5061021f610431366004614470565b611811565b6102596104443660046145ba565b6118d8565b34801561045557600080fd5b506101f86104643660046142f1565b611c67565b34801561047557600080fd5b5061025961048436600461468c565b611e73565b6101f86104973660046145ba565b611f49565b3480156104a857600080fd5b506101f86104b73660046142f1565b612272565b3480156104c857600080fd5b506102596104d73660046147ce565b612499565b3480156104e857600080fd5b506103c66104f7366004614874565b612739565b34801561050857600080fd5b506105307f1e2d35068c62553cd58c2cdccb90546535b94f0052039edc508eef95cb06decb81565b604051908152602001610230565b34801561054a57600080fd5b5061021f6105593660046148cf565b612957565b6103c661056c36600461498b565b612a12565b34801561057d57600080fd5b506102ba7f000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a81565b3480156105b157600080fd5b5061021f6105c036600461498b565b612f29565b3480156105d157600080fd5b5061021f6105e03660046143c6565b61303f565b3480156105f157600080fd5b506106056106003660046149e6565b6130fe565b6040519015158152602001610230565b34801561062157600080fd5b506102596106303660046142f1565b6131a2565b34801561064157600080fd5b5061021f61065036600461498b565b6132c7565b60008082428110156106825760405162461bcd60e51b815260040161067990614a03565b60405180910390fd5b600061068f8c8c8c611057565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd90606401602060405180830381600087803b1580156106e057600080fd5b505af11580156106f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107189190614a3a565b61076e5760405162461bcd60e51b815260206004820152602160248201527f457175616c697a657220526f757465723a207472616e73666572206661696c656044820152601960fa1b6064820152608401610679565b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb44906024016040805180830381600087803b1580156107b557600080fd5b505af11580156107c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ed9190614a57565b9150915060006107fd8f8f611102565b509050806001600160a01b03168f6001600160a01b031614610820578183610823565b82825b90975095508a8710156108485760405162461bcd60e51b815260040161067990614a7b565b898610156108685760405162461bcd60e51b815260040161067990614ac2565b50505050509850989650505050505050565b6060814281101561089d5760405162461bcd60e51b815260040161067990614a03565b604080516001808252818301909252600091816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816108b457905050905087816000815181106108f7576108f7614b09565b6020026020010151600001906001600160a01b031690816001600160a01b031681525050868160008151811061092f5761092f614b09565b6020026020010151602001906001600160a01b031690816001600160a01b031681525050858160008151811061096757610967614b09565b60209081029190910101519015156040909101526109858a82612499565b92508883600185516109979190614b35565b815181106109a7576109a7614b09565b602002602001015110156109cd5760405162461bcd60e51b815260040161067990614b4c565b610a75816000815181106109e3576109e3614b09565b60200260200101516000015133610a5584600081518110610a0657610a06614b09565b60200260200101516000015185600081518110610a2557610a25614b09565b60200260200101516020015186600081518110610a4457610a44614b09565b602002602001015160400151611057565b86600081518110610a6857610a68614b09565b60200260200101516133a4565b610a808382876134f2565b5050979650505050505050565b60608142811015610ab05760405162461bcd60e51b815260040161067990614a03565b6001600160a01b037f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83168686610ae7600182614b35565b818110610af657610af6614b09565b9050606002016020016020810190610b0e91906149e6565b6001600160a01b031614610b345760405162461bcd60e51b815260040161067990614b98565b610b90888787808060200260200160405190810160405280939291908181526020016000905b82821015610b8657610b7760608302860136819003810190614bcf565b81526020019060010190610b5a565b5050505050612499565b9150868260018451610ba29190614b35565b81518110610bb257610bb2614b09565b60200260200101511015610bd85760405162461bcd60e51b815260040161067990614b4c565b610c9a86866000818110610bee57610bee614b09565b610c0492602060609092020190810191506149e6565b33610c8789896000818110610c1b57610c1b614b09565b610c3192602060609092020190810191506149e6565b8a8a6000818110610c4457610c44614b09565b9050606002016020016020810190610c5c91906149e6565b8b8b6000818110610c6f57610c6f614b09565b90506060020160400160208101906103619190614beb565b85600081518110610a6857610a68614b09565b610cf7828787808060200260200160405190810160405280939291908181526020016000905b82821015610cec57610cdd60608302860136819003810190614bcf565b81526020019060010190610cc0565b5050505050306134f2565b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b0316632e1a7d4d8360018551610d359190614b35565b81518110610d4557610d45614b09565b60200260200101516040518263ffffffff1660e01b8152600401610d6b91815260200190565b602060405180830381600087803b158015610d8557600080fd5b505af1158015610d99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbd9190614c08565b50610dee848360018551610dd19190614b35565b81518110610de157610de1614b09565b6020026020010151613747565b509695505050505050565b60008060007f000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a6001600160a01b0316636801cc308888886040518463ffffffff1660e01b8152600401610e4e93929190614c21565b60206040518083038186803b158015610e6657600080fd5b505afa158015610e7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9e9190614c45565b90506001600160a01b038116610ebb576000809250925050610f75565b600080610ec9898989611811565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f0857600080fd5b505afa158015610f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f409190614c08565b905080610f4d8489614c62565b610f579190614c81565b955080610f648389614c62565b610f6e9190614c81565b9450505050505b94509492505050565b6000806000610fae8e7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c838f611057565b9050600087610fbd578c610fc1565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610ffc903390309086908f908e908e908e90600401614ca3565b600060405180830381600087803b15801561101657600080fd5b505af115801561102a573d6000803e3d6000fd5b5050505061103d8f8f8f8f8f8f8f612f29565b809450819550505050509b509b9950505050505050505050565b6040516306801cc360e41b81526000906001600160a01b037f000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a1690636801cc30906110aa90879087908790600401614c21565b60206040518083038186803b1580156110c257600080fd5b505afa1580156110d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fa9190614c45565b949350505050565b600080826001600160a01b0316846001600160a01b031614156111755760405162461bcd60e51b815260206004820152602560248201527f457175616c697a657220526f757465723a204944454e544943414c5f41444452604482015264455353455360d81b6064820152608401610679565b826001600160a01b0316846001600160a01b031610611195578284611198565b83835b90925090506001600160a01b0382166111f35760405162461bcd60e51b815260206004820152601e60248201527f457175616c697a657220526f757465723a205a45524f5f4144445245535300006044820152606401610679565b9250929050565b600080600083428110156112205760405162461bcd60e51b815260040161067990614a03565b61122f8d8d8d8d8d8d8d613815565b909450925060006112418e8e8e611057565b905061124f8e3383886133a4565b61125b8d3383876133a4565b60405163b9a09fd560e01b81526001600160a01b0382811660048301526000917f000000000000000000000000e3d1a117df7dcac2eb0ac8219341bad92f18dac19091169063b9a09fd59060240160206040518083038186803b1580156112c157600080fd5b505afa1580156112d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f99190614c45565b90506001600160a01b03811661138b576040516335313c2160e11b81526001600160a01b038981166004830152831690636a62784290602401602060405180830381600087803b15801561134c57600080fd5b505af1158015611360573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113849190614c08565b935061156f565b6040516335313c2160e11b81523060048201526001600160a01b03831690636a62784290602401602060405180830381600087803b1580156113cc57600080fd5b505af11580156113e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114049190614c08565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152919550859184169063dd62ed3e9060440160206040518083038186803b15801561145057600080fd5b505afa158015611464573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114889190614c08565b10156115135760405163095ea7b360e01b81526001600160a01b038281166004830152600019602483015283169063095ea7b390604401602060405180830381600087803b1580156114d957600080fd5b505af11580156114ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115119190614a3a565b505b604051633010d8ef60e01b81526001600160a01b038981166004830152821690633010d8ef90602401600060405180830381600087803b15801561155657600080fd5b505af115801561156a573d6000803e3d6000fd5b505050505b50505099509950999650505050505050565b600080600061159285856001611057565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a9091169063e5e31b139060240160206040518083038186803b1580156115fd57600080fd5b505afa158015611611573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116359190614a3a565b156116bd576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a9060440160206040518083038186803b15801561168257600080fd5b505afa158015611696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ba9190614c08565b91505b6116c987876000611057565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a9091169063e5e31b139060240160206040518083038186803b15801561172f57600080fd5b505afa158015611743573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117679190614a3a565b156117ef576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a9060440160206040518083038186803b1580156117b457600080fd5b505afa1580156117c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ec9190614c08565b90505b8082116117fe57806000611802565b8160015b94509450505050935093915050565b60008060006118208686611102565b509050600080611831888888611057565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561186957600080fd5b505afa15801561187d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a19190614ce4565b5091509150826001600160a01b0316886001600160a01b0316146118c65780826118c9565b81815b90999098509650505050505050565b606081428110156118fb5760405162461bcd60e51b815260040161067990614a03565b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b03168686600081811061193857611938614b09565b61194e92602060609092020190810191506149e6565b6001600160a01b0316146119745760405162461bcd60e51b815260040161067990614b98565b6119c6348787808060200260200160405190810160405280939291908181526020016000905b82821015610b86576119b760608302860136819003810190614bcf565b8152602001906001019061199a565b91508682600184516119d89190614b35565b815181106119e8576119e8614b09565b60200260200101511015611a0e5760405162461bcd60e51b815260040161067990614b4c565b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031663d0e30db083600081518110611a5057611a50614b09565b60200260200101516040518263ffffffff1660e01b81526004016020604051808303818588803b158015611a8357600080fd5b505af1158015611a97573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611abc9190614c08565b507f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031663a9059cbb611b5688886000818110611b0257611b02614b09565b611b1892602060609092020190810191506149e6565b89896000818110611b2b57611b2b614b09565b9050606002016020016020810190611b4391906149e6565b8a8a6000818110610c6f57610c6f614b09565b84600081518110611b6957611b69614b09565b60200260200101516040518363ffffffff1660e01b8152600401611ba29291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b158015611bbc57600080fd5b505af1158015611bd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf49190614a3a565b611c0057611c00614121565b611c5d828787808060200260200160405190810160405280939291908181526020016000905b82821015611c5257611c4360608302860136819003810190614bcf565b81526020019060010190611c26565b5050505050866134f2565b5095945050505050565b8042811015611c885760405162461bcd60e51b815260040161067990614a03565b611cd185856000818110611c9e57611c9e614b09565b611cb492602060609092020190810191506149e6565b33611ccb88886000818110611b0257611b02614b09565b8a6133a4565b60008585611ce0600182614b35565b818110611cef57611cef614b09565b9050606002016020016020810190611d0791906149e6565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a082319060240160206040518083038186803b158015611d4a57600080fd5b505afa158015611d5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d829190614c08565b9050611d8f868686613afb565b86818787611d9e600182614b35565b818110611dad57611dad614b09565b9050606002016020016020810190611dc591906149e6565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b60206040518083038186803b158015611e0957600080fd5b505afa158015611e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e419190614c08565b611e4b9190614b35565b1015611e695760405162461bcd60e51b815260040161067990614b4c565b5050505050505050565b60608142811015611e965760405162461bcd60e51b815260040161067990614a03565b611eec86866000818110611eac57611eac614b09565b611ec292602060609092020190810191506149e6565b33611ed989896000818110610c1b57610c1b614b09565b8a600081518110610a6857610a68614b09565b611f3e878787808060200260200160405190810160405280939291908181526020016000905b82821015611c5257611f2f60608302860136819003810190614bcf565b81526020019060010190611f12565b509495945050505050565b8042811015611f6a5760405162461bcd60e51b815260040161067990614a03565b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031685856000818110611fa757611fa7614b09565b611fbd92602060609092020190810191506149e6565b6001600160a01b031614611fe35760405162461bcd60e51b815260040161067990614b98565b60003490507f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016020604051808303818588803b15801561204357600080fd5b505af1158015612057573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061207c9190614c08565b507f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031663a9059cbb6120c288886000818110611b0257611b02614b09565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b15801561210a57600080fd5b505af115801561211e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121429190614a3a565b61214e5761214e614121565b6000868661215d600182614b35565b81811061216c5761216c614b09565b905060600201602001602081019061218491906149e6565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a082319060240160206040518083038186803b1580156121c757600080fd5b505afa1580156121db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ff9190614c08565b905061220c878787613afb565b8781888861221b600182614b35565b81811061222a5761222a614b09565b905060600201602001602081019061224291906149e6565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a0823190602401611df1565b80428110156122935760405162461bcd60e51b815260040161067990614a03565b6001600160a01b037f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c831685856122ca600182614b35565b8181106122d9576122d9614b09565b90506060020160200160208101906122f191906149e6565b6001600160a01b0316146123175760405162461bcd60e51b815260040161067990614b98565b61232d85856000818110611c9e57611c9e614b09565b612338858530613afb565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b0316906370a082319060240160206040518083038186803b15801561239a57600080fd5b505afa1580156123ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d29190614c08565b9050868110156123f45760405162461bcd60e51b815260040161067990614b4c565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031690632e1a7d4d90602401602060405180830381600087803b15801561245657600080fd5b505af115801561246a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248e9190614c08565b50611e698482613747565b60606001825110156124bd5760405162461bcd60e51b815260040161067990614b98565b81516124ca906001614d12565b67ffffffffffffffff8111156124e2576124e2614621565b60405190808252806020026020018201604052801561250b578160200160208202803683370190505b509050828160008151811061252257612522614b09565b60200260200101818152505060005b825181101561273257600061258d84838151811061255157612551614b09565b60200260200101516000015185848151811061256f5761256f614b09565b602002602001015160200151868581518110610a4457610a44614b09565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a9091169063e5e31b139060240160206040518083038186803b1580156125f357600080fd5b505afa158015612607573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262b9190614a3a565b1561271f57806001600160a01b031663f140a35a84848151811061265157612651614b09565b602002602001015186858151811061266b5761266b614b09565b6020026020010151600001516040518363ffffffff1660e01b81526004016126a69291909182526001600160a01b0316602082015260400190565b60206040518083038186803b1580156126be57600080fd5b505afa1580156126d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f69190614c08565b83612702846001614d12565b8151811061271257612712614b09565b6020026020010181815250505b508061272a81614d2a565b915050612531565b5092915050565b6000806000807f000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a6001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b815260040161278f93929190614c21565b60206040518083038186803b1580156127a757600080fd5b505afa1580156127bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127df9190614c45565b9050600080806001600160a01b0384161561287857836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561282d57600080fd5b505afa158015612841573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128659190614c08565b90506128728c8c8c611811565b90935091505b82158015612884575081155b156128b5578896508795506103e86128a461289f888a614c62565b613e73565b6128ae9190614b35565b9450612948565b60006128c28a8585613ee3565b905088811161290a57899750955085612903846128df848b614c62565b6128e99190614c81565b846128f4858b614c62565b6128fe9190614c81565b613fc4565b9550612946565b60006129178a8587613ee3565b98508997508890506129428561292d8584614c62565b6129379190614c81565b856128f4868c614c62565b9650505b505b50505050955095509592505050565b60008060006129678f8f8f611057565b9050600087612976578c61297a565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906129b5903390309086908f908e908e908e90600401614ca3565b600060405180830381600087803b1580156129cf57600080fd5b505af11580156129e3573d6000803e3d6000fd5b50505050506129f88f8f8f8f8f8f8f8f610655565b8093508194505050509c509c9a5050505050505050505050565b60008060008342811015612a385760405162461bcd60e51b815260040161067990614a03565b612a678b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c838c8c348d8d613815565b90945092506000612a998c7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c838d611057565b9050612aa78c3383886133a4565b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016020604051808303818588803b158015612b0257600080fd5b505af1158015612b16573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b3b9190614c08565b5060405163a9059cbb60e01b81526001600160a01b038281166004830152602482018690527f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83169063a9059cbb90604401602060405180830381600087803b158015612ba657600080fd5b505af1158015612bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bde9190614a3a565b612bea57612bea614121565b60405163b9a09fd560e01b81526001600160a01b0382811660048301526000917f000000000000000000000000e3d1a117df7dcac2eb0ac8219341bad92f18dac19091169063b9a09fd59060240160206040518083038186803b158015612c5057600080fd5b505afa158015612c64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c889190614c45565b90506001600160a01b038116612d1a576040516335313c2160e11b81526001600160a01b038981166004830152831690636a62784290602401602060405180830381600087803b158015612cdb57600080fd5b505af1158015612cef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d139190614c08565b9350612efe565b6040516335313c2160e11b81523060048201526001600160a01b03831690636a62784290602401602060405180830381600087803b158015612d5b57600080fd5b505af1158015612d6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d939190614c08565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152919550859184169063dd62ed3e9060440160206040518083038186803b158015612ddf57600080fd5b505afa158015612df3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e179190614c08565b1015612ea25760405163095ea7b360e01b81526001600160a01b038281166004830152600019602483015283169063095ea7b390604401602060405180830381600087803b158015612e6857600080fd5b505af1158015612e7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea09190614a3a565b505b604051633010d8ef60e01b81526001600160a01b038981166004830152821690633010d8ef90602401600060405180830381600087803b158015612ee557600080fd5b505af1158015612ef9573d6000803e3d6000fd5b505050505b5083341115612f1a57612f1a33612f158634614b35565b613747565b50509750975097945050505050565b6000808242811015612f4d5760405162461bcd60e51b815260040161067990614a03565b612f7d8a7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c838b8b8b8b308b610655565b9093509150612f8d8a8685613fdc565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031690632e1a7d4d90602401602060405180830381600087803b158015612fef57600080fd5b505af1158015613003573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130279190614c08565b506130328583613747565b5097509795505050505050565b600080600061306f8e7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c838f611057565b905060008761307e578c613082565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906130bd903390309086908f908e908e908e90600401614ca3565b600060405180830381600087803b1580156130d757600080fd5b505af11580156130eb573d6000803e3d6000fd5b5050505061103d8f8f8f8f8f8f8f6132c7565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a9091169063e5e31b139060240160206040518083038186803b15801561316457600080fd5b505afa158015613178573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319c9190614a3a565b92915050565b606081428110156131c55760405162461bcd60e51b815260040161067990614a03565b613217888787808060200260200160405190810160405280939291908181526020016000905b82821015610b865761320860608302860136819003810190614bcf565b815260200190600101906131eb565b91508682600184516132299190614b35565b8151811061323957613239614b09565b6020026020010151101561325f5760405162461bcd60e51b815260040161067990614b4c565b61327586866000818110610bee57610bee614b09565b610dee828787808060200260200160405190810160405280939291908181526020016000905b82821015611c52576132b860608302860136819003810190614bcf565b8152602001906001019061329b565b60008082428110156132eb5760405162461bcd60e51b815260040161067990614a03565b61331b8a7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c838b8b8b8b308b610655565b6040516370a0823160e01b81523060048201529194509250612f8d908b9087906001600160a01b038316906370a082319060240160206040518083038186803b15801561336757600080fd5b505afa15801561337b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339f9190614c08565b613fdc565b6000846001600160a01b03163b116133fe5760405162461bcd60e51b815260206004820152601f60248201527f457175616c697a657220526f757465723a20696e76616c696420746f6b656e006044820152606401610679565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916134629190614d71565b6000604051808303816000865af19150503d806000811461349f576040519150601f19603f3d011682016040523d82523d6000602084013e6134a4565b606091505b50915091508180156134ce5750805115806134ce5750808060200190518101906134ce9190614a3a565b6134ea5760405162461bcd60e51b815260040161067990614d8d565b505050505050565b60005b825181101561374157600061354484838151811061351557613515614b09565b60200260200101516000015185848151811061353357613533614b09565b602002602001015160200151611102565b509050600085613555846001614d12565b8151811061356557613565614b09565b60200260200101519050600080836001600160a01b031687868151811061358e5761358e614b09565b6020026020010151600001516001600160a01b0316146135b0578260006135b4565b6000835b915091506000600188516135c89190614b35565b86106135d45786613647565b613647886135e3886001614d12565b815181106135f3576135f3614b09565b6020026020010151600001518988600161360d9190614d12565b8151811061361d5761361d614b09565b6020026020010151602001518a8960016136379190614d12565b81518110610a4457610a44614b09565b905061369a88878151811061365e5761365e614b09565b60200260200101516000015189888151811061367c5761367c614b09565b6020026020010151602001518a8981518110610a4457610a44614b09565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156136d7576020820181803683370190505b506040518563ffffffff1660e01b81526004016136f79493929190614dd4565b600060405180830381600087803b15801561371157600080fd5b505af1158015613725573d6000803e3d6000fd5b505050505050505050808061373990614d2a565b9150506134f5565b50505050565b604080516000808252602082019092526001600160a01b0384169083906040516137719190614d71565b60006040518083038185875af1925050503d80600081146137ae576040519150601f19603f3d011682016040523d82523d6000602084013e6137b3565b606091505b50509050806138105760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b6064820152608401610679565b505050565b6000808386101561387a5760405162461bcd60e51b815260206004820152602960248201527f457175616c697a657220526f757465723a20696e76616c6964206465736972656044820152686420616d6f756e744160b81b6064820152608401610679565b828510156138dc5760405162461bcd60e51b815260206004820152602960248201527f457175616c697a657220526f757465723a20696e76616c696420646573697265604482015268321030b6b7bab73a2160b91b6064820152608401610679565b6040516306801cc360e41b81526000906001600160a01b037f000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a1690636801cc309061392f908d908d908d90600401614c21565b60206040518083038186803b15801561394757600080fd5b505afa15801561395b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061397f9190614c45565b90506001600160a01b038116613a34576040516320b7f73960e21b81526001600160a01b037f000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a16906382dfdce4906139df908d908d908d90600401614c21565b602060405180830381600087803b1580156139f957600080fd5b505af1158015613a0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a319190614c45565b90505b600080613a428c8c8c611811565b91509150816000148015613a54575080155b15613a6457889450879350613aec565b6000613a718a8484613ee3565b9050888111613aa55786811015613a9a5760405162461bcd60e51b815260040161067990614ac2565b899550935083613aea565b6000613ab28a8486613ee3565b90508a811115613ac457613ac4614121565b88811015613ae45760405162461bcd60e51b815260040161067990614a7b565b95508894505b505b50505097509795505050505050565b60005b8281101561374157600080858584818110613b1b57613b1b614b09565b613b3192602060609092020190810191506149e6565b868685818110613b4357613b43614b09565b9050606002016020016020810190613b5b91906149e6565b915091506000613b6b8383611102565b5090506000613bd7888887818110613b8557613b85614b09565b613b9b92602060609092020190810191506149e6565b898988818110613bad57613bad614b09565b9050606002016020016020810190613bc591906149e6565b8a8a89818110610c6f57610c6f614b09565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613c1857600080fd5b505afa158015613c2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c509190614ce4565b50915091506000866001600160a01b0316896001600160a01b031614613c77578183613c7a565b82825b506040516370a0823160e01b81526001600160a01b03888116600483015291925082918b16906370a082319060240160206040518083038186803b158015613cc157600080fd5b505afa158015613cd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cf99190614c08565b613d039190614b35565b9450613d10858a8a611581565b5080945050505050600080856001600160a01b0316886001600160a01b031614613d3c57826000613d40565b6000835b90925090506000613d5260018d614b35565b8a10613d5e578a613de3565b613de38d8d613d6e8d6001614d12565b818110613d7d57613d7d614b09565b613d9392602060609092020190810191506149e6565b8e8e613da08e6001614d12565b818110613daf57613daf614b09565b9050606002016020016020810190613dc791906149e6565b8f8f613dd48f6001614d12565b818110610c6f57610c6f614b09565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f90613e259086908690869060248101614dd4565b600060405180830381600087803b158015613e3f57600080fd5b505af1158015613e53573d6000803e3d6000fd5b505050505050505050505050508080613e6b90614d2a565b915050613afe565b60006003821115613ed45750806000613e8d600283614c81565b613e98906001614d12565b90505b81811015613ece57905080600281613eb38186614c81565b613ebd9190614d12565b613ec79190614c81565b9050613e9b565b50919050565b8115613ede575060015b919050565b6000808411613f425760405162461bcd60e51b815260206004820152602560248201527f457175616c697a657220526f757465723a20494e53554646494349454e545f416044820152641353d5539560da1b6064820152608401610679565b600083118015613f525750600082115b613faf5760405162461bcd60e51b815260206004820152602860248201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4c604482015267495155494449545960c01b6064820152608401610679565b82613fba8386614c62565b6110fa9190614c81565b6000818310613fd35781613fd5565b825b9392505050565b6000836001600160a01b03163b116140365760405162461bcd60e51b815260206004820152601f60248201527f457175616c697a657220526f757465723a20696e76616c696420746f6b656e006044820152606401610679565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916140929190614d71565b6000604051808303816000865af19150503d80600081146140cf576040519150601f19603f3d011682016040523d82523d6000602084013e6140d4565b606091505b50915091508180156140fe5750805115806140fe5750808060200190518101906140fe9190614a3a565b61411a5760405162461bcd60e51b815260040161067990614d8d565b5050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b038116811461414c57600080fd5b50565b8035613ede81614137565b801515811461414c57600080fd5b600080600080600080600080610100898b03121561418557600080fd5b883561419081614137565b975060208901356141a081614137565b965060408901356141b08161415a565b9550606089013594506080890135935060a0890135925060c08901356141d581614137565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a03121561420857600080fd5b8735965060208801359550604088013561422181614137565b9450606088013561423181614137565b935060808801356142418161415a565b925060a088013561425181614137565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b818110156142a057835183529284019291840191600101614284565b50909695505050505050565b60008083601f8401126142be57600080fd5b50813567ffffffffffffffff8111156142d657600080fd5b6020830191508360206060830285010111156111f357600080fd5b60008060008060008060a0878903121561430a57600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561432f57600080fd5b61433b89828a016142ac565b909550935050606087013561434f81614137565b80925050608087013590509295509295509295565b6000806000806080858703121561437a57600080fd5b843561438581614137565b9350602085013561439581614137565b925060408501356143a58161415a565b9396929550929360600135925050565b803560ff81168114613ede57600080fd5b60008060008060008060008060008060006101608c8e0312156143e857600080fd5b8b356143f381614137565b9a5060208c01356144038161415a565b995060408c0135985060608c0135975060808c0135965060a08c013561442881614137565b955060c08c0135945060e08c013561443f8161415a565b935061444e6101008d016143b5565b92506101208c013591506101408c013590509295989b509295989b9093969950565b60008060006060848603121561448557600080fd5b833561449081614137565b925060208401356144a081614137565b915060408401356144b08161415a565b809150509250925092565b600080604083850312156144ce57600080fd5b82356144d981614137565b915060208301356144e981614137565b809150509250929050565b60008060008060008060008060006101208a8c03121561451357600080fd5b893561451e81614137565b985060208a013561452e81614137565b975060408a013561453e8161415a565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a013561456a81614137565b809250506101008a013590509295985092959850929598565b60008060006060848603121561459857600080fd5b8335925060208401356145aa81614137565b915060408401356144b081614137565b6000806000806000608086880312156145d257600080fd5b85359450602086013567ffffffffffffffff8111156145f057600080fd5b6145fc888289016142ac565b909550935050604086013561461081614137565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561466057614660614621565b604052919050565b600067ffffffffffffffff82111561468257614682614621565b5060051b60200190565b6000806000806000608086880312156146a457600080fd5b853567ffffffffffffffff808211156146bc57600080fd5b818801915088601f8301126146d057600080fd5b813560206146e56146e083614668565b614637565b82815260059290921b8401810191818101908c84111561470457600080fd5b948201945b8386101561472257853582529482019490820190614709565b9950508901359250508082111561473857600080fd5b50614745888289016142ac565b909550935061461090506040870161414f565b60006060828403121561476a57600080fd5b6040516060810181811067ffffffffffffffff8211171561478d5761478d614621565b604052905080823561479e81614137565b815260208301356147ae81614137565b602082015260408301356147c18161415a565b6040919091015292915050565b600080604083850312156147e157600080fd5b8235915060208084013567ffffffffffffffff81111561480057600080fd5b8401601f8101861361481157600080fd5b803561481f6146e082614668565b8181526060918202830184019184820191908984111561483e57600080fd5b938501935b83851015614864576148558a86614758565b83529384019391850191614843565b5080955050505050509250929050565b600080600080600060a0868803121561488c57600080fd5b853561489781614137565b945060208601356148a781614137565b935060408601356148b78161415a565b94979396509394606081013594506080013592915050565b6000806000806000806000806000806000806101808d8f0312156148f257600080fd5b8c356148fd81614137565b9b5060208d013561490d81614137565b9a5060408d013561491d8161415a565b995060608d0135985060808d0135975060a08d0135965060c08d013561494281614137565b955060e08d013594506101008d013561495a8161415a565b93506149696101208e016143b5565b92506101408d013591506101608d013590509295989b509295989b509295989b565b600080600080600080600060e0888a0312156149a657600080fd5b87356149b181614137565b965060208801356149c18161415a565b955060408801359450606088013593506080880135925060a088013561425181614137565b6000602082840312156149f857600080fd5b8135613fd581614137565b60208082526019908201527f457175616c697a657220526f757465723a204558504952454400000000000000604082015260600190565b600060208284031215614a4c57600080fd5b8151613fd58161415a565b60008060408385031215614a6a57600080fd5b505080516020909101519092909150565b60208082526027908201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4160408201526617d05353d5539560ca1b606082015260800190565b60208082526027908201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4260408201526617d05353d5539560ca1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015614b4757614b47614b1f565b500390565b6020808252602c908201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4f60408201526b155514155517d05353d5539560a21b606082015260800190565b6020808252601e908201527f457175616c697a657220526f757465723a20494e56414c49445f504154480000604082015260600190565b600060608284031215614be157600080fd5b613fd58383614758565b600060208284031215614bfd57600080fd5b8135613fd58161415a565b600060208284031215614c1a57600080fd5b5051919050565b6001600160a01b039384168152919092166020820152901515604082015260600190565b600060208284031215614c5757600080fd5b8151613fd581614137565b6000816000190483118215151615614c7c57614c7c614b1f565b500290565b600082614c9e57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b600080600060608486031215614cf957600080fd5b8351925060208401519150604084015190509250925092565b60008219821115614d2557614d25614b1f565b500190565b6000600019821415614d3e57614d3e614b1f565b5060010190565b60005b83811015614d60578181015183820152602001614d48565b838111156137415750506000910152565b60008251614d83818460208701614d45565b9190910192915050565b60208082526027908201527f457175616c697a657220526f757465723a20746f6b656e207472616e736665726040820152660819985a5b195960ca1b606082015260800190565b84815283602082015260018060a01b03831660408201526080606082015260008251806080840152614e0d8160a0850160208701614d45565b601f01601f19169190910160a0019594505050505056fea2646970667358221220014c2acfdb2fbedc68073bbc14fe41b5e3b8f441a311b78ed356232ff3c571ef64736f6c63430008090033

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

000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83000000000000000000000000e3d1a117df7dcac2eb0ac8219341bad92f18dac1

-----Decoded View---------------
Arg [0] : _factory (address): 0xc6366EFD0AF1d09171fe0EBF32c7943BB310832a
Arg [1] : _weth (address): 0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83
Arg [2] : _voter (address): 0xE3D1A117dF7DCaC2eB0AC8219341bAd92f18dAC1

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a
Arg [1] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83
Arg [2] : 000000000000000000000000e3d1a117df7dcac2eb0ac8219341bad92f18dac1


Deployed Bytecode Sourcemap

6150:24530:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6984:10;-1:-1:-1;;;;;7006:4:0;6984:27;;6977:35;;;;:::i;:::-;6150:24530;;;;;16940:865;;;;;;;;;;-1:-1:-1;16940:865:0;;;;;:::i;:::-;;:::i;:::-;;;;1664:25:1;;;1720:2;1705:18;;1698:34;;;;1637:18;16940:865:0;;;;;;;;20678:790;;;;;;;;;;-1:-1:-1;20678:790:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22711:775::-;;;;;;;;;;-1:-1:-1;22711:775:0;;;;;:::i;:::-;;:::i;6390:27::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4643:32:1;;;4625:51;;4613:2;4598:18;6390:27:0;4467:215:1;11898:752:0;;;;;;;;;;-1:-1:-1;11898:752:0;;;;;:::i;:::-;;:::i;19203:670::-;;;;;;;;;;-1:-1:-1;19203:670:0;;;;;:::i;:::-;;:::i;6424:29::-;;;;;;;;;;;;;;;7473:508;;;;;;;;;;-1:-1:-1;7473:508:0;;;;;:::i;:::-;;:::i;7028:347::-;;;;;;;;;;-1:-1:-1;7028:347:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8177:15:1;;;8159:34;;8229:15;;;;8224:2;8209:18;;8202:43;8094:18;7028:347:0;7947:304:1;14270:1183:0;;;;;;;;;;-1:-1:-1;14270:1183:0;;;;;:::i;:::-;;:::i;:::-;;;;9473:25:1;;;9529:2;9514:18;;9507:34;;;;9557:18;;;9550:34;9461:2;9446:18;14270:1183:0;9271:319:1;8954:662:0;;;;;;;;;;-1:-1:-1;8954:662:0;;;;;:::i;:::-;;:::i;:::-;;;;10224:25:1;;;10292:14;;10285:22;10280:2;10265:18;;10258:50;10197:18;8954:662:0;10056:258:1;8491:375:0;;;;;;;;;;-1:-1:-1;8491:375:0;;;;;:::i;:::-;;:::i;22071:632::-;;;;;;:::i;:::-;;:::i;27233:737::-;;;;;;;;;;-1:-1:-1;27233:737:0;;;;;:::i;:::-;;:::i;23494:404::-;;;;;;;;;;-1:-1:-1;23494:404:0;;;;;:::i;:::-;;:::i;27976:838::-;;;;;;:::i;:::-;;:::i;28820:813::-;;;;;;;;;;-1:-1:-1;28820:813:0;;;;;:::i;:::-;;:::i;9704:569::-;;;;;;;;;;-1:-1:-1;9704:569:0;;;;;:::i;:::-;;:::i;10408:1482::-;;;;;;;;;;-1:-1:-1;10408:1482:0;;;;;:::i;:::-;;:::i;6460:37::-;;;;;;;;;;;;;;;;;;15685:25:1;;;15673:2;15658:18;6460:37:0;15539:177:1;18494:701:0;;;;;;;;;;-1:-1:-1;18494:701:0;;;;;:::i;:::-;;:::i;15461:1436::-;;;;;;:::i;:::-;;:::i;6351:32::-;;;;;;;;;;;;;;;17813:673;;;;;;;;;;-1:-1:-1;17813:673:0;;;;;:::i;:::-;;:::i;25178:752::-;;;;;;;;;;-1:-1:-1;25178:752:0;;;;;:::i;:::-;;:::i;10281:119::-;;;;;;;;;;-1:-1:-1;10281:119:0;;;;;:::i;:::-;;:::i;:::-;;;18237:14:1;;18230:22;18212:41;;18200:2;18185:18;10281:119:0;18072:187:1;21476:587:0;;;;;;;;;;-1:-1:-1;21476:587:0;;;;;:::i;:::-;;:::i;24443:729::-;;;;;;;;;;-1:-1:-1;24443:729:0;;;;;:::i;:::-;;:::i;16940:865::-;17199:12;17213;17180:8;6568:15;6556:8;:27;;6548:65;;;;-1:-1:-1;;;6548:65:0;;;;;;;:::i;:::-;;;;;;;;;17238:12:::1;17253:31;17261:6;17269;17277;17253:7;:31::i;:::-;17303:53;::::0;-1:-1:-1;;;17303:53:0;;17328:10:::1;17303:53;::::0;::::1;18858:34:1::0;-1:-1:-1;;;;;17303:24:0;::::1;18908:18:1::0;;;18901:43;;;18960:18;;;18953:34;;;17238:46:0;;-1:-1:-1;17303:24:0::1;::::0;18793:18:1;;17303:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17295:99;;;::::0;-1:-1:-1;;;17295:99:0;;19450:2:1;17295:99:0::1;::::0;::::1;19432:21:1::0;19489:2;19469:18;;;19462:30;19528:34;19508:18;;;19501:62;-1:-1:-1;;;19579:18:1;;;19572:31;19620:19;;17295:99:0::1;19248:397:1::0;17295:99:0::1;17462:20;::::0;-1:-1:-1;;;17462:20:0;;-1:-1:-1;;;;;4643:32:1;;;17462:20:0::1;::::0;::::1;4625:51:1::0;17432:12:0::1;::::0;;;17462:16;::::1;::::0;::::1;::::0;4598:18:1;;17462:20:0::1;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17431:51;;;;17494:14;17513:26;17524:6;17532;17513:10;:26::i;:::-;17493:46;;;17581:6;-1:-1:-1::0;;;;;17571:16:0::1;:6;-1:-1:-1::0;;;;;17571:16:0::1;;:58;;17612:7;17621;17571:58;;;17591:7;17600;17571:58;17550:79:::0;;-1:-1:-1;17550:79:0;-1:-1:-1;17648:21:0;;::::1;;17640:73;;;;-1:-1:-1::0;;;17640:73:0::1;;;;;;;:::i;:::-;17743:10;17732:7;:21;;17724:73;;;;-1:-1:-1::0;;;17724:73:0::1;;;;;;;:::i;:::-;17227:578;;;;16940:865:::0;;;;;;;;;;;;:::o;20678:790::-;20933:21;20914:8;6568:15;6556:8;:27;;6548:65;;;;-1:-1:-1;;;6548:65:0;;;;;;;:::i;:::-;20991:14:::1;::::0;;21003:1:::1;20991:14:::0;;;;;::::1;::::0;;;20967:21:::1;::::0;20991:14:::1;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;20991:14:0;;-1:-1:-1;;20991:14:0;;;;::::1;::::0;::::1;;;;;20967:38;;21033:9;21016:6;21023:1;21016:9;;;;;;;;:::i;:::-;;;;;;;:14;;:26;-1:-1:-1::0;;;;;21016:26:0::1;;;-1:-1:-1::0;;;;;21016:26:0::1;;;::::0;::::1;21068:7;21053:6;21060:1;21053:9;;;;;;;;:::i;:::-;;;;;;;:12;;:22;-1:-1:-1::0;;;;;21053:22:0::1;;;-1:-1:-1::0;;;;;21053:22:0::1;;;::::0;::::1;21105:6;21086;21093:1;21086:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;:25;::::1;;:16;::::0;;::::1;:25:::0;21132:31:::1;21146:8:::0;21156:6;21132:13:::1;:31::i;:::-;21122:41;;21213:12;21182:7;21207:1;21190:7;:14;:18;;;;:::i;:::-;21182:27;;;;;;;;:::i;:::-;;;;;;;:43;;21174:100;;;;-1:-1:-1::0;;;21174:100:0::1;;;;;;;:::i;:::-;21285:138;21317:6;21324:1;21317:9;;;;;;;;:::i;:::-;;;;;;;:14;;;21333:10;21345:55;21353:6;21360:1;21353:9;;;;;;;;:::i;:::-;;;;;;;:14;;;21369:6;21376:1;21369:9;;;;;;;;:::i;:::-;;;;;;;:12;;;21383:6;21390:1;21383:9;;;;;;;;:::i;:::-;;;;;;;:16;;;21345:7;:55::i;:::-;21402:7;21410:1;21402:10;;;;;;;;:::i;:::-;;;;;;;21285:17;:138::i;:::-;21434:26;21440:7;21449:6;21457:2;21434:5;:26::i;:::-;20956:512;20678:790:::0;;;;;;;;;;:::o;22711:775::-;22878:21;22854:8;6568:15;6556:8;:27;;6548:65;;;;-1:-1:-1;;;6548:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22965:4:0::1;22925:45;:6:::0;;22932:17:::1;22948:1;22925:6:::0;22932:17:::1;:::i;:::-;22925:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22925:45:0::1;;22917:88;;;;-1:-1:-1::0;;;22917:88:0::1;;;;;;;:::i;:::-;23026:31;23040:8;23050:6;;23026:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;:13;:31::i;:::-;23016:41;;23107:12;23076:7;23101:1;23084:7;:14;:18;;;;:::i;:::-;23076:27;;;;;;;;:::i;:::-;;;;;;;:43;;23068:100;;;;-1:-1:-1::0;;;23068:100:0::1;;;;;;;:::i;:::-;23179:138;23211:6;;23218:1;23211:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;23211:14:0::1;:::i;:::-;23227:10;23239:55;23247:6;;23254:1;23247:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;23247:14:0::1;:::i;:::-;23263:6;;23270:1;23263:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;23277:6;;23284:1;23277:9;;;;;;;:::i;:::-;;;;;;:16;;;;;;;;;;:::i;23239:55::-;23296:7;23304:1;23296:10;;;;;;;;:::i;23179:138::-;23328:37;23334:7;23343:6;;23328:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;23359:4;23328:5;:37::i;:::-;23376:4;-1:-1:-1::0;;;;;23376:13:0::1;;23390:7;23415:1;23398:7;:14;:18;;;;:::i;:::-;23390:27;;;;;;;;:::i;:::-;;;;;;;23376:42;;;;;;;;;;;;;15685:25:1::0;;15673:2;15658:18;;15539:177;23376:42:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23429:49;23446:2;23450:7;23475:1;23458:7;:14;:18;;;;:::i;:::-;23450:27;;;;;;;;:::i;:::-;;;;;;;23429:16;:49::i;:::-;22711:775:::0;;;;;;;;;:::o;11898:752::-;12055:12;12069;12146:13;12175:7;-1:-1:-1;;;;;12162:29:0;;12192:6;12200;12208;12162:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12146:69;-1:-1:-1;;;;;;12232:19:0;;12228:64;;12276:1;12278;12268:12;;;;;;;12228:64;12305:13;12320;12337:35;12349:6;12357;12365;12337:11;:35::i;:::-;12304:68;;;;12383:17;12410:5;-1:-1:-1;;;;;12403:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12383:47;-1:-1:-1;12383:47:0;12453:20;12465:8;12453:9;:20;:::i;:::-;:35;;;;:::i;:::-;12443:45;-1:-1:-1;12580:12:0;12557:20;12569:8;12557:9;:20;:::i;:::-;:35;;;;:::i;:::-;12547:45;;12083:567;;;;11898:752;;;;;;;;:::o;19203:670::-;19497:16;19515:14;19542:12;19557:37;19565:5;19580:4;19587:6;19557:7;:37::i;:::-;19542:52;;19605:10;19618;:39;;19648:9;19618:39;;;-1:-1:-1;;19618:39:0;19668:71;;-1:-1:-1;;;19668:71:0;;19605:52;;-1:-1:-1;;;;;;19668:18:0;;;;;:71;;19687:10;;19707:4;;19605:52;;19721:8;;19731:1;;19734;;19737;;19668:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19777:88;19796:5;19803:6;19811:9;19822:14;19838:12;19852:2;19856:8;19777:18;:88::i;:::-;19750:115;;;;;;;;19531:342;;19203:670;;;;;;;;;;;;;;:::o;7473:508::-;7922:51;;-1:-1:-1;;;7922:51:0;;7556:12;;-1:-1:-1;;;;;7935:7:0;7922:29;;;;:51;;7952:6;;7959;;7966;;7922:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7915:58;7473:508;-1:-1:-1;;;;7473:508:0:o;7028:347::-;7101:14;7117;7162:6;-1:-1:-1;;;;;7152:16:0;:6;-1:-1:-1;;;;;7152:16:0;;;7144:66;;;;-1:-1:-1;;;7144:66:0;;24644:2:1;7144:66:0;;;24626:21:1;24683:2;24663:18;;;24656:30;24722:34;24702:18;;;24695:62;-1:-1:-1;;;24773:18:1;;;24766:35;24818:19;;7144:66:0;24442:401:1;7144:66:0;7249:6;-1:-1:-1;;;;;7240:15:0;:6;-1:-1:-1;;;;;7240:15:0;;:53;;7278:6;7286;7240:53;;;7259:6;7267;7240:53;7221:72;;-1:-1:-1;7221:72:0;-1:-1:-1;;;;;;7312:20:0;;7304:63;;;;-1:-1:-1;;;7304:63:0;;25050:2:1;7304:63:0;;;25032:21:1;25089:2;25069:18;;;25062:30;25128:32;25108:18;;;25101:60;25178:18;;7304:63:0;24848:354:1;7304:63:0;7028:347;;;;;:::o;14270:1183::-;14563:12;14577;14591:14;14544:8;6568:15;6556:8;:27;;6548:65;;;;-1:-1:-1;;;6548:65:0;;;;;;;:::i;:::-;14639:93:::1;14653:6;14661;14669;14677:14;14693;14709:10;14721;14639:13;:93::i;:::-;14618:114:::0;;-1:-1:-1;14618:114:0;-1:-1:-1;14743:12:0::1;14758:31;14766:6:::0;14774;14782;14758:7:::1;:31::i;:::-;14743:46;;14800:52;14818:6;14826:10;14838:4;14844:7;14800:17;:52::i;:::-;14863;14881:6;14889:10;14901:4;14907:7;14863:17;:52::i;:::-;14984:18;::::0;-1:-1:-1;;;14984:18:0;;-1:-1:-1;;;;;4643:32:1;;;14984:18:0::1;::::0;::::1;4625:51:1::0;14967:14:0::1;::::0;14984:5:::1;:12:::0;;::::1;::::0;::::1;::::0;4598:18:1;;14984::0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14967:35:::0;-1:-1:-1;;;;;;15020:20:0;::::1;15017:418;;15073:20;::::0;-1:-1:-1;;;15073:20:0;;-1:-1:-1;;;;;4643:32:1;;;15073:20:0::1;::::0;::::1;4625:51:1::0;15073:16:0;::::1;::::0;::::1;::::0;4598:18:1;;15073:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15061:32;;15017:418;;;15159:31;::::0;-1:-1:-1;;;15159:31:0;;15184:4:::1;15159:31;::::0;::::1;4625:51:1::0;-1:-1:-1;;;;;15159:16:0;::::1;::::0;::::1;::::0;4598:18:1;;15159:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15212:44;::::0;-1:-1:-1;;;15212:44:0;;15243:4:::1;15212:44;::::0;::::1;8159:34:1::0;-1:-1:-1;;;;;8229:15:1;;;8209:18;;;8202:43;15147::0;;-1:-1:-1;15147:43:0;;15212:22;::::1;::::0;::::1;::::0;8094:18:1;;15212:44:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;15209:150;;;15293:46;::::0;-1:-1:-1;;;15293:46:0;;-1:-1:-1;;;;;25399:32:1;;;15293:46:0::1;::::0;::::1;25381:51:1::0;-1:-1:-1;;25448:18:1;;;25441:34;15293:20:0;::::1;::::0;::::1;::::0;25354:18:1;;15293:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15209:150;15377:42;::::0;-1:-1:-1;;;15377:42:0;;-1:-1:-1;;;;;4643:32:1;;;15377:42:0::1;::::0;::::1;4625:51:1::0;15377:38:0;::::1;::::0;::::1;::::0;4598:18:1;;15377:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15017:418;14926:520;14607:846;14270:1183:::0;;;;;;;;;;;;;;:::o;8954:662::-;9047:11;9060;9084:12;9099:32;9107:7;9116:8;9126:4;9099:7;:32::i;:::-;9204:34;;-1:-1:-1;;;9204:34:0;;-1:-1:-1;;;;;4643:32:1;;;9204:34:0;;;4625:51:1;4643:32;;-1:-1:-1;;;;;9217:7:0;9204:28;;;;;;4598:18:1;;9204:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9200:125;;;9270:43;;-1:-1:-1;;;9270:43:0;;;;;25660:25:1;;;-1:-1:-1;;;;;25721:32:1;;;25701:18;;;25694:60;9270:24:0;;;;;25633:18:1;;9270:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9255:58;;9200:125;9342:33;9350:7;9359:8;9369:5;9342:7;:33::i;:::-;9390:34;;-1:-1:-1;;;9390:34:0;;-1:-1:-1;;;;;4643:32:1;;;9390:34:0;;;4625:51:1;9335:40:0;;-1:-1:-1;9403:7:0;9390:28;;;;;;4598:18:1;;9390:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9386:127;;;9458:43;;-1:-1:-1;;;9458:43:0;;;;;25660:25:1;;;-1:-1:-1;;;;;25721:32:1;;;25701:18;;;25694:60;9458:24:0;;;;;25633:18:1;;9458:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9441:60;;9386:127;9545:14;9530:12;:29;:78;;9586:14;9602:5;9530:78;;;9563:12;9577:4;9530:78;9523:85;;;;;;;8954:662;;;;;;:::o;8491:375::-;8578:13;8593;8620:14;8639:26;8650:6;8658;8639:10;:26::i;:::-;8619:46;;;8677:13;8692;8716:31;8724:6;8732;8740;8716:7;:31::i;:::-;-1:-1:-1;;;;;8710:50:0;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8676:86;;;;;8806:6;-1:-1:-1;;;;;8796:16:0;:6;-1:-1:-1;;;;;8796:16:0;;:62;;8839:8;8849;8796:62;;;8816:8;8826;8796:62;8773:85;;;;-1:-1:-1;8491:375:0;-1:-1:-1;;;;;;;8491:375:0:o;22071:632::-;22236:21;22212:8;6568:15;6556:8;:27;;6548:65;;;;-1:-1:-1;;;6548:65:0;;;;;;;:::i;:::-;22309:4:::1;-1:-1:-1::0;;;;;22283:31:0::1;:6;;22290:1;22283:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;22283:14:0::1;:::i;:::-;-1:-1:-1::0;;;;;22283:31:0::1;;22275:74;;;;-1:-1:-1::0;;;22275:74:0::1;;;;;;;:::i;:::-;22370:32;22384:9;22395:6;;22370:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;22360:42;;22452:12;22421:7;22446:1;22429:7;:14;:18;;;;:::i;:::-;22421:27;;;;;;;;:::i;:::-;;;;;;;:43;;22413:100;;;;-1:-1:-1::0;;;22413:100:0::1;;;;;;;:::i;:::-;22524:4;-1:-1:-1::0;;;;;22524:12:0::1;;22544:7;22552:1;22544:10;;;;;;;;:::i;:::-;;;;;;;22524:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22575:4;-1:-1:-1::0;;;;;22575:13:0::1;;22589:55;22597:6;;22604:1;22597:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;22597:14:0::1;:::i;:::-;22613:6;;22620:1;22613:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;22627:6;;22634:1;22627:9;;;;;;;:::i;22589:55::-;22646:7;22654:1;22646:10;;;;;;;;:::i;:::-;;;;;;;22575:82;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;25399:32:1;;;;25381:51;;25463:2;25448:18;;25441:34;25369:2;25354:18;;25207:274;22575:82:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22568:90;;;;:::i;:::-;22669:26;22675:7;22684:6;;22669:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;22692:2;22669:5;:26::i;:::-;22071:632:::0;;;;;;;;:::o;27233:737::-;27450:8;6568:15;6556:8;:27;;6548:65;;;;-1:-1:-1;;;6548:65:0;;;;;;;:::i;:::-;27471:163:::1;27500:6;;27507:1;27500:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;27500:14:0::1;:::i;:::-;27526:10;27548:55;27556:6;;27563:1;27556:9;;;;;;;:::i;27548:55::-;27615:8;27471:17;:163::i;:::-;27645:18;27673:6:::0;;27680:17:::1;27696:1;27673:6:::0;27680:17:::1;:::i;:::-;27673:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;27666:50;::::0;-1:-1:-1;;;27666:50:0;;-1:-1:-1;;;;;4643:32:1;;;27666:50:0::1;::::0;::::1;4625:51:1::0;27666:46:0;;;::::1;::::0;::::1;::::0;4598:18:1;;27666:50:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27645:71;;27727:46;27762:6;;27770:2;27727:34;:46::i;:::-;27878:12:::0;27860:13;27813:6;;27820:17:::1;27836:1;27813:6:::0;27820:17:::1;:::i;:::-;27813:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;27806:50;::::0;-1:-1:-1;;;27806:50:0;;-1:-1:-1;;;;;4643:32:1;;;27806:50:0::1;::::0;::::1;4625:51:1::0;27806:46:0;;;::::1;::::0;::::1;::::0;4598:18:1;;27806:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:68;;;;:::i;:::-;:84;;27784:178;;;;-1:-1:-1::0;;;27784:178:0::1;;;;;;;:::i;:::-;27460:510;27233:737:::0;;;;;;;:::o;23494:404::-;23688:13;23669:8;6568:15;6556:8;:27;;6548:65;;;;-1:-1:-1;;;6548:65:0;;;;;;;:::i;:::-;23714:114:::1;23732:6;;23739:1;23732:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;23732:14:0::1;:::i;:::-;23748:10;23760:55;23768:6;;23775:1;23768:9;;;;;;;:::i;23760:55::-;23817:7;23825:1;23817:10;;;;;;;;:::i;23714:114::-;23839:26;23845:7;23854:6;;23839:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;-1:-1:-1::0;23883:7:0;;23494:404;-1:-1:-1;;;;;23494:404:0:o;27976:838::-;28201:8;6568:15;6556:8;:27;;6548:65;;;;-1:-1:-1;;;6548:65:0;;;;;;;:::i;:::-;28261:4:::1;-1:-1:-1::0;;;;;28235:31:0::1;:6;;28242:1;28235:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;28235:14:0::1;:::i;:::-;-1:-1:-1::0;;;;;28235:31:0::1;;28227:74;;;;-1:-1:-1::0;;;28227:74:0::1;;;;;;;:::i;:::-;28312:13;28328:9;28312:25;;28348:4;-1:-1:-1::0;;;;;28348:12:0::1;;28368:8;28348:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28397:4;-1:-1:-1::0;;;;;28397:13:0::1;;28411:55;28419:6;;28426:1;28419:9;;;;;;;:::i;28411:55::-;28397:80;::::0;-1:-1:-1;;;;;;28397:80:0::1;::::0;;;;;;-1:-1:-1;;;;;25399:32:1;;;28397:80:0::1;::::0;::::1;25381:51:1::0;25448:18;;;25441:34;;;25354:18;;28397:80:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28390:88;;;;:::i;:::-;28489:18;28517:6:::0;;28524:17:::1;28540:1;28517:6:::0;28524:17:::1;:::i;:::-;28517:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;28510:50;::::0;-1:-1:-1;;;28510:50:0;;-1:-1:-1;;;;;4643:32:1;;;28510:50:0::1;::::0;::::1;4625:51:1::0;28510:46:0;;;::::1;::::0;::::1;::::0;4598:18:1;;28510:50:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28489:71;;28571:46;28606:6;;28614:2;28571:34;:46::i;:::-;28722:12:::0;28704:13;28657:6;;28664:17:::1;28680:1;28657:6:::0;28664:17:::1;:::i;:::-;28657:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;28650:50;::::0;-1:-1:-1;;;28650:50:0;;-1:-1:-1;;;;;4643:32:1;;;28650:50:0::1;::::0;::::1;4625:51:1::0;28650:46:0;;;::::1;::::0;::::1;::::0;4598:18:1;;28650:50:0::1;4467:215:1::0;28820:813:0;29052:8;6568:15;6556:8;:27;;6548:65;;;;-1:-1:-1;;;6548:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29126:4:0::1;29086:45;:6:::0;;29093:17:::1;29109:1;29086:6:::0;29093:17:::1;:::i;:::-;29086:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29086:45:0::1;;29078:88;;;;-1:-1:-1::0;;;29078:88:0::1;;;;;;;:::i;:::-;29177:136;29209:6;;29216:1;29209:9;;;;;;;:::i;29177:136::-;29324:57;29359:6;;29375:4;29324:34;:57::i;:::-;29409:46;::::0;-1:-1:-1;;;29409:46:0;;29449:4:::1;29409:46;::::0;::::1;4625:51:1::0;29392:14:0::1;::::0;29424:4:::1;-1:-1:-1::0;;;;;29409:31:0::1;::::0;::::1;::::0;4598:18:1;;29409:46:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29392:63;;29487:12;29474:9;:25;;29466:82;;;;-1:-1:-1::0;;;29466:82:0::1;;;;;;;:::i;:::-;29559:24;::::0;-1:-1:-1;;;29559:24:0;;::::1;::::0;::::1;15685:25:1::0;;;29559:4:0::1;-1:-1:-1::0;;;;;29559:13:0::1;::::0;::::1;::::0;15658:18:1;;29559:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29594:31;29611:2;29615:9;29594:16;:31::i;9704:569::-:0;9786:21;9845:1;9828:6;:13;:18;;9820:61;;;;-1:-1:-1;;;9820:61:0;;;;;;;:::i;:::-;9913:13;;:15;;9927:1;9913:15;:::i;:::-;9902:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9902:27:0;;9892:37;;9953:8;9940:7;9948:1;9940:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;9977:6;9972:294;9993:6;:13;9989:1;:17;9972:294;;;10028:12;10043:55;10051:6;10058:1;10051:9;;;;;;;;:::i;:::-;;;;;;;:14;;;10067:6;10074:1;10067:9;;;;;;;;:::i;:::-;;;;;;;:12;;;10081:6;10088:1;10081:9;;;;;;;;:::i;10043:55::-;10117:34;;-1:-1:-1;;;10117:34:0;;-1:-1:-1;;;;;4643:32:1;;;10117:34:0;;;4625:51:1;10028:70:0;;-1:-1:-1;10130:7:0;10117:28;;;;;;4598:18:1;;10117:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10113:142;;;10193:4;-1:-1:-1;;;;;10187:24:0;;10212:7;10220:1;10212:10;;;;;;;;:::i;:::-;;;;;;;10224:6;10231:1;10224:9;;;;;;;;:::i;:::-;;;;;;;:14;;;10187:52;;;;;;;;;;;;;;;25660:25:1;;;-1:-1:-1;;;;;25721:32:1;25716:2;25701:18;;25694:60;25648:2;25633:18;;25486:274;10187:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10172:7;10180:3;:1;10182;10180:3;:::i;:::-;10172:12;;;;;;;;:::i;:::-;;;;;;:67;;;;;10113:142;-1:-1:-1;10008:3:0;;;;:::i;:::-;;;;9972:294;;;;9704:569;;;;:::o;10408:1482::-;10597:12;10611;10625:14;10704:13;10733:7;-1:-1:-1;;;;;10720:29:0;;10750:6;10758;10766;10720:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10704:69;-1:-1:-1;10785:13:0;;;-1:-1:-1;;;;;10869:19:0;;;10865:167;;10927:5;-1:-1:-1;;;;;10920:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10905:42;;10985:35;10997:6;11005;11013;10985:11;:35::i;:::-;10962:58;;-1:-1:-1;10962:58:0;-1:-1:-1;10865:167:0;11046:13;;:30;;;;-1:-1:-1;11063:13:0;;11046:30;11042:841;;;11115:14;;-1:-1:-1;11131:14:0;;-1:-1:-1;6339:5:0;11173:28;11183:17;11131:14;11115;11183:17;:::i;:::-;11173:9;:28::i;:::-;:48;;;;:::i;:::-;11161:60;;11042:841;;;11256:19;11278:50;11293:14;11309:8;11319;11278:14;:50::i;:::-;11256:72;;11365:14;11347;:32;11343:529;;11422:14;;-1:-1:-1;11438:14:0;-1:-1:-1;11438:14:0;11484:78;11518:8;11493:22;11503:12;11422:14;11493:22;:::i;:::-;:33;;;;:::i;:::-;11553:8;11528:22;11538:12;11528:7;:22;:::i;:::-;:33;;;;:::i;:::-;11484:8;:78::i;:::-;11472:90;;11343:529;;;11603:19;11625:50;11640:14;11656:8;11666;11625:14;:50::i;:::-;11603:72;-1:-1:-1;11732:14:0;;-1:-1:-1;11603:72:0;;-1:-1:-1;11778:78:0;11812:8;11787:22;11797:12;11603:72;11787:22;:::i;:::-;:33;;;;:::i;:::-;11847:8;11822:22;11832:12;11822:7;:22;:::i;11778:78::-;11766:90;;11584:288;11343:529;11239:644;11042:841;10641:1249;;;;10408:1482;;;;;;;;;:::o;18494:701::-;18805:12;18819;18844;18859:31;18867:6;18875;18883;18859:7;:31::i;:::-;18844:46;;18916:10;18929;:39;;18959:9;18929:39;;;-1:-1:-1;;18929:39:0;18983:71;;-1:-1:-1;;;18983:71:0;;18916:52;;-1:-1:-1;;;;;;18983:18:0;;;;;:71;;19002:10;;19022:4;;18916:52;;19036:8;;19046:1;;19049;;19052;;18983:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18901:165;19099:88;19115:6;19123;19131;19139:9;19150:10;19162;19174:2;19178:8;19099:15;:88::i;:::-;19078:109;;;;;;;;18833:362;18494:701;;;;;;;;;;;;;;;:::o;15461:1436::-;15719:16;15737:14;15753;15700:8;6568:15;6556:8;:27;;6548:65;;;;-1:-1:-1;;;6548:65:0;;;;;;;:::i;:::-;15807:206:::1;15835:5;15863:4;15883:6;15904:18;15937:9;15961:14;15990:12;15807:13;:206::i;:::-;15780:233:::0;;-1:-1:-1;15780:233:0;-1:-1:-1;16024:12:0::1;16039:37;16047:5:::0;16062:4:::1;16069:6:::0;16039:7:::1;:37::i;:::-;16024:52;;16087:55;16105:5;16112:10;16124:4;16130:11;16087:17;:55::i;:::-;16153:4;-1:-1:-1::0;;;;;16153:12:0::1;;16173:9;16153:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;16203:30:0::1;::::0;-1:-1:-1;;;16203:30:0;;-1:-1:-1;;;;;25399:32:1;;;16203:30:0::1;::::0;::::1;25381:51:1::0;25448:18;;;25441:34;;;16203:4:0::1;:13;::::0;::::1;::::0;25354:18:1;;16203:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16196:38;;;;:::i;:::-;16303:18;::::0;-1:-1:-1;;;16303:18:0;;-1:-1:-1;;;;;4643:32:1;;;16303:18:0::1;::::0;::::1;4625:51:1::0;16286:14:0::1;::::0;16303:5:::1;:12:::0;;::::1;::::0;::::1;::::0;4598:18:1;;16303::0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16286:35:::0;-1:-1:-1;;;;;;16339:20:0;::::1;16336:418;;16392:20;::::0;-1:-1:-1;;;16392:20:0;;-1:-1:-1;;;;;4643:32:1;;;16392:20:0::1;::::0;::::1;4625:51:1::0;16392:16:0;::::1;::::0;::::1;::::0;4598:18:1;;16392:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16380:32;;16336:418;;;16478:31;::::0;-1:-1:-1;;;16478:31:0;;16503:4:::1;16478:31;::::0;::::1;4625:51:1::0;-1:-1:-1;;;;;16478:16:0;::::1;::::0;::::1;::::0;4598:18:1;;16478:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16531:44;::::0;-1:-1:-1;;;16531:44:0;;16562:4:::1;16531:44;::::0;::::1;8159:34:1::0;-1:-1:-1;;;;;8229:15:1;;;8209:18;;;8202:43;16466::0;;-1:-1:-1;16466:43:0;;16531:22;::::1;::::0;::::1;::::0;8094:18:1;;16531:44:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;16528:150;;;16612:46;::::0;-1:-1:-1;;;16612:46:0;;-1:-1:-1;;;;;25399:32:1;;;16612:46:0::1;::::0;::::1;25381:51:1::0;-1:-1:-1;;25448:18:1;;;25441:34;16612:20:0;::::1;::::0;::::1;::::0;25354:18:1;;16612:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16528:150;16696:42;::::0;-1:-1:-1;;;16696:42:0;;-1:-1:-1;;;;;4643:32:1;;;16696:42:0::1;::::0;::::1;4625:51:1::0;16696:38:0;::::1;::::0;::::1;::::0;4598:18:1;;16696:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16336:418;16245:520;16827:9;16815;:21;16811:78;;;16838:51;16855:10;16867:21;16879:9:::0;16867::::1;:21;:::i;:::-;16838:16;:51::i;:::-;15769:1128;15461:1436:::0;;;;;;;;;;;;:::o;17813:673::-;18055:16;18073:14;18036:8;6568:15;6556:8;:27;;6548:65;;;;-1:-1:-1;;;6548:65:0;;;;;;;:::i;:::-;18127:226:::1;18157:5;18185:4;18205:6;18226:9;18250:14;18279:12;18314:4;18334:8;18127:15;:226::i;:::-;18100:253:::0;;-1:-1:-1;18100:253:0;-1:-1:-1;18364:37:0::1;18378:5:::0;18385:2;18100:253;18364:13:::1;:37::i;:::-;18412:24;::::0;-1:-1:-1;;;18412:24:0;;::::1;::::0;::::1;15685:25:1::0;;;18412:4:0::1;-1:-1:-1::0;;;;;18412:13:0::1;::::0;::::1;::::0;15658:18:1;;18412:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18447:31;18464:2;18468:9;18447:16;:31::i;:::-;17813:673:::0;;;;;;;;;;;:::o;25178:752::-;25501:16;25519:14;25546:12;25561:37;25569:5;25584:4;25591:6;25561:7;:37::i;:::-;25546:52;;25609:10;25622;:39;;25652:9;25622:39;;;-1:-1:-1;;25622:39:0;25672:71;;-1:-1:-1;;;25672:71:0;;25609:52;;-1:-1:-1;;;;;;25672:18:0;;;;;:71;;25691:10;;25711:4;;25609:52;;25725:8;;25735:1;;25738;;25741;;25672:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25781:141;25843:5;25850:6;25858:9;25869:14;25885:12;25899:2;25903:8;25781:47;:141::i;10281:119::-;10358:34;;-1:-1:-1;;;10358:34:0;;-1:-1:-1;;;;;4643:32:1;;;10358:34:0;;;4625:51:1;10334:4:0;;10371:7;10358:28;;;;;;4598:18:1;;10358:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10351:41;10281:119;-1:-1:-1;;10281:119:0:o;21476:587::-;21683:21;21664:8;6568:15;6556:8;:27;;6548:65;;;;-1:-1:-1;;;6548:65:0;;;;;;;:::i;:::-;21727:31:::1;21741:8;21751:6;;21727:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;21717:41;;21808:12;21777:7;21802:1;21785:7;:14;:18;;;;:::i;:::-;21777:27;;;;;;;;:::i;:::-;;;;;;;:43;;21769:100;;;;-1:-1:-1::0;;;21769:100:0::1;;;;;;;:::i;:::-;21880:138;21912:6;;21919:1;21912:9;;;;;;;:::i;21880:138::-;22029:26;22035:7;22044:6;;22029:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;24443:729:::0;24714:16;24732:14;24695:8;6568:15;6556:8;:27;;6548:65;;;;-1:-1:-1;;;6548:65:0;;;;;;;:::i;:::-;24786:226:::1;24816:5;24844:4;24864:6;24885:9;24909:14;24938:12;24973:4;24993:8;24786:15;:226::i;:::-;25048:38;::::0;-1:-1:-1;;;25048:38:0;;25080:4:::1;25048:38;::::0;::::1;4625:51:1::0;24759:253:0;;-1:-1:-1;24759:253:0;-1:-1:-1;25023:64:0::1;::::0;25037:5;;25044:2;;-1:-1:-1;;;;;25048:23:0;::::1;::::0;::::1;::::0;4598:18:1;;25048:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25023:13;:64::i;30251:424::-:0;30382:1;30362:5;-1:-1:-1;;;;;30362:17:0;;:21;30354:65;;;;-1:-1:-1;;;30354:65:0;;26551:2:1;30354:65:0;;;26533:21:1;26590:2;26570:18;;;26563:30;26629:33;26609:18;;;26602:61;26680:18;;30354:65:0;26349:355:1;30354:65:0;30477:69;;;-1:-1:-1;;;;;18876:15:1;;;30477:69:0;;;18858:34:1;18928:15;;;18908:18;;;18901:43;18960:18;;;;18953:34;;;30477:69:0;;;;;;;;;;18793:18:1;;;;30477:69:0;;;;;;;-1:-1:-1;;;;;30477:69:0;-1:-1:-1;;;30477:69:0;;;30466:81;;-1:-1:-1;;;;30466:10:0;;;;:81;;30477:69;30466:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30430:117;;;;30566:7;:57;;;;-1:-1:-1;30578:11:0;;:16;;:44;;;30609:4;30598:24;;;;;;;;;;;;:::i;:::-;30558:109;;;;-1:-1:-1;;;30558:109:0;;;;;;;:::i;:::-;30343:332;;30251:424;;;;:::o;19990:680::-;20097:6;20092:571;20113:6;:13;20109:1;:17;20092:571;;;20149:14;20168:40;20179:6;20186:1;20179:9;;;;;;;;:::i;:::-;;;;;;;:14;;;20195:6;20202:1;20195:9;;;;;;;;:::i;:::-;;;;;;;:12;;;20168:10;:40::i;:::-;-1:-1:-1;20148:60:0;-1:-1:-1;20223:14:0;20240:7;20248:5;:1;20252;20248:5;:::i;:::-;20240:14;;;;;;;;:::i;:::-;;;;;;;20223:31;;20270:15;20287;20324:6;-1:-1:-1;;;;;20306:24:0;:6;20313:1;20306:9;;;;;;;;:::i;:::-;;;;;;;:14;;;-1:-1:-1;;;;;20306:24:0;;:70;;20357:9;20373:1;20306:70;;;20339:1;20343:9;20306:70;20269:107;;;;20391:10;20424:1;20408:6;:13;:17;;;;:::i;:::-;20404:1;:21;:91;;20492:3;20404:91;;;20428:61;20436:6;20443:3;:1;20445;20443:3;:::i;:::-;20436:11;;;;;;;;:::i;:::-;;;;;;;:16;;;20454:6;20461:1;20463;20461:3;;;;:::i;:::-;20454:11;;;;;;;;:::i;:::-;;;;;;;:14;;;20470:6;20477:1;20479;20477:3;;;;:::i;:::-;20470:11;;;;;;;;:::i;20428:61::-;20391:104;;20516:55;20524:6;20531:1;20524:9;;;;;;;;:::i;:::-;;;;;;;:14;;;20540:6;20547:1;20540:9;;;;;;;;:::i;:::-;;;;;;;:12;;;20554:6;20561:1;20554:9;;;;;;;;:::i;20516:55::-;-1:-1:-1;;;;;20510:67:0;;20596:10;20608;20620:2;20634:1;20624:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20624:12:0;;20510:141;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20133:530;;;;;20128:3;;;;;:::i;:::-;;;;20092:571;;;;19990:680;;;:::o;29643:196::-;29752:12;;;29714;29752;;;;;;;;;-1:-1:-1;;;;;29731:7:0;;;29745:5;;29731:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29713:52;;;29784:7;29776:55;;;;-1:-1:-1;;;29776:55:0;;28490:2:1;29776:55:0;;;28472:21:1;28529:2;28509:18;;;28502:30;28568:34;28548:18;;;28541:62;-1:-1:-1;;;28619:18:1;;;28612:33;28662:19;;29776:55:0;28288:399:1;29776:55:0;29702:137;29643:196;;:::o;12658:1604::-;12890:12;12904;12955:10;12937:14;:28;;12929:82;;;;-1:-1:-1;;;12929:82:0;;28894:2:1;12929:82:0;;;28876:21:1;28933:2;28913:18;;;28906:30;28972:34;28952:18;;;28945:62;-1:-1:-1;;;29023:18:1;;;29016:39;29072:19;;12929:82:0;28692:405:1;12929:82:0;13048:10;13030:14;:28;;13022:82;;;;-1:-1:-1;;;13022:82:0;;29304:2:1;13022:82:0;;;29286:21:1;29343:2;29323:18;;;29316:30;29382:34;29362:18;;;29355:62;-1:-1:-1;;;29433:18:1;;;29426:39;29482:19;;13022:82:0;29102:405:1;13022:82:0;13183:53;;-1:-1:-1;;;13183:53:0;;13167:13;;-1:-1:-1;;;;;13196:7:0;13183:29;;;;:53;;13213:6;;13221;;13229;;13183:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13167:69;-1:-1:-1;;;;;;13251:19:0;;13247:116;;13295:56;;-1:-1:-1;;;13295:56:0;;-1:-1:-1;;;;;13308:7:0;13295:32;;;;:56;;13328:6;;13336;;13344;;13295:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13287:64;;13247:116;13374:13;13389;13406:35;13418:6;13426;13434;13406:11;:35::i;:::-;13373:68;;;;13456:8;13468:1;13456:13;:30;;;;-1:-1:-1;13473:13:0;;13456:30;13452:803;;;13525:14;;-1:-1:-1;13541:14:0;;-1:-1:-1;13452:803:0;;;13589:19;13611:50;13626:14;13642:8;13652;13611:14;:50::i;:::-;13589:72;;13698:14;13680;:32;13676:568;;13759:10;13741:14;:28;;13733:80;;;;-1:-1:-1;;;13733:80:0;;;;;;;:::i;:::-;13854:14;;-1:-1:-1;13870:14:0;-1:-1:-1;13870:14:0;13676:568;;;13926:19;13948:50;13963:14;13979:8;13989;13948:14;:50::i;:::-;13926:72;;14042:14;14024;:32;;14017:40;;;;:::i;:::-;14102:10;14084:14;:28;;14076:80;;;;-1:-1:-1;;;14076:80:0;;;;;;;:::i;:::-;14197:14;-1:-1:-1;14213:14:0;;-1:-1:-1;13676:568:0;13574:681;13452:803;12918:1344;;;12658:1604;;;;;;;;;;:::o;26075:1152::-;26190:6;26185:1035;26198:17;;;26185:1035;;;26235:13;26250:14;26269:6;;26276:1;26269:9;;;;;;;:::i;:::-;:14;;;:9;;;;;:14;;;;-1:-1:-1;26269:14:0;:::i;:::-;26285:6;;26292:1;26285:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;26234:64;;;;26314:14;26333:25;26344:5;26351:6;26333:10;:25::i;:::-;26313:45;;;26373:10;26392:55;26400:6;;26407:1;26400:9;;;;;;;:::i;:::-;:14;;;:9;;;;;:14;;;;-1:-1:-1;26400:14:0;:::i;:::-;26416:6;;26423:1;26416:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;26430:6;;26437:1;26430:9;;;;;;;:::i;26392:55::-;26373:75;;26463:16;26494:17;26582:13;26597;26615:4;-1:-1:-1;;;;;26615:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26581:52;;;;;26649:17;26680:6;-1:-1:-1;;;;;26671:15:0;:5;-1:-1:-1;;;;;26671:15:0;;:61;;26713:8;26723;26671:61;;;26690:8;26700;26671:61;-1:-1:-1;26761:38:0;;-1:-1:-1;;;26761:38:0;;-1:-1:-1;;;;;4643:32:1;;;26761:38:0;;;4625:51:1;26648:84:0;;-1:-1:-1;26648:84:0;;26761:23;;;;;4598:18:1;;26761:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;;;:::i;:::-;26747:69;;26849:40;26862:11;26875:5;26882:6;26849:12;:40::i;:::-;26831:58;;;;;26526:379;;;26920:15;26937;26965:6;-1:-1:-1;;;;;26956:15:0;:5;-1:-1:-1;;;;;26956:15:0;;:67;;27001:12;27020:1;26956:67;;;26980:1;26984:12;26956:67;26919:104;;-1:-1:-1;26919:104:0;-1:-1:-1;27038:10:0;27055:17;27071:1;27055:6;:17;:::i;:::-;27051:1;:21;:91;;27139:3;27051:91;;;27075:61;27083:6;;27090:3;:1;27092;27090:3;:::i;:::-;27083:11;;;;;;;:::i;:::-;:16;;;:11;;;;;:16;;;;-1:-1:-1;27083:16:0;:::i;:::-;27101:6;;27108:3;:1;27110;27108:3;:::i;:::-;27101:11;;;;;;;:::i;:::-;;;;;;:14;;;;;;;;;;:::i;:::-;27117:6;;27124:3;:1;27126;27124:3;:::i;:::-;27117:11;;;;;;;:::i;27075:61::-;27195:12;;;27205:1;27195:12;;;;;;;;;-1:-1:-1;;;27157:51:0;;;27038:104;;-1:-1:-1;;;;;;27157:9:0;;;;;:51;;27167:10;;27179;;27038:104;;27157:51;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26222:998;;;;;;;;;26217:3;;;;;:::i;:::-;;;;26185:1035;;5284:303;5329:6;5356:1;5352;:5;5348:232;;;-1:-1:-1;5378:1:0;5394:6;5403:5;5407:1;5378;5403:5;:::i;:::-;:9;;5411:1;5403:9;:::i;:::-;5394:18;;5427:92;5438:1;5434;:5;5427:92;;;5464:1;-1:-1:-1;5464:1:0;5502;5464;5489:5;5464:1;5489;:5;:::i;:::-;:9;;;;:::i;:::-;5488:15;;;;:::i;:::-;5484:19;;5427:92;;;5359:171;5284:303;;;:::o;5348:232::-;5540:6;;5536:44;;-1:-1:-1;5567:1:0;5536:44;5284:303;;;:::o;8100:327::-;8191:12;8234:1;8224:7;:11;8216:61;;;;-1:-1:-1;;;8216:61:0;;29714:2:1;8216:61:0;;;29696:21:1;29753:2;29733:18;;;29726:30;29792:34;29772:18;;;29765:62;-1:-1:-1;;;29843:18:1;;;29836:35;29888:19;;8216:61:0;29512:401:1;8216:61:0;8307:1;8296:8;:12;:28;;;;;8323:1;8312:8;:12;8296:28;8288:81;;;;-1:-1:-1;;;8288:81:0;;30120:2:1;8288:81:0;;;30102:21:1;30159:2;30139:18;;;30132:30;30198:34;30178:18;;;30171:62;-1:-1:-1;;;30249:18:1;;;30242:38;30297:19;;8288:81:0;29918:404:1;8288:81:0;8411:8;8390:18;8400:8;8390:7;:18;:::i;:::-;:29;;;;:::i;5181:97::-;5233:4;5261:1;5257;:5;:13;;5269:1;5257:13;;;5265:1;5257:13;5250:20;5181:97;-1:-1:-1;;;5181:97:0:o;29847:396::-;29960:1;29940:5;-1:-1:-1;;;;;29940:17:0;;:21;29932:65;;;;-1:-1:-1;;;29932:65:0;;26551:2:1;29932:65:0;;;26533:21:1;26590:2;26570:18;;;26563:30;26629:33;26609:18;;;26602:61;26680:18;;29932:65:0;26349:355:1;29932:65:0;30055:59;;;-1:-1:-1;;;;;25399:32:1;;;30055:59:0;;;25381:51:1;25448:18;;;;25441:34;;;30055:59:0;;;;;;;;;;25354:18:1;;;;30055:59:0;;;;;;;-1:-1:-1;;;;;30055:59:0;-1:-1:-1;;;30055:59:0;;;30044:71;;-1:-1:-1;;;;30044:10:0;;;;:71;;30055:59;30044:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30008:107;;;;30134:7;:57;;;;-1:-1:-1;30146:11:0;;:16;;:44;;;30177:4;30166:24;;;;;;;;;;;;:::i;:::-;30126:109;;;;-1:-1:-1;;;30126:109:0;;;;;;;:::i;:::-;29921:322;;29847:396;;;:::o;14:127:1:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:131;-1:-1:-1;;;;;221:31:1;;211:42;;201:70;;267:1;264;257:12;201:70;146:131;:::o;282:134::-;350:20;;379:31;350:20;379:31;:::i;421:118::-;507:5;500:13;493:21;486:5;483:32;473:60;;529:1;526;519:12;544:941;663:6;671;679;687;695;703;711;719;772:3;760:9;751:7;747:23;743:33;740:53;;;789:1;786;779:12;740:53;828:9;815:23;847:31;872:5;847:31;:::i;:::-;897:5;-1:-1:-1;954:2:1;939:18;;926:32;967:33;926:32;967:33;:::i;:::-;1019:7;-1:-1:-1;1078:2:1;1063:18;;1050:32;1091:30;1050:32;1091:30;:::i;:::-;1140:7;-1:-1:-1;1194:2:1;1179:18;;1166:32;;-1:-1:-1;1245:3:1;1230:19;;1217:33;;-1:-1:-1;1297:3:1;1282:19;;1269:33;;-1:-1:-1;1354:3:1;1339:19;;1326:33;1368;1326;1368;:::i;:::-;1420:7;1410:17;;;1474:3;1463:9;1459:19;1446:33;1436:43;;544:941;;;;;;;;;;;:::o;1743:872::-;1853:6;1861;1869;1877;1885;1893;1901;1954:3;1942:9;1933:7;1929:23;1925:33;1922:53;;;1971:1;1968;1961:12;1922:53;2007:9;1994:23;1984:33;;2064:2;2053:9;2049:18;2036:32;2026:42;;2118:2;2107:9;2103:18;2090:32;2131:31;2156:5;2131:31;:::i;:::-;2181:5;-1:-1:-1;2238:2:1;2223:18;;2210:32;2251:33;2210:32;2251:33;:::i;:::-;2303:7;-1:-1:-1;2362:3:1;2347:19;;2334:33;2376:30;2334:33;2376:30;:::i;:::-;2425:7;-1:-1:-1;2484:3:1;2469:19;;2456:33;2498;2456;2498;:::i;:::-;2550:7;2540:17;;;2604:3;2593:9;2589:19;2576:33;2566:43;;1743:872;;;;;;;;;;:::o;2620:632::-;2791:2;2843:21;;;2913:13;;2816:18;;;2935:22;;;2762:4;;2791:2;3014:15;;;;2988:2;2973:18;;;2762:4;3057:169;3071:6;3068:1;3065:13;3057:169;;;3132:13;;3120:26;;3201:15;;;;3166:12;;;;3093:1;3086:9;3057:169;;;-1:-1:-1;3243:3:1;;2620:632;-1:-1:-1;;;;;;2620:632:1:o;3257:384::-;3334:8;3344:6;3398:3;3391:4;3383:6;3379:17;3375:27;3365:55;;3416:1;3413;3406:12;3365:55;-1:-1:-1;3439:20:1;;3482:18;3471:30;;3468:50;;;3514:1;3511;3504:12;3468:50;3551:4;3543:6;3539:17;3527:29;;3614:3;3607:4;3599;3591:6;3587:17;3579:6;3575:30;3571:41;3568:50;3565:70;;;3631:1;3628;3621:12;3646:816;3792:6;3800;3808;3816;3824;3832;3885:3;3873:9;3864:7;3860:23;3856:33;3853:53;;;3902:1;3899;3892:12;3853:53;3938:9;3925:23;3915:33;;3995:2;3984:9;3980:18;3967:32;3957:42;;4050:2;4039:9;4035:18;4022:32;4077:18;4069:6;4066:30;4063:50;;;4109:1;4106;4099:12;4063:50;4148:84;4224:7;4215:6;4204:9;4200:22;4148:84;:::i;:::-;4251:8;;-1:-1:-1;4122:110:1;-1:-1:-1;;4336:2:1;4321:18;;4308:32;4349:31;4308:32;4349:31;:::i;:::-;4399:5;4389:15;;;4451:3;4440:9;4436:19;4423:33;4413:43;;3646:816;;;;;;;;:::o;4687:592::-;4770:6;4778;4786;4794;4847:3;4835:9;4826:7;4822:23;4818:33;4815:53;;;4864:1;4861;4854:12;4815:53;4903:9;4890:23;4922:31;4947:5;4922:31;:::i;:::-;4972:5;-1:-1:-1;5029:2:1;5014:18;;5001:32;5042:33;5001:32;5042:33;:::i;:::-;5094:7;-1:-1:-1;5153:2:1;5138:18;;5125:32;5166:30;5125:32;5166:30;:::i;:::-;4687:592;;;;-1:-1:-1;5215:7:1;;5269:2;5254:18;5241:32;;-1:-1:-1;;4687:592:1:o;5284:156::-;5350:20;;5410:4;5399:16;;5389:27;;5379:55;;5430:1;5427;5420:12;5445:1146;5586:6;5594;5602;5610;5618;5626;5634;5642;5650;5658;5666:7;5720:3;5708:9;5699:7;5695:23;5691:33;5688:53;;;5737:1;5734;5727:12;5688:53;5776:9;5763:23;5795:31;5820:5;5795:31;:::i;:::-;5845:5;-1:-1:-1;5902:2:1;5887:18;;5874:32;5915:30;5874:32;5915:30;:::i;:::-;5964:7;-1:-1:-1;6018:2:1;6003:18;;5990:32;;-1:-1:-1;6069:2:1;6054:18;;6041:32;;-1:-1:-1;6120:3:1;6105:19;;6092:33;;-1:-1:-1;6177:3:1;6162:19;;6149:33;6191;6149;6191;:::i;:::-;6243:7;-1:-1:-1;6297:3:1;6282:19;;6269:33;;-1:-1:-1;6354:3:1;6339:19;;6326:33;6368:30;6326:33;6368:30;:::i;:::-;6417:7;-1:-1:-1;6443:37:1;6475:3;6460:19;;6443:37;:::i;:::-;6433:47;;6527:3;6516:9;6512:19;6499:33;6489:43;;6580:3;6569:9;6565:19;6552:33;6541:44;;5445:1146;;;;;;;;;;;;;;:::o;6818:523::-;6892:6;6900;6908;6961:2;6949:9;6940:7;6936:23;6932:32;6929:52;;;6977:1;6974;6967:12;6929:52;7016:9;7003:23;7035:31;7060:5;7035:31;:::i;:::-;7085:5;-1:-1:-1;7142:2:1;7127:18;;7114:32;7155:33;7114:32;7155:33;:::i;:::-;7207:7;-1:-1:-1;7266:2:1;7251:18;;7238:32;7279:30;7238:32;7279:30;:::i;:::-;7328:7;7318:17;;;6818:523;;;;;:::o;7554:388::-;7622:6;7630;7683:2;7671:9;7662:7;7658:23;7654:32;7651:52;;;7699:1;7696;7689:12;7651:52;7738:9;7725:23;7757:31;7782:5;7757:31;:::i;:::-;7807:5;-1:-1:-1;7864:2:1;7849:18;;7836:32;7877:33;7836:32;7877:33;:::i;:::-;7929:7;7919:17;;;7554:388;;;;;:::o;8256:1010::-;8384:6;8392;8400;8408;8416;8424;8432;8440;8448;8501:3;8489:9;8480:7;8476:23;8472:33;8469:53;;;8518:1;8515;8508:12;8469:53;8557:9;8544:23;8576:31;8601:5;8576:31;:::i;:::-;8626:5;-1:-1:-1;8683:2:1;8668:18;;8655:32;8696:33;8655:32;8696:33;:::i;:::-;8748:7;-1:-1:-1;8807:2:1;8792:18;;8779:32;8820:30;8779:32;8820:30;:::i;:::-;8869:7;-1:-1:-1;8923:2:1;8908:18;;8895:32;;-1:-1:-1;8974:3:1;8959:19;;8946:33;;-1:-1:-1;9026:3:1;9011:19;;8998:33;;-1:-1:-1;9078:3:1;9063:19;;9050:33;;-1:-1:-1;9135:3:1;9120:19;;9107:33;9149;9107;9149;:::i;:::-;9201:7;9191:17;;;9255:3;9244:9;9240:19;9227:33;9217:43;;8256:1010;;;;;;;;;;;:::o;9595:456::-;9672:6;9680;9688;9741:2;9729:9;9720:7;9716:23;9712:32;9709:52;;;9757:1;9754;9747:12;9709:52;9793:9;9780:23;9770:33;;9853:2;9842:9;9838:18;9825:32;9866:31;9891:5;9866:31;:::i;:::-;9916:5;-1:-1:-1;9973:2:1;9958:18;;9945:32;9986:33;9945:32;9986:33;:::i;10319:747::-;10456:6;10464;10472;10480;10488;10541:3;10529:9;10520:7;10516:23;10512:33;10509:53;;;10558:1;10555;10548:12;10509:53;10594:9;10581:23;10571:33;;10655:2;10644:9;10640:18;10627:32;10682:18;10674:6;10671:30;10668:50;;;10714:1;10711;10704:12;10668:50;10753:84;10829:7;10820:6;10809:9;10805:22;10753:84;:::i;:::-;10856:8;;-1:-1:-1;10727:110:1;-1:-1:-1;;10941:2:1;10926:18;;10913:32;10954:31;10913:32;10954:31;:::i;:::-;10319:747;;;;-1:-1:-1;10319:747:1;;11056:2;11041:18;11028:32;;10319:747;-1:-1:-1;;10319:747:1:o;11071:127::-;11132:10;11127:3;11123:20;11120:1;11113:31;11163:4;11160:1;11153:15;11187:4;11184:1;11177:15;11203:275;11274:2;11268:9;11339:2;11320:13;;-1:-1:-1;;11316:27:1;11304:40;;11374:18;11359:34;;11395:22;;;11356:62;11353:88;;;11421:18;;:::i;:::-;11457:2;11450:22;11203:275;;-1:-1:-1;11203:275:1:o;11483:183::-;11543:4;11576:18;11568:6;11565:30;11562:56;;;11598:18;;:::i;:::-;-1:-1:-1;11643:1:1;11639:14;11655:4;11635:25;;11483:183::o;11671:1410::-;11833:6;11841;11849;11857;11865;11918:3;11906:9;11897:7;11893:23;11889:33;11886:53;;;11935:1;11932;11925:12;11886:53;11975:9;11962:23;12004:18;12045:2;12037:6;12034:14;12031:34;;;12061:1;12058;12051:12;12031:34;12099:6;12088:9;12084:22;12074:32;;12144:7;12137:4;12133:2;12129:13;12125:27;12115:55;;12166:1;12163;12156:12;12115:55;12202:2;12189:16;12224:4;12248:60;12264:43;12304:2;12264:43;:::i;:::-;12248:60;:::i;:::-;12342:15;;;12424:1;12420:10;;;;12412:19;;12408:28;;;12373:12;;;;12448:19;;;12445:39;;;12480:1;12477;12470:12;12445:39;12504:11;;;;12524:142;12540:6;12535:3;12532:15;12524:142;;;12606:17;;12594:30;;12557:12;;;;12644;;;;12524:142;;;12685:5;-1:-1:-1;;12728:18:1;;12715:32;;-1:-1:-1;;12759:16:1;;;12756:36;;;12788:1;12785;12778:12;12756:36;;12827:86;12905:7;12894:8;12883:9;12879:24;12827:86;:::i;:::-;12932:8;;-1:-1:-1;12801:112:1;-1:-1:-1;12986:38:1;;-1:-1:-1;13020:2:1;13005:18;;12986:38;:::i;13086:752::-;13138:5;13186:4;13174:9;13169:3;13165:19;13161:30;13158:50;;;13204:1;13201;13194:12;13158:50;13237:2;13231:9;13279:4;13271:6;13267:17;13350:6;13338:10;13335:22;13314:18;13302:10;13299:34;13296:62;13293:88;;;13361:18;;:::i;:::-;13397:2;13390:22;13430:6;-1:-1:-1;13430:6:1;13460:23;;13492:33;13460:23;13492:33;:::i;:::-;13534:23;;13609:2;13594:18;;13581:32;13622:33;13581:32;13622:33;:::i;:::-;13683:2;13671:15;;13664:32;13748:2;13733:18;;13720:32;13761:30;13720:32;13761:30;:::i;:::-;13819:2;13807:15;;;;13800:32;13086:752;;-1:-1:-1;;13086:752:1:o;13843:1025::-;13958:6;13966;14019:2;14007:9;13998:7;13994:23;13990:32;13987:52;;;14035:1;14032;14025:12;13987:52;14071:9;14058:23;14048:33;;14100:2;14153;14142:9;14138:18;14125:32;14180:18;14172:6;14169:30;14166:50;;;14212:1;14209;14202:12;14166:50;14235:22;;14288:4;14280:13;;14276:27;-1:-1:-1;14266:55:1;;14317:1;14314;14307:12;14266:55;14353:2;14340:16;14376:60;14392:43;14432:2;14392:43;:::i;14376:60::-;14470:15;;;14532:4;14571:11;;;14563:20;;14559:29;;;14501:12;;;;14458:3;14600:19;;;14597:39;;;14632:1;14629;14622:12;14597:39;14656:11;;;;14676:162;14692:6;14687:3;14684:15;14676:162;;;14758:37;14787:7;14782:3;14758:37;:::i;:::-;14746:50;;14709:12;;;;14816;;;;14676:162;;;14680:3;14857:5;14847:15;;;;;;;13843:1025;;;;;:::o;14873:661::-;14965:6;14973;14981;14989;14997;15050:3;15038:9;15029:7;15025:23;15021:33;15018:53;;;15067:1;15064;15057:12;15018:53;15106:9;15093:23;15125:31;15150:5;15125:31;:::i;:::-;15175:5;-1:-1:-1;15232:2:1;15217:18;;15204:32;15245:33;15204:32;15245:33;:::i;:::-;15297:7;-1:-1:-1;15356:2:1;15341:18;;15328:32;15369:30;15328:32;15369:30;:::i;:::-;14873:661;;;;-1:-1:-1;15418:7:1;;15472:2;15457:18;;15444:32;;-1:-1:-1;15523:3:1;15508:19;15495:33;;14873:661;-1:-1:-1;;14873:661:1:o;15721:1290::-;15871:6;15879;15887;15895;15903;15911;15919;15927;15935;15943;15951:7;15960;16014:3;16002:9;15993:7;15989:23;15985:33;15982:53;;;16031:1;16028;16021:12;15982:53;16070:9;16057:23;16089:31;16114:5;16089:31;:::i;:::-;16139:5;-1:-1:-1;16196:2:1;16181:18;;16168:32;16209:33;16168:32;16209:33;:::i;:::-;16261:7;-1:-1:-1;16320:2:1;16305:18;;16292:32;16333:30;16292:32;16333:30;:::i;:::-;16382:7;-1:-1:-1;16436:2:1;16421:18;;16408:32;;-1:-1:-1;16487:3:1;16472:19;;16459:33;;-1:-1:-1;16539:3:1;16524:19;;16511:33;;-1:-1:-1;16596:3:1;16581:19;;16568:33;16610;16568;16610;:::i;:::-;16662:7;-1:-1:-1;16716:3:1;16701:19;;16688:33;;-1:-1:-1;16773:3:1;16758:19;;16745:33;16787:30;16745:33;16787:30;:::i;:::-;16836:7;-1:-1:-1;16862:37:1;16894:3;16879:19;;16862:37;:::i;:::-;16852:47;;16947:3;16936:9;16932:19;16919:33;16908:44;;17000:3;16989:9;16985:19;16972:33;16961:44;;15721:1290;;;;;;;;;;;;;;:::o;17016:799::-;17126:6;17134;17142;17150;17158;17166;17174;17227:3;17215:9;17206:7;17202:23;17198:33;17195:53;;;17244:1;17241;17234:12;17195:53;17283:9;17270:23;17302:31;17327:5;17302:31;:::i;:::-;17352:5;-1:-1:-1;17409:2:1;17394:18;;17381:32;17422:30;17381:32;17422:30;:::i;:::-;17471:7;-1:-1:-1;17525:2:1;17510:18;;17497:32;;-1:-1:-1;17576:2:1;17561:18;;17548:32;;-1:-1:-1;17627:3:1;17612:19;;17599:33;;-1:-1:-1;17684:3:1;17669:19;;17656:33;17698;17656;17698;:::i;17820:247::-;17879:6;17932:2;17920:9;17911:7;17907:23;17903:32;17900:52;;;17948:1;17945;17938:12;17900:52;17987:9;17974:23;18006:31;18031:5;18006:31;:::i;18264:349::-;18466:2;18448:21;;;18505:2;18485:18;;;18478:30;18544:27;18539:2;18524:18;;18517:55;18604:2;18589:18;;18264:349::o;18998:245::-;19065:6;19118:2;19106:9;19097:7;19093:23;19089:32;19086:52;;;19134:1;19131;19124:12;19086:52;19166:9;19160:16;19185:28;19207:5;19185:28;:::i;19650:245::-;19729:6;19737;19790:2;19778:9;19769:7;19765:23;19761:32;19758:52;;;19806:1;19803;19796:12;19758:52;-1:-1:-1;;19829:16:1;;19885:2;19870:18;;;19864:25;19829:16;;19864:25;;-1:-1:-1;19650:245:1:o;19900:403::-;20102:2;20084:21;;;20141:2;20121:18;;;20114:30;20180:34;20175:2;20160:18;;20153:62;-1:-1:-1;;;20246:2:1;20231:18;;20224:37;20293:3;20278:19;;19900:403::o;20308:::-;20510:2;20492:21;;;20549:2;20529:18;;;20522:30;20588:34;20583:2;20568:18;;20561:62;-1:-1:-1;;;20654:2:1;20639:18;;20632:37;20701:3;20686:19;;20308:403::o;20716:127::-;20777:10;20772:3;20768:20;20765:1;20758:31;20808:4;20805:1;20798:15;20832:4;20829:1;20822:15;20848:127;20909:10;20904:3;20900:20;20897:1;20890:31;20940:4;20937:1;20930:15;20964:4;20961:1;20954:15;20980:125;21020:4;21048:1;21045;21042:8;21039:34;;;21053:18;;:::i;:::-;-1:-1:-1;21090:9:1;;20980:125::o;21110:408::-;21312:2;21294:21;;;21351:2;21331:18;;;21324:30;21390:34;21385:2;21370:18;;21363:62;-1:-1:-1;;;21456:2:1;21441:18;;21434:42;21508:3;21493:19;;21110:408::o;21523:354::-;21725:2;21707:21;;;21764:2;21744:18;;;21737:30;21803:32;21798:2;21783:18;;21776:60;21868:2;21853:18;;21523:354::o;21882:222::-;21963:6;22016:2;22004:9;21995:7;21991:23;21987:32;21984:52;;;22032:1;22029;22022:12;21984:52;22055:43;22090:7;22079:9;22055:43;:::i;22109:241::-;22165:6;22218:2;22206:9;22197:7;22193:23;22189:32;22186:52;;;22234:1;22231;22224:12;22186:52;22273:9;22260:23;22292:28;22314:5;22292:28;:::i;22537:184::-;22607:6;22660:2;22648:9;22639:7;22635:23;22631:32;22628:52;;;22676:1;22673;22666:12;22628:52;-1:-1:-1;22699:16:1;;22537:184;-1:-1:-1;22537:184:1:o;22726:385::-;-1:-1:-1;;;;;22978:15:1;;;22960:34;;23030:15;;;;23025:2;23010:18;;23003:43;23089:14;;23082:22;23077:2;23062:18;;23055:50;22910:2;22895:18;;22726:385::o;23116:251::-;23186:6;23239:2;23227:9;23218:7;23214:23;23210:32;23207:52;;;23255:1;23252;23245:12;23207:52;23287:9;23281:16;23306:31;23331:5;23306:31;:::i;23372:168::-;23412:7;23478:1;23474;23470:6;23466:14;23463:1;23460:21;23455:1;23448:9;23441:17;23437:45;23434:71;;;23485:18;;:::i;:::-;-1:-1:-1;23525:9:1;;23372:168::o;23545:217::-;23585:1;23611;23601:132;;23655:10;23650:3;23646:20;23643:1;23636:31;23690:4;23687:1;23680:15;23718:4;23715:1;23708:15;23601:132;-1:-1:-1;23747:9:1;;23545:217::o;23767:670::-;-1:-1:-1;;;;;24134:15:1;;;24116:34;;24186:15;;;;24181:2;24166:18;;24159:43;24233:2;24218:18;;24211:34;;;;24276:2;24261:18;;24254:34;;;;24337:4;24325:17;24319:3;24304:19;;24297:46;24096:3;24359:19;;24352:35;24418:3;24403:19;;24396:35;;;;24065:3;24050:19;;23767:670::o;25765:306::-;25853:6;25861;25869;25922:2;25910:9;25901:7;25897:23;25893:32;25890:52;;;25938:1;25935;25928:12;25890:52;25967:9;25961:16;25951:26;;26017:2;26006:9;26002:18;25996:25;25986:35;;26061:2;26050:9;26046:18;26040:25;26030:35;;25765:306;;;;;:::o;26076:128::-;26116:3;26147:1;26143:6;26140:1;26137:13;26134:39;;;26153:18;;:::i;:::-;-1:-1:-1;26189:9:1;;26076:128::o;26209:135::-;26248:3;-1:-1:-1;;26269:17:1;;26266:43;;;26289:18;;:::i;:::-;-1:-1:-1;26336:1:1;26325:13;;26209:135::o;26709:258::-;26781:1;26791:113;26805:6;26802:1;26799:13;26791:113;;;26881:11;;;26875:18;26862:11;;;26855:39;26827:2;26820:10;26791:113;;;26922:6;26919:1;26916:13;26913:48;;;-1:-1:-1;;26957:1:1;26939:16;;26932:27;26709:258::o;26972:274::-;27101:3;27139:6;27133:13;27155:53;27201:6;27196:3;27189:4;27181:6;27177:17;27155:53;:::i;:::-;27224:16;;;;;26972:274;-1:-1:-1;;26972:274:1:o;27251:403::-;27453:2;27435:21;;;27492:2;27472:18;;;27465:30;27531:34;27526:2;27511:18;;27504:62;-1:-1:-1;;;27597:2:1;27582:18;;27575:37;27644:3;27629:19;;27251:403::o;27659:624::-;27890:6;27879:9;27872:25;27933:6;27928:2;27917:9;27913:18;27906:34;28005:1;28001;27996:3;27992:11;27988:19;27980:6;27976:32;27971:2;27960:9;27956:18;27949:60;28045:3;28040:2;28029:9;28025:18;28018:31;27853:4;28078:6;28072:13;28122:6;28116:3;28105:9;28101:19;28094:35;28138:67;28198:6;28192:3;28181:9;28177:19;28172:2;28164:6;28160:15;28138:67;:::i;:::-;28266:2;28245:15;-1:-1:-1;;28241:29:1;28226:45;;;;28273:3;28222:55;;27659:624;-1:-1:-1;;;;;27659:624:1:o

Swarm Source

ipfs://014c2acfdb2fbedc68073bbc14fe41b5e3b8f441a311b78ed356232ff3c571ef

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.