ETH Price: $2,862.30 (-2.69%)

Contract

0x169C06b4cfB09bFD73A81e6f2Bb1eB514D75bB19

Overview

ETH Balance

Linea Mainnet LogoLinea Mainnet LogoLinea Mainnet Logo0 ETH

ETH Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Remove Liquidity281065262026-01-20 19:34:145 days ago1768937654IN
0x169C06b4...14D75bB19
0 ETH0.000013660.04412781
Remove Liquidity266749002025-12-14 12:01:3642 days ago1765713696IN
0x169C06b4...14D75bB19
0 ETH0.000008780.03751957
Remove Liquidity258697462025-11-21 6:27:3465 days ago1763706454IN
0x169C06b4...14D75bB19
0 ETH0.000011510.03752781
Remove Liquidity...238932912025-09-28 5:57:03119 days ago1759039023IN
0x169C06b4...14D75bB19
0 ETH0.000010990.04498831
Remove Liquidity236824232025-09-23 2:41:17125 days ago1758595277IN
0x169C06b4...14D75bB19
0 ETH0.000013440.04865563
Remove Liquidity...235890172025-09-20 22:05:00127 days ago1758405900IN
0x169C06b4...14D75bB19
0 ETH0.000009650.03741158
Remove Liquidity...235358112025-09-19 15:51:55128 days ago1758297115IN
0x169C06b4...14D75bB19
0 ETH0.000010620.04115274
Swap Exact Token...231714362025-09-10 21:13:35137 days ago1757538815IN
0x169C06b4...14D75bB19
0 ETH0.000004820.04264192
Remove Liquidity...231674942025-09-10 19:01:57137 days ago1757530917IN
0x169C06b4...14D75bB19
0 ETH0.000009690.03757138
Remove Liquidity...225790002025-08-27 14:22:32151 days ago1756304552IN
0x169C06b4...14D75bB19
0 ETH0.000009310.0374777
Remove Liquidity...218743922025-08-10 21:06:24168 days ago1754859984IN
0x169C06b4...14D75bB19
0 ETH0.000012670.03918987
Remove Liquidity...211720372025-07-23 1:11:45187 days ago1753233105IN
0x169C06b4...14D75bB19
0 ETH0.000015920.05206339
Remove Liquidity...174488742025-03-28 7:40:35303 days ago1743147635IN
0x169C06b4...14D75bB19
0 ETH0.000012760.04117965
Remove Liquidity...159136622025-02-17 3:01:35343 days ago1739761295IN
0x169C06b4...14D75bB19
0 ETH0.000013120.04106658
Remove Liquidity...138656512024-12-28 0:51:56394 days ago1735347116IN
0x169C06b4...14D75bB19
0 ETH0.00001610.04411994
Remove Liquidity...131037062024-12-09 18:45:04412 days ago1733769904IN
0x169C06b4...14D75bB19
0 ETH0.000081130.33190701
Remove Liquidity...129370102024-12-05 16:04:31416 days ago1733414671IN
0x169C06b4...14D75bB19
0 ETH0.000013180.05107643
Remove Liquidity...52696972024-06-08 14:48:12596 days ago1717858092IN
0x169C06b4...14D75bB19
0 ETH0.000012380.06
Add Liquidity ET...52695312024-06-08 14:39:54596 days ago1717857594IN
0x169C06b4...14D75bB19
0.00199032 ETH0.00001690.06
Remove Liquidity...42893792024-05-05 12:21:28630 days ago1714911688IN
0x169C06b4...14D75bB19
0 ETH0.000011560.06
Add Liquidity ET...42893612024-05-05 12:20:34630 days ago1714911634IN
0x169C06b4...14D75bB19
0.00000047 ETH0.000012330.0582
Remove Liquidity...42891792024-05-05 12:11:28630 days ago1714911088IN
0x169C06b4...14D75bB19
0 ETH0.000011560.06
Add Liquidity ET...42891602024-05-05 12:10:31630 days ago1714911031IN
0x169C06b4...14D75bB19
0.00026705 ETH0.000013020.06
Remove Liquidity...42890752024-05-05 12:06:16630 days ago1714910776IN
0x169C06b4...14D75bB19
0 ETH0.000011560.06
Add Liquidity ET...42890602024-05-05 12:05:31630 days ago1714910731IN
0x169C06b4...14D75bB19
0.00000078 ETH0.000012750.0582
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
281065262026-01-20 19:34:145 days ago1768937654
0x169C06b4...14D75bB19
0 ETH
281065262026-01-20 19:34:145 days ago1768937654
0x169C06b4...14D75bB19
0 ETH
266749002025-12-14 12:01:3642 days ago1765713696
0x169C06b4...14D75bB19
0 ETH
266749002025-12-14 12:01:3642 days ago1765713696
0x169C06b4...14D75bB19
0 ETH
258697462025-11-21 6:27:3465 days ago1763706454
0x169C06b4...14D75bB19
0 ETH
258697462025-11-21 6:27:3465 days ago1763706454
0x169C06b4...14D75bB19
0 ETH
238932912025-09-28 5:57:03119 days ago1759039023
0x169C06b4...14D75bB19
0.001 ETH
238932912025-09-28 5:57:03119 days ago1759039023
0x169C06b4...14D75bB19
0.001 ETH
238932912025-09-28 5:57:03119 days ago1759039023
0x169C06b4...14D75bB19
0 ETH
238932912025-09-28 5:57:03119 days ago1759039023
0x169C06b4...14D75bB19
0 ETH
238932912025-09-28 5:57:03119 days ago1759039023
0x169C06b4...14D75bB19
0 ETH
238932912025-09-28 5:57:03119 days ago1759039023
0x169C06b4...14D75bB19
0 ETH
236824232025-09-23 2:41:17125 days ago1758595277
0x169C06b4...14D75bB19
0 ETH
236824232025-09-23 2:41:17125 days ago1758595277
0x169C06b4...14D75bB19
0 ETH
235890172025-09-20 22:05:00127 days ago1758405900
0x169C06b4...14D75bB19
0.0003 ETH
235890172025-09-20 22:05:00127 days ago1758405900
0x169C06b4...14D75bB19
0.0003 ETH
235890172025-09-20 22:05:00127 days ago1758405900
0x169C06b4...14D75bB19
0 ETH
235890172025-09-20 22:05:00127 days ago1758405900
0x169C06b4...14D75bB19
0 ETH
235890172025-09-20 22:05:00127 days ago1758405900
0x169C06b4...14D75bB19
0 ETH
235890172025-09-20 22:05:00127 days ago1758405900
0x169C06b4...14D75bB19
0 ETH
235358112025-09-19 15:51:55128 days ago1758297115
0x169C06b4...14D75bB19
0.0007 ETH
235358112025-09-19 15:51:55128 days ago1758297115
0x169C06b4...14D75bB19
0.0007 ETH
235358112025-09-19 15:51:55128 days ago1758297115
0x169C06b4...14D75bB19
0 ETH
235358112025-09-19 15:51:55128 days ago1758297115
0x169C06b4...14D75bB19
0 ETH
235358112025-09-19 15:51:55128 days ago1758297115
0x169C06b4...14D75bB19
0 ETH
View All Internal Transactions
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LeetSwapV2Router01

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
london EvmVersion, GNU AGPLv3 license
File 1 of 9 : LeetSwapV2Router01.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.17;

import "./interfaces/ILeetSwapV2Factory.sol";
import "./interfaces/ILeetSwapV2Pair.sol";
import "./interfaces/ILeetSwapV2Router01.sol";
import "@leetswap/interfaces/ILiquidityManageable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract LeetSwapV2Router01 is Ownable, ILeetSwapV2Router01 {
    struct Route {
        address from;
        address to;
        bool stable;
    }

    address public immutable factory;
    IWCANTO public immutable wcanto;

    uint256 internal constant MINIMUM_LIQUIDITY = 10**3;
    bytes32 immutable pairCodeHash;
    mapping(address => bool) public stablePairs;
    mapping(address => bool) public isLiquidityManageableWhitelisted;
    bool public deadlineEnabled;
    bool public liquidityManageableEnabled;
    bool public liquidityManageableWhitelistEnabled;

    error InvalidToken();
    error TransferFailed();
    error TradeExpired();
    error InsufficientOutputAmount();
    error InvalidPath();
    error InvalidAmount();
    error CantoTransferFailed();
    error IdenticalAddresses();
    error InsufficientAmount();
    error InsufficientAAmount();
    error InsufficientBAmount();
    error InsufficientLiquidity();
    error ZeroAddress();
    error DeadlineExpired();
    error ArrayLengthMismatch();
    error Unauthorized();

    modifier ensure(uint256 deadline) {
        if (deadlineEnabled && deadline < block.timestamp)
            revert DeadlineExpired();
        _;
    }

    constructor(address _factory, address _wcanto) {
        factory = _factory;
        pairCodeHash = ILeetSwapV2Factory(_factory).pairCodeHash();
        wcanto = IWCANTO(_wcanto);
        liquidityManageableEnabled = true;
        liquidityManageableWhitelistEnabled = true;
    }

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

    // **** LIQUIDITY MANAGEABLE PROTOCOL ****
    //
    // we use the following functions because we can't use modifiers due to the stack size limit
    // and the hefty amount of parameters and local variables of the Uniswap liquidity functions

    // it's safe to naively call the functions because if any of the token don't implement the interface
    // or if the router is not a liquidity manager, the call will silently fail with no harm
    function _startLiquidityManagement(address tokenA, address tokenB)
        internal
    {
        if (!liquidityManageableEnabled) return;

        if (
            !liquidityManageableWhitelistEnabled ||
            isLiquidityManageableWhitelisted[tokenA]
        ) {
            ILiquidityManageable lmTokenA = ILiquidityManageable(tokenA);
            try lmTokenA.isLiquidityManager(address(this)) returns (
                bool isLiquidityManager
            ) {
                if (isLiquidityManager)
                    lmTokenA.setLiquidityManagementPhase(true);
            } catch {}
        }

        if (
            !liquidityManageableWhitelistEnabled ||
            isLiquidityManageableWhitelisted[tokenB]
        ) {
            ILiquidityManageable lmTokenB = ILiquidityManageable(tokenB);
            try lmTokenB.isLiquidityManager(address(this)) returns (
                bool isLiquidityManager
            ) {
                if (isLiquidityManager)
                    lmTokenB.setLiquidityManagementPhase(true);
            } catch {}
        }
    }

    // if the previous 'startPhase' call failed because the router is not a LM, nothing will happen here,
    // still silently fail, whereas if it succeeded, the liquidity management phase will be set to false
    function _stopLiquidityManagement(address tokenA, address tokenB) internal {
        if (!liquidityManageableEnabled) return;

        if (
            !liquidityManageableWhitelistEnabled ||
            isLiquidityManageableWhitelisted[tokenA]
        ) {
            ILiquidityManageable lmTokenA = ILiquidityManageable(tokenA);
            try lmTokenA.isLiquidityManager(address(this)) returns (
                bool isLiquidityManager
            ) {
                if (isLiquidityManager)
                    lmTokenA.setLiquidityManagementPhase(false);
            } catch {}
        }

        if (
            !liquidityManageableWhitelistEnabled ||
            isLiquidityManageableWhitelisted[tokenB]
        ) {
            ILiquidityManageable lmTokenB = ILiquidityManageable(tokenB);
            try lmTokenB.isLiquidityManager(address(this)) returns (
                bool isLiquidityManager
            ) {
                if (isLiquidityManager)
                    lmTokenB.setLiquidityManagementPhase(false);
            } catch {}
        }
    }

    // UniswapV2 compatibility
    function WETH() external view returns (address) {
        return address(wcanto);
    }

    function sortTokens(address tokenA, address tokenB)
        public
        pure
        returns (address token0, address token1)
    {
        if (tokenA == tokenB) revert IdenticalAddresses();
        (token0, token1) = tokenA < tokenB
            ? (tokenA, tokenB)
            : (tokenB, tokenA);
        if (token0 == address(0)) revert ZeroAddress();
    }

    function _pairFor(
        address tokenA,
        address tokenB,
        bool stable
    ) internal 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
                        )
                    )
                )
            )
        );
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address tokenA, address tokenB)
        public
        view
        returns (address pair)
    {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        bool isStable = stablePairs[_pairFor(token0, token1, true)];
        pair = address(
            uint160(
                uint256(
                    keccak256(
                        abi.encodePacked(
                            hex"ff",
                            factory,
                            keccak256(
                                abi.encodePacked(token0, token1, isStable)
                            ),
                            pairCodeHash // init code hash
                        )
                    )
                )
            )
        );
    }

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

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountOut(
        uint256 amountIn,
        address tokenIn,
        address tokenOut
    ) public view returns (uint256 amount) {
        address pair = pairFor(tokenIn, tokenOut);
        if (ILeetSwapV2Factory(factory).isPair(pair)) {
            amount = ILeetSwapV2Pair(pair).getAmountOut(amountIn, tokenIn);
        }
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(uint256 amountIn, Route[] memory routes)
        public
        view
        returns (uint256[] memory amounts)
    {
        if (routes.length < 1) revert InvalidPath();
        amounts = new uint256[](routes.length + 1);
        amounts[0] = amountIn;
        for (uint256 i = 0; i < routes.length; i++) {
            address pair = pairFor(routes[i].from, routes[i].to);
            if (ILeetSwapV2Factory(factory).isPair(pair)) {
                amounts[i + 1] = ILeetSwapV2Pair(pair).getAmountOut(
                    amounts[i],
                    routes[i].from
                );
            }
        }
    }

    // UniswapV2 compatibility
    function getAmountsOut(uint256 amountIn, address[] calldata path)
        public
        view
        returns (uint256[] memory amounts)
    {
        if (path.length < 2) revert InvalidPath();
        Route[] memory routes = _pathToRoutes(path);
        amounts = getAmountsOut(amountIn, routes);
    }

    // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quoteLiquidity(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) internal pure returns (uint256 amountB) {
        if (amountA <= 0) revert InsufficientAmount();
        if (reserveA <= 0 || reserveB <= 0) revert InsufficientLiquidity();
        amountB = (amountA * reserveB) / reserveA;
    }

    function isPair(address pair) public view returns (bool) {
        return ILeetSwapV2Factory(factory).isPair(pair);
    }

    function _pathToRoutes(address[] calldata path)
        internal
        view
        returns (Route[] memory routes)
    {
        routes = new Route[](path.length - 1);
        for (uint256 i = 0; i < path.length - 1; i++) {
            bool isStable = stablePairs[pairFor(path[i], path[i + 1])];
            routes[i] = Route(path[i], path[i + 1], isStable);
        }
    }

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

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external ensure(deadline) returns (uint256[] memory amounts) {
        Route[] memory routes = _pathToRoutes(path);
        amounts = getAmountsOut(amountIn, routes);
        if (amounts[amounts.length - 1] < amountOutMin) {
            revert InsufficientOutputAmount();
        }
        _safeTransferFrom(
            routes[0].from,
            msg.sender,
            pairFor(routes[0].from, routes[0].to),
            amounts[0]
        );
        _swap(amounts, routes, to);
    }

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable ensure(deadline) returns (uint256[] memory amounts) {
        if (path[0] != address(wcanto)) revert InvalidPath();
        Route[] memory routes = _pathToRoutes(path);
        amounts = getAmountsOut(msg.value, routes);
        if (amounts[amounts.length - 1] < amountOutMin) {
            revert InsufficientOutputAmount();
        }
        wcanto.deposit{value: amounts[0]}();
        assert(
            wcanto.transfer(pairFor(routes[0].from, routes[0].to), amounts[0])
        );
        _swap(amounts, routes, to);
    }

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external ensure(deadline) returns (uint256[] memory amounts) {
        if (path[path.length - 1] != address(wcanto)) {
            revert InvalidPath();
        }
        Route[] memory routes = _pathToRoutes(path);
        amounts = getAmountsOut(amountIn, routes);
        if (amounts[amounts.length - 1] < amountOutMin) {
            revert InsufficientOutputAmount();
        }
        _safeTransferFrom(
            routes[0].from,
            msg.sender,
            pairFor(routes[0].from, routes[0].to),
            amounts[0]
        );
        _swap(amounts, routes, address(this));
        wcanto.withdraw(amounts[amounts.length - 1]);
        _safeTransferETH(to, amounts[amounts.length - 1]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(
        address[] memory path,
        address _to
    ) internal virtual {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = sortTokens(input, output);
            ILeetSwapV2Pair pair = ILeetSwapV2Pair(pairFor(input, output));
            uint256 amountInput;
            uint256 amountOutput;
            {
                // scope to avoid stack too deep errors
                (uint256 reserve0, uint256 reserve1, ) = pair.getReserves();
                (uint256 reserveInput, ) = input == token0
                    ? (reserve0, reserve1)
                    : (reserve1, reserve0);
                amountInput =
                    IERC20(input).balanceOf(address(pair)) -
                    reserveInput;
                amountOutput = getAmountOut(amountInput, input, output);
            }
            (uint256 amount0Out, uint256 amount1Out) = input == token0
                ? (uint256(0), amountOutput)
                : (amountOutput, uint256(0));
            address to;
            if (i < path.length - 2) {
                to = pairFor(output, path[i + 2]);
            } else {
                to = _to;
            }
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual ensure(deadline) {
        _safeTransferFrom(
            path[0],
            msg.sender,
            pairFor(path[0], path[1]),
            amountIn
        );
        uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        if (
            IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore <
            amountOutMin
        ) {
            revert InsufficientOutputAmount();
        }
    }

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable virtual ensure(deadline) {
        if (path[0] != address(wcanto)) revert InvalidPath();
        uint256 amountIn = msg.value;
        IWCANTO(wcanto).deposit{value: amountIn}();
        assert(IWCANTO(wcanto).transfer(pairFor(path[0], path[1]), amountIn));
        uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        if (
            IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore <
            amountOutMin
        ) {
            revert InsufficientOutputAmount();
        }
    }

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual ensure(deadline) {
        if (path[path.length - 1] != address(wcanto)) {
            revert InvalidPath();
        }
        _safeTransferFrom(
            path[0],
            msg.sender,
            pairFor(path[0], path[1]),
            amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint256 amountOut = IERC20(address(wcanto)).balanceOf(address(this));
        if (amountOut < amountOutMin) {
            revert InsufficientOutputAmount();
        }
        IWCANTO(wcanto).withdraw(amountOut);
        _safeTransferETH(to, amountOut);
    }

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin
    ) internal returns (uint256 amountA, uint256 amountB) {
        if (amountADesired < amountAMin || amountBDesired < amountBMin)
            revert InvalidAmount();
        // create the pair if it doesn"t exist yet
        address _pair = ILeetSwapV2Factory(factory).getPair(
            tokenA,
            tokenB,
            stable
        );
        if (_pair == address(0)) {
            _pair = ILeetSwapV2Factory(factory).createPair(
                tokenA,
                tokenB,
                stable
            );
        }
        (uint256 reserveA, uint256 reserveB) = getReserves(tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint256 amountBOptimal = quoteLiquidity(
                amountADesired,
                reserveA,
                reserveB
            );
            if (amountBOptimal <= amountBDesired) {
                if (amountBOptimal < amountBMin) {
                    revert InsufficientBAmount();
                }
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint256 amountAOptimal = quoteLiquidity(
                    amountBDesired,
                    reserveB,
                    reserveA
                );
                assert(amountAOptimal <= amountADesired);
                if (amountAOptimal < amountAMin) {
                    revert InsufficientAAmount();
                }
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        ensure(deadline)
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        )
    {
        _startLiquidityManagement(tokenA, tokenB);

        address pair = pairFor(tokenA, tokenB);
        bool isStable = stablePairs[pair];
        (amountA, amountB) = _addLiquidity(
            tokenA,
            tokenB,
            isStable,
            amountADesired,
            amountBDesired,
            amountAMin,
            amountBMin
        );
        _safeTransferFrom(tokenA, msg.sender, pair, amountA);
        _safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = ILeetSwapV2Pair(pair).mint(to);

        _stopLiquidityManagement(tokenA, tokenB);
    }

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountCANTOMin,
        address to,
        uint256 deadline
    )
        external
        payable
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountCANTO,
            uint256 liquidity
        )
    {
        _startLiquidityManagement(token, address(wcanto));

        address pair = pairFor(token, address(wcanto));
        bool isStable = stablePairs[pair];
        (amountToken, amountCANTO) = _addLiquidity(
            token,
            address(wcanto),
            isStable,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountCANTOMin
        );
        _safeTransferFrom(token, msg.sender, pair, amountToken);
        wcanto.deposit{value: amountCANTO}();
        assert(wcanto.transfer(pair, amountCANTO));
        liquidity = ILeetSwapV2Pair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountCANTO) {
            _safeTransferETH(msg.sender, msg.value - amountCANTO);
        }

        _stopLiquidityManagement(token, address(wcanto));
    }

    function _safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        if (!success) revert CantoTransferFailed();
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) public ensure(deadline) returns (uint256 amountA, uint256 amountB) {
        _startLiquidityManagement(tokenA, tokenB);

        address pair = pairFor(tokenA, tokenB);
        if (!ILeetSwapV2Pair(pair).transferFrom(msg.sender, pair, liquidity))
            revert TransferFailed();
        (uint256 amount0, uint256 amount1) = ILeetSwapV2Pair(pair).burn(to);
        (address token0, ) = sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0
            ? (amount0, amount1)
            : (amount1, amount0);
        if (amountA < amountAMin) {
            revert InsufficientAAmount();
        }
        if (amountB < amountBMin) {
            revert InsufficientBAmount();
        }

        _stopLiquidityManagement(tokenA, tokenB);
    }

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountCANTOMin,
        address to,
        uint256 deadline
    )
        public
        ensure(deadline)
        returns (uint256 amountToken, uint256 amountCANTO)
    {
        _startLiquidityManagement(token, address(wcanto));

        (amountToken, amountCANTO) = removeLiquidity(
            token,
            address(wcanto),
            liquidity,
            amountTokenMin,
            amountCANTOMin,
            address(this),
            deadline
        );
        _safeTransfer(token, to, amountToken);
        wcanto.withdraw(amountCANTO);
        _safeTransferETH(to, amountCANTO);

        _stopLiquidityManagement(token, address(wcanto));
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountCANTOMin,
        address to,
        uint256 deadline
    ) public virtual ensure(deadline) returns (uint256 amountCANTO) {
        _startLiquidityManagement(token, address(wcanto));

        (, amountCANTO) = removeLiquidity(
            token,
            address(wcanto),
            liquidity,
            amountTokenMin,
            amountCANTOMin,
            address(this),
            deadline
        );
        _safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
        wcanto.withdraw(amountCANTO);
        _safeTransferETH(to, amountCANTO);

        _stopLiquidityManagement(token, address(wcanto));
    }

    // **** LIBRARY FUNCTIONS ****
    function _safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        if (token.code.length == 0) revert InvalidToken();
        bool success = IERC20(token).transfer(to, value);
        if (!success) revert TransferFailed();
    }

    function _safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        if (token.code.length == 0) revert InvalidToken();
        bool success = IERC20(token).transferFrom(from, to, value);
        if (!success) revert TransferFailed();
    }

    function setStablePair(address pair, bool stable) external onlyOwner {
        stablePairs[pair] = stable;
    }

    function setStablePairs(address[] calldata pairs, bool[] calldata stable)
        external
        onlyOwner
    {
        if (pairs.length != stable.length) revert ArrayLengthMismatch();
        for (uint256 i = 0; i < pairs.length; i++) {
            stablePairs[pairs[i]] = stable[i];
        }
    }

    function setDeadlineEnabled(bool _enabled) external onlyOwner {
        deadlineEnabled = _enabled;
    }

    function setLiquidityManageableEnabled(bool _enabled) external onlyOwner {
        liquidityManageableEnabled = _enabled;
    }

    function setLiquidityManageableWhitelistEnabled(bool _enabled)
        external
        onlyOwner
    {
        liquidityManageableWhitelistEnabled = _enabled;
    }

    function addLiquidityManageableWhitelist(address token) external onlyOwner {
        isLiquidityManageableWhitelisted[token] = true;
    }

    function removeLiquidityManageableWhitelist(address token)
        external
        onlyOwner
    {
        isLiquidityManageableWhitelisted[token] = false;
    }
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

interface ILeetSwapV2Factory {
    function allPairsLength() external view returns (uint256);

    function isPair(address pair) external view returns (bool);

    function pairCodeHash() external pure returns (bytes32);

    function getPair(
        address tokenA,
        address token,
        bool stable
    ) external view returns (address);

    function createPair(
        address tokenA,
        address tokenB,
        bool stable
    ) external returns (address);

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

    function getInitializable()
        external
        view
        returns (
            address token0,
            address token1,
            bool stable
        );

    function protocolFeesShare() external view returns (uint256);

    function protocolFeesRecipient() external view returns (address);

    function tradingFees(address pair, address to)
        external
        view
        returns (uint256);

    function isPaused() external view returns (bool);
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

interface ILeetSwapV2Pair {
    function factory() external view returns (address);

    function fees() external view returns (address);

    function transferFrom(
        address src,
        address dst,
        uint256 amount
    ) external returns (bool);

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

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function mint(address to) external returns (uint256 liquidity);

    function getReserves()
        external
        view
        returns (
            uint256 _reserve0,
            uint256 _reserve1,
            uint256 _blockTimestampLast
        );

    function getAmountOut(uint256, address) external view returns (uint256);

    function current(address tokenIn, uint256 amountIn)
        external
        view
        returns (uint256);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function stable() external view returns (bool);

    function balanceOf(address) external view returns (uint256);

    //LP token pricing
    function sample(
        address tokenIn,
        uint256 amountIn,
        uint256 points,
        uint256 window
    ) external view returns (uint256[] memory);

    function quote(
        address tokenIn,
        uint256 amountIn,
        uint256 granularity
    ) external view returns (uint256);

    function claimFeesFor(address account)
        external
        returns (uint256 claimed0, uint256 claimed1);

    function claimFees() external returns (uint256 claimed0, uint256 claimed1);

    function claimableFeesFor(address account)
        external
        returns (uint256 claimed0, uint256 claimed1);

    function claimableFees()
        external
        returns (uint256 claimed0, uint256 claimed1);
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

import "@leetswap/interfaces/IWCANTO.sol";

interface ILeetSwapV2Router01 {
    function factory() external view returns (address);

    function WETH() external view returns (address);

    function wcanto() external view returns (IWCANTO);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountCANTOMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountCANTO);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function getAmountOut(
        uint256 amountIn,
        address tokenIn,
        address tokenOut
    ) external view returns (uint256 amount);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function pairFor(address tokenA, address tokenB)
        external
        view
        returns (address pair);
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

interface ILiquidityManageable {
    function setLiquidityManagementPhase(bool _isManagingLiquidity) external;

    function isLiquidityManager(address _addr) external returns (bool);

    function isLiquidityManagementPhase() external returns (bool);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

interface IWCANTO {
    function deposit() external payable;

    function transfer(address to, uint256 value) external returns (bool);

    function withdraw(uint256) external;
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

Settings
{
  "remappings": [
    "@leetswap/=src/",
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "solmate/=lib/solmate/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_wcanto","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"CantoTransferFailed","type":"error"},{"inputs":[],"name":"DeadlineExpired","type":"error"},{"inputs":[],"name":"IdenticalAddresses","type":"error"},{"inputs":[],"name":"InsufficientAAmount","type":"error"},{"inputs":[],"name":"InsufficientAmount","type":"error"},{"inputs":[],"name":"InsufficientBAmount","type":"error"},{"inputs":[],"name":"InsufficientLiquidity","type":"error"},{"inputs":[],"name":"InsufficientOutputAmount","type":"error"},{"inputs":[],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidPath","type":"error"},{"inputs":[],"name":"InvalidToken","type":"error"},{"inputs":[],"name":"TradeExpired","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountCANTOMin","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":"amountCANTO","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"addLiquidityManageableWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadlineEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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"}],"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 LeetSwapV2Router01.Route[]","name":"routes","type":"tuple[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLiquidityManageableWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"liquidityManageableEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityManageableWhitelistEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"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":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountCANTOMin","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":"amountCANTO","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountCANTOMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountCANTO","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"removeLiquidityManageableWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setDeadlineEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setLiquidityManageableEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setLiquidityManageableWhitelistEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"setStablePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"pairs","type":"address[]"},{"internalType":"bool[]","name":"stable","type":"bool[]"}],"name":"setStablePairs","outputs":[],"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":"address","name":"","type":"address"}],"name":"stablePairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wcanto","outputs":[{"internalType":"contract IWCANTO","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040523480156200001157600080fd5b506040516200421938038062004219833981016040819052620000349162000144565b6200003f33620000d7565b6001600160a01b038216608081905260408051631355724960e31b81529051639aab9248916004808201926020929091908290030181865afa1580156200008a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000b091906200017c565b60c0526001600160a01b031660a052506003805462ffff0019166201010017905562000196565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200013f57600080fd5b919050565b600080604083850312156200015857600080fd5b620001638362000127565b9150620001736020840162000127565b90509250929050565b6000602082840312156200018f57600080fd5b5051919050565b60805160a05160c051613f65620002b46000396000611662015260008181610223015281816104b2015281816105e6015281816107cb015281816107f501528181610844015281816108b80152818161096501528181610ad40152818161111e01528181611202015281816112ae015281816113520152818161142c015281816114ba01528181611aa201528181611acc01528181611b8401528181611bf801528181611c5a01528181611cd801528181611d4c0152818161249e015281816124ca015281816125130152818161254f015281816125e401526126f001526000818161069f01528181610fe10152818161161a015281816117e10152818161224d0152818161344e015281816134e2015261358e0152613f656000f3fe6080604052600436106102135760003560e01c806396ed28f911610118578063b6f9de95116100a0578063d52bb6f41161006f578063d52bb6f4146106e1578063e5e31b1314610701578063e8e3370014610721578063f2fde38b1461075c578063f305d7191461077c57600080fd5b8063b6f9de951461065a578063baa2abde1461066d578063c45a01551461068d578063d06ca61f146106c157600080fd5b8063accb16e0116100e7578063accb16e01461059d578063ad0950cb146105b7578063ad5c4648146105d7578063af2979eb1461060a578063b1be2f0f1461062a57600080fd5b806396ed28f91461051d5780639881fcb41461053d578063a90f63621461055d578063ab0aaadf1461057d57600080fd5b8063590e8e781161019b578063715018a61161016a578063715018a61461046b578063791ac947146104805780637aa497d9146104a05780637ff36ab5146104ec5780638da5cb5b146104ff57600080fd5b8063590e8e78146103cd5780635c11d795146103ed5780635e1e63251461040d5780636cc1e9841461043b57600080fd5b8063283c2ee1116101e2578063283c2ee1146102fe57806338ed17391461032e57806346d886a11461034e578063520709c51461036d578063544caa561461038d57600080fd5b806302751cec14610257578063056bfae114610291578063098b0eaa146102b157806318cbafe5146102d157600080fd5b3661025257336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102505761025061372e565b005b600080fd5b34801561026357600080fd5b50610277610272366004613759565b61078f565b604080519283526020830191909152015b60405180910390f35b34801561029d57600080fd5b506102506102ac3660046137c5565b6108e8565b3480156102bd57600080fd5b506102506102cc3660046137c5565b610903565b3480156102dd57600080fd5b506102f16102ec36600461382e565b610927565b60405161028891906138a1565b34801561030a57600080fd5b5060035461031e9062010000900460ff1681565b6040519015158152602001610288565b34801561033a57600080fd5b506102f161034936600461382e565b610bb4565b34801561035a57600080fd5b5060035461031e90610100900460ff1681565b34801561037957600080fd5b506102506103883660046138e5565b610c6a565b34801561039957600080fd5b506103ad6103a836600461391e565b610c9d565b604080516001600160a01b03938416815292909116602083015201610288565b3480156103d957600080fd5b506102506103e83660046137c5565b610d28565b3480156103f957600080fd5b5061025061040836600461382e565b610d4a565b34801561041957600080fd5b5061042d61042836600461394c565b610fb2565b604051908152602001610288565b34801561044757600080fd5b5061031e61045636600461398e565b60016020526000908152604090205460ff1681565b34801561047757600080fd5b506102506110cf565b34801561048c57600080fd5b5061025061049b36600461382e565b6110e3565b3480156104ac57600080fd5b506104d47f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610288565b6102f16104fa3660046139ab565b61131c565b34801561050b57600080fd5b506000546001600160a01b03166104d4565b34801561052957600080fd5b506104d461053836600461391e565b6115cd565b34801561054957600080fd5b506102f1610558366004613a82565b6116e8565b34801561056957600080fd5b5061025061057836600461398e565b61194d565b34801561058957600080fd5b50610250610598366004613b7d565b611976565b3480156105a957600080fd5b5060035461031e9060ff1681565b3480156105c357600080fd5b506102506105d236600461398e565b611a3c565b3480156105e357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006104d4565b34801561061657600080fd5b5061042d610625366004613759565b611a68565b34801561063657600080fd5b5061031e61064536600461398e565b60026020526000908152604090205460ff1681565b6102506106683660046139ab565b611c27565b34801561067957600080fd5b50610277610688366004613be9565b611f4e565b34801561069957600080fd5b506104d47f000000000000000000000000000000000000000000000000000000000000000081565b3480156106cd57600080fd5b506102f16106dc366004613c5b565b612139565b3480156106ed57600080fd5b506102776106fc36600461391e565b612175565b34801561070d57600080fd5b5061031e61071c36600461398e565b61222b565b34801561072d57600080fd5b5061074161073c366004613ca7565b6122c0565b60408051938452602084019290925290820152606001610288565b34801561076857600080fd5b5061025061077736600461398e565b6123e2565b61074161078a366004613759565b612460565b6003546000908190839060ff1680156107a757504281105b156107c557604051631ab7da6b60e01b815260040160405180910390fd5b6107ef897f0000000000000000000000000000000000000000000000000000000000000000612723565b61081e897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a611f4e565b909350915061082e89868561293c565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561089057600080fd5b505af11580156108a4573d6000803e3d6000fd5b505050506108b285836129fe565b6108dc897f0000000000000000000000000000000000000000000000000000000000000000612a8c565b50965096945050505050565b6108f0612c73565b6003805460ff1916911515919091179055565b61090b612c73565b60038054911515620100000262ff000019909216919091179055565b600354606090829060ff16801561093d57504281105b1561095b57604051631ab7da6b60e01b815260040160405180910390fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610992600182613d39565b8181106109a1576109a1613d4c565b90506020020160208101906109b6919061398e565b6001600160a01b0316146109dd576040516320db826760e01b815260040160405180910390fd5b60006109e98787612ccd565b90506109f589826116e8565b9250878360018551610a079190613d39565b81518110610a1757610a17613d4c565b60200260200101511015610a3e576040516342301c2360e01b815260040160405180910390fd5b610ac781600081518110610a5457610a54613d4c565b60200260200101516000015133610aa784600081518110610a7757610a77613d4c565b60200260200101516000015185600081518110610a9657610a96613d4c565b6020026020010151602001516115cd565b86600081518110610aba57610aba613d4c565b6020026020010151612e77565b610ad2838230612f41565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8460018651610b109190613d39565b81518110610b2057610b20613d4c565b60200260200101516040518263ffffffff1660e01b8152600401610b4691815260200190565b600060405180830381600087803b158015610b6057600080fd5b505af1158015610b74573d6000803e3d6000fd5b50505050610ba8858460018651610b8b9190613d39565b81518110610b9b57610b9b613d4c565b60200260200101516129fe565b50509695505050505050565b600354606090829060ff168015610bca57504281105b15610be857604051631ab7da6b60e01b815260040160405180910390fd5b6000610bf48787612ccd565b9050610c0089826116e8565b9250878360018551610c129190613d39565b81518110610c2257610c22613d4c565b60200260200101511015610c49576040516342301c2360e01b815260040160405180910390fd5b610c5f81600081518110610a5457610a54613d4c565b610ba8838287612f41565b610c72612c73565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b600080826001600160a01b0316846001600160a01b031603610cd257604051630bd969eb60e41b815260040160405180910390fd5b826001600160a01b0316846001600160a01b031610610cf2578284610cf5565b83835b90925090506001600160a01b038216610d215760405163d92e233d60e01b815260040160405180910390fd5b9250929050565b610d30612c73565b600380549115156101000261ff0019909216919091179055565b600354819060ff168015610d5d57504281105b15610d7b57604051631ab7da6b60e01b815260040160405180910390fd5b610e0085856000818110610d9157610d91613d4c565b9050602002016020810190610da6919061398e565b33610dfa88886000818110610dbd57610dbd613d4c565b9050602002016020810190610dd2919061398e565b89896001818110610de557610de5613d4c565b9050602002016020810190610538919061398e565b8a612e77565b60008585610e0f600182613d39565b818110610e1e57610e1e613d4c565b9050602002016020810190610e33919061398e565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa158015610e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9f9190613d62565b9050610edf868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613148915050565b86818787610eee600182613d39565b818110610efd57610efd613d4c565b9050602002016020810190610f12919061398e565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b602060405180830381865afa158015610f5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7f9190613d62565b610f899190613d39565b1015610fa8576040516342301c2360e01b815260040160405180910390fd5b5050505050505050565b600080610fbf84846115cd565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa15801561102a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104e9190613d7b565b156110c7576040516378a051ad60e11b8152600481018690526001600160a01b03858116602483015282169063f140a35a90604401602060405180830381865afa1580156110a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c49190613d62565b91505b509392505050565b6110d7612c73565b6110e160006133e9565b565b600354819060ff1680156110f657504281105b1561111457604051631ab7da6b60e01b815260040160405180910390fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016858561114b600182613d39565b81811061115a5761115a613d4c565b905060200201602081019061116f919061398e565b6001600160a01b031614611196576040516320db826760e01b815260040160405180910390fd5b6111ac85856000818110610d9157610d91613d4c565b6111ea858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613148915050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112759190613d62565b905086811015611298576040516342301c2360e01b815260040160405180910390fd5b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156112fa57600080fd5b505af115801561130e573d6000803e3d6000fd5b50505050610fa884826129fe565b600354606090829060ff16801561133257504281105b1561135057604051631ab7da6b60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061138d5761138d613d4c565b90506020020160208101906113a2919061398e565b6001600160a01b0316146113c9576040516320db826760e01b815260040160405180910390fd5b60006113d58787612ccd565b90506113e134826116e8565b92508783600185516113f39190613d39565b8151811061140357611403613d4c565b6020026020010151101561142a576040516342301c2360e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08460008151811061146c5761146c613d4c565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561149f57600080fd5b505af11580156114b3573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61151c836000815181106114fd576114fd613d4c565b60200260200101516000015184600081518110610a9657610a96613d4c565b8560008151811061152f5761152f613d4c565b60200260200101516040518363ffffffff1660e01b81526004016115689291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611587573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ab9190613d7b565b6115b7576115b761372e565b6115c2838287612f41565b505095945050505050565b60008060006115dc8585610c9d565b915091506000600160006115f285856001613439565b6001600160a01b03168152602080820192909252604090810160002054905160ff90911692507f00000000000000000000000000000000000000000000000000000000000000009161164a9186918691869101613d98565b604051602081830303815290604052805190602001207f00000000000000000000000000000000000000000000000000000000000000006040516020016116c6939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b606060018251101561170d576040516320db826760e01b815260040160405180910390fd5b815161171a906001613dcb565b67ffffffffffffffff81111561173257611732613a12565b60405190808252806020026020018201604052801561175b578160200160208202803683370190505b509050828160008151811061177257611772613d4c565b60200260200101818152505060005b82518110156119465760006117bf8483815181106117a1576117a1613d4c565b602002602001015160000151858481518110610a9657610a96613d4c565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa15801561182a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184e9190613d7b565b1561193357806001600160a01b031663f140a35a84848151811061187457611874613d4c565b602002602001015186858151811061188e5761188e613d4c565b6020026020010151600001516040518363ffffffff1660e01b81526004016118c99291909182526001600160a01b0316602082015260400190565b602060405180830381865afa1580156118e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190a9190613d62565b83611916846001613dcb565b8151811061192657611926613d4c565b6020026020010181815250505b508061193e81613dde565b915050611781565b5092915050565b611955612c73565b6001600160a01b03166000908152600260205260409020805460ff19169055565b61197e612c73565b82811461199e5760405163512509d360e11b815260040160405180910390fd5b60005b83811015611a35578282828181106119bb576119bb613d4c565b90506020020160208101906119d091906137c5565b600160008787858181106119e6576119e6613d4c565b90506020020160208101906119fb919061398e565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611a2d81613dde565b9150506119a1565b5050505050565b611a44612c73565b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b600354600090829060ff168015611a7e57504281105b15611a9c57604051631ab7da6b60e01b815260040160405180910390fd5b611ac6887f0000000000000000000000000000000000000000000000000000000000000000612723565b611af5887f00000000000000000000000000000000000000000000000000000000000000008989893089611f4e565b6040516370a0823160e01b8152306004820152909350611b6e9150899086906001600160a01b038316906370a0823190602401602060405180830381865afa158015611b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b699190613d62565b61293c565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611bd057600080fd5b505af1158015611be4573d6000803e3d6000fd5b50505050611bf284836129fe565b611c1c887f0000000000000000000000000000000000000000000000000000000000000000612a8c565b509695505050505050565b600354819060ff168015611c3a57504281105b15611c5857604051631ab7da6b60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000818110611c9557611c95613d4c565b9050602002016020810190611caa919061398e565b6001600160a01b031614611cd1576040516320db826760e01b815260040160405180910390fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d3157600080fd5b505af1158015611d45573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d8f88886000818110610dbd57610dbd613d4c565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611ddc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e009190613d7b565b611e0c57611e0c61372e565b60008686611e1b600182613d39565b818110611e2a57611e2a613d4c565b9050602002016020810190611e3f919061398e565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015611e87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eab9190613d62565b9050611eeb878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613148915050565b87818888611efa600182613d39565b818110611f0957611f09613d4c565b9050602002016020810190611f1e919061398e565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a0823190602401610f3e565b6003546000908190839060ff168015611f6657504281105b15611f8457604051631ab7da6b60e01b815260040160405180910390fd5b611f8e8a8a612723565b6000611f9a8b8b6115cd565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015611ff0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120149190613d7b565b612031576040516312171d8360e31b815260040160405180910390fd5b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af115801561207d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a19190613df7565b9150915060006120b18e8e610c9d565b509050806001600160a01b03168e6001600160a01b0316146120d45781836120d7565b82825b90975095508a8710156120fd57604051638dc525d160e01b815260040160405180910390fd5b8986101561211e5760405163ef71d09160e01b815260040160405180910390fd5b6121288e8e612a8c565b505050505097509795505050505050565b6060600282101561215d576040516320db826760e01b815260040160405180910390fd5b60006121698484612ccd565b90506110c485826116e8565b60008060006121848585610c9d565b50905060008061219487876115cd565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156121d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f59190613e1b565b5091509150826001600160a01b0316876001600160a01b03161461221a57808261221d565b81815b909890975095505050505050565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa158015612296573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ba9190613d7b565b92915050565b60035460009081908190849060ff1680156122da57504281105b156122f857604051631ab7da6b60e01b815260040160405180910390fd5b6123028c8c612723565b600061230e8d8d6115cd565b6001600160a01b03811660009081526001602052604090205490915060ff1661233c8e8e838f8f8f8f613482565b909650945061234d8e338489612e77565b6123598d338488612e77565b6040516335313c2160e11b81526001600160a01b038981166004830152831690636a627842906024016020604051808303816000875af11580156123a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c59190613d62565b93506123d18e8e612a8c565b505050985098509895505050505050565b6123ea612c73565b6001600160a01b0381166124545760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61245d816133e9565b50565b60035460009081908190849060ff16801561247a57504281105b1561249857604051631ab7da6b60e01b815260040160405180910390fd5b6124c28a7f0000000000000000000000000000000000000000000000000000000000000000612723565b60006124ee8b7f00000000000000000000000000000000000000000000000000000000000000006115cd565b6001600160a01b03811660009081526001602052604090205490915060ff1661253c8c7f0000000000000000000000000000000000000000000000000000000000000000838e348f8f613482565b909650945061254d8c338489612e77565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125a857600080fd5b505af11580156125bc573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038681166004830152602482018a90527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015612631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126559190613d7b565b6126615761266161372e565b6040516335313c2160e11b81526001600160a01b038981166004830152831690636a627842906024016020604051808303816000875af11580156126a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126cd9190613d62565b9350843411156126ea576126ea336126e58734613d39565b6129fe565b6127148c7f0000000000000000000000000000000000000000000000000000000000000000612a8c565b50505096509650969350505050565b600354610100900460ff16612736575050565b60035462010000900460ff16158061276657506001600160a01b03821660009081526002602052604090205460ff165b15612839576040516337e26cd160e21b815230600482015282906001600160a01b0382169063df89b344906024016020604051808303816000875af19250505080156127cf575060408051601f3d908101601f191682019092526127cc91810190613d7b565b60015b156128375780156128355760405163bd7d67e960e01b8152600160048201526001600160a01b0383169063bd7d67e990602401600060405180830381600087803b15801561281c57600080fd5b505af1158015612830573d6000803e3d6000fd5b505050505b505b505b60035462010000900460ff16158061286957506001600160a01b03811660009081526002602052604090205460ff165b15612938576040516337e26cd160e21b815230600482015281906001600160a01b0382169063df89b344906024016020604051808303816000875af19250505080156128d2575060408051601f3d908101601f191682019092526128cf91810190613d7b565b60015b156129365780156129345760405163bd7d67e960e01b8152600160048201526001600160a01b0383169063bd7d67e9906024015b600060405180830381600087803b15801561292057600080fd5b505af1158015610fa8573d6000803e3d6000fd5b505b505b5050565b826001600160a01b03163b6000036129675760405163c1ab6dc160e01b815260040160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b038381166004830152602482018390526000919085169063a9059cbb906044016020604051808303816000875af11580156129ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129de9190613d7b565b905080612934576040516312171d8360e31b815260040160405180910390fd5b604080516000808252602082019092526001600160a01b038416908390604051612a289190613e6d565b60006040518083038185875af1925050503d8060008114612a65576040519150601f19603f3d011682016040523d82523d6000602084013e612a6a565b606091505b505090508061293657604051631db12dd560e21b815260040160405180910390fd5b600354610100900460ff16612a9f575050565b60035462010000900460ff161580612acf57506001600160a01b03821660009081526002602052604090205460ff165b15612ba2576040516337e26cd160e21b815230600482015282906001600160a01b0382169063df89b344906024016020604051808303816000875af1925050508015612b38575060408051601f3d908101601f19168201909252612b3591810190613d7b565b60015b15612ba0578015612b9e5760405163bd7d67e960e01b8152600060048201526001600160a01b0383169063bd7d67e990602401600060405180830381600087803b158015612b8557600080fd5b505af1158015612b99573d6000803e3d6000fd5b505050505b505b505b60035462010000900460ff161580612bd257506001600160a01b03811660009081526002602052604090205460ff165b15612938576040516337e26cd160e21b815230600482015281906001600160a01b0382169063df89b344906024016020604051808303816000875af1925050508015612c3b575060408051601f3d908101601f19168201909252612c3891810190613d7b565b60015b156129365780156129345760405163bd7d67e960e01b8152600060048201526001600160a01b0383169063bd7d67e990602401612906565b6000546001600160a01b031633146110e15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161244b565b6060612cda600183613d39565b67ffffffffffffffff811115612cf257612cf2613a12565b604051908082528060200260200182016040528015612d3d57816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181612d105790505b50905060005b612d4e600184613d39565b81101561194657600060016000612da1878786818110612d7057612d70613d4c565b9050602002016020810190612d85919061398e565b8888612d92886001613dcb565b818110610de557610de5613d4c565b6001600160a01b03168152602081019190915260409081016000205481516060810190925260ff16915080868685818110612dde57612dde613d4c565b9050602002016020810190612df3919061398e565b6001600160a01b031681526020018686612e0e866001613dcb565b818110612e1d57612e1d613d4c565b9050602002016020810190612e32919061398e565b6001600160a01b03168152602001821515815250838381518110612e5857612e58613d4c565b6020026020010181905250508080612e6f90613dde565b915050612d43565b836001600160a01b03163b600003612ea25760405163c1ab6dc160e01b815260040160405180910390fd5b6040516323b872dd60e01b81526001600160a01b038481166004830152838116602483015260448201839052600091908616906323b872dd906064016020604051808303816000875af1158015612efd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f219190613d7b565b905080611a35576040516312171d8360e31b815260040160405180910390fd5b60005b8251811015612934576000612f93848381518110612f6457612f64613d4c565b602002602001015160000151858481518110612f8257612f82613d4c565b602002602001015160200151610c9d565b509050600085612fa4846001613dcb565b81518110612fb457612fb4613d4c565b60200260200101519050600080836001600160a01b0316878681518110612fdd57612fdd613d4c565b6020026020010151600001516001600160a01b031614612fff57826000613003565b6000835b915091506000600188516130179190613d39565b8610613023578661306c565b61306c88613032886001613dcb565b8151811061304257613042613d4c565b6020026020010151600001518988600161305c9190613dcb565b81518110610a9657610a96613d4c565b90506130a188878151811061308357613083613d4c565b602002602001015160000151898881518110610a9657610a96613d4c565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156130de576020820181803683370190505b506040518563ffffffff1660e01b81526004016130fe9493929190613e89565b600060405180830381600087803b15801561311857600080fd5b505af115801561312c573d6000803e3d6000fd5b505050505050505050808061314090613dde565b915050612f44565b60005b600183516131599190613d39565b8110156129365760008084838151811061317557613175613d4c565b60200260200101518584600161318b9190613dcb565b8151811061319b5761319b613d4c565b60200260200101519150915060006131b38383610c9d565b50905060006131c284846115cd565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061322c9190613e1b565b50915091506000866001600160a01b0316896001600160a01b031614613253578183613256565b82825b506040516370a0823160e01b81526001600160a01b03888116600483015291925082918b16906370a0823190602401602060405180830381865afa1580156132a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132c69190613d62565b6132d09190613d39565b94506132dd858a8a610fb2565b9350505050600080856001600160a01b0316886001600160a01b0316146133065782600061330a565b6000835b91509150600060028c5161331e9190613d39565b8a101561335957613352888d6133358d6002613dcb565b8151811061334557613345613d4c565b60200260200101516115cd565b905061335c565b50895b6040805160008152602081019182905263022c0d9f60e01b9091526001600160a01b0387169063022c0d9f9061339b9086908690869060248101613e89565b600060405180830381600087803b1580156133b557600080fd5b505af11580156133c9573d6000803e3d6000fd5b5050505050505050505050505080806133e190613dde565b91505061314b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060006134488686610c9d565b915091507f000000000000000000000000000000000000000000000000000000000000000082828660405160200161164a93929190613d98565b6000808386108061349257508285105b156134b05760405163162908e360e11b815260040160405180910390fd5b6040516306801cc360e41b81526001600160a01b038a81166004830152898116602483015288151560448301526000917f000000000000000000000000000000000000000000000000000000000000000090911690636801cc3090606401602060405180830381865afa15801561352b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061354f9190613ed9565b90506001600160a01b0381166135fe576040516320b7f73960e21b81526001600160a01b038b811660048301528a8116602483015289151560448301527f000000000000000000000000000000000000000000000000000000000000000016906382dfdce4906064016020604051808303816000875af11580156135d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135fb9190613ed9565b90505b60008061360b8c8c612175565b9150915081600014801561361d575080155b1561362d578894508793506136b7565b600061363a8a84846136c6565b905088811161366f57868110156136645760405163ef71d09160e01b815260040160405180910390fd5b8995509350836136b5565b600061367c8a84866136c6565b90508a81111561368e5761368e61372e565b888110156136af57604051638dc525d160e01b815260040160405180910390fd5b95508894505b505b50505097509795505050505050565b60008084116136e857604051632ca2f52b60e11b815260040160405180910390fd5b8215806136f3575081155b156137115760405163bb55fd2760e01b815260040160405180910390fd5b8261371c8386613ef6565b6137269190613f0d565b949350505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b038116811461245d57600080fd5b60008060008060008060c0878903121561377257600080fd5b863561377d81613744565b955060208701359450604087013593506060870135925060808701356137a281613744565b8092505060a087013590509295509295509295565b801515811461245d57600080fd5b6000602082840312156137d757600080fd5b81356137e2816137b7565b9392505050565b60008083601f8401126137fb57600080fd5b50813567ffffffffffffffff81111561381357600080fd5b6020830191508360208260051b8501011115610d2157600080fd5b60008060008060008060a0878903121561384757600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561386c57600080fd5b61387889828a016137e9565b909550935050606087013561388c81613744565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b818110156138d9578351835292840192918401916001016138bd565b50909695505050505050565b600080604083850312156138f857600080fd5b823561390381613744565b91506020830135613913816137b7565b809150509250929050565b6000806040838503121561393157600080fd5b823561393c81613744565b9150602083013561391381613744565b60008060006060848603121561396157600080fd5b83359250602084013561397381613744565b9150604084013561398381613744565b809150509250925092565b6000602082840312156139a057600080fd5b81356137e281613744565b6000806000806000608086880312156139c357600080fd5b85359450602086013567ffffffffffffffff8111156139e157600080fd5b6139ed888289016137e9565b9095509350506040860135613a0181613744565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715613a4b57613a4b613a12565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613a7a57613a7a613a12565b604052919050565b6000806040808486031215613a9657600080fd5b8335925060208085013567ffffffffffffffff80821115613ab657600080fd5b818701915087601f830112613aca57600080fd5b813581811115613adc57613adc613a12565b613aea848260051b01613a51565b8181528481019250606091820284018501918a831115613b0957600080fd5b938501935b82851015613b6c5780858c031215613b265760008081fd5b613b2e613a28565b8535613b3981613744565b815285870135613b4881613744565b8188015285880135613b59816137b7565b8189015284529384019392850192613b0e565b508096505050505050509250929050565b60008060008060408587031215613b9357600080fd5b843567ffffffffffffffff80821115613bab57600080fd5b613bb7888389016137e9565b90965094506020870135915080821115613bd057600080fd5b50613bdd878288016137e9565b95989497509550505050565b600080600080600080600060e0888a031215613c0457600080fd5b8735613c0f81613744565b96506020880135613c1f81613744565b955060408801359450606088013593506080880135925060a0880135613c4481613744565b8092505060c0880135905092959891949750929550565b600080600060408486031215613c7057600080fd5b83359250602084013567ffffffffffffffff811115613c8e57600080fd5b613c9a868287016137e9565b9497909650939450505050565b600080600080600080600080610100898b031215613cc457600080fd5b8835613ccf81613744565b97506020890135613cdf81613744565b965060408901359550606089013594506080890135935060a0890135925060c0890135613d0b81613744565b8092505060e089013590509295985092959890939650565b634e487b7160e01b600052601160045260246000fd5b818103818111156122ba576122ba613d23565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613d7457600080fd5b5051919050565b600060208284031215613d8d57600080fd5b81516137e2816137b7565b6bffffffffffffffffffffffff19606094851b811682529290931b9091166014830152151560f81b602882015260290190565b808201808211156122ba576122ba613d23565b600060018201613df057613df0613d23565b5060010190565b60008060408385031215613e0a57600080fd5b505080516020909101519092909150565b600080600060608486031215613e3057600080fd5b8351925060208401519150604084015190509250925092565b60005b83811015613e64578181015183820152602001613e4c565b50506000910152565b60008251613e7f818460208701613e49565b9190910192915050565b84815283602082015260018060a01b03831660408201526080606082015260008251806080840152613ec28160a0850160208701613e49565b601f01601f19169190910160a00195945050505050565b600060208284031215613eeb57600080fd5b81516137e281613744565b80820281158282048414176122ba576122ba613d23565b600082613f2a57634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212202e016813496ad0b4c738836e30897bee7e4d7ed2b9b7a2e06b10b1433c2e92e764736f6c634300081100330000000000000000000000004ddf0fa98b5f9bd7cb0645c25ba89a574fe9be8c000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f

Deployed Bytecode

0x6080604052600436106102135760003560e01c806396ed28f911610118578063b6f9de95116100a0578063d52bb6f41161006f578063d52bb6f4146106e1578063e5e31b1314610701578063e8e3370014610721578063f2fde38b1461075c578063f305d7191461077c57600080fd5b8063b6f9de951461065a578063baa2abde1461066d578063c45a01551461068d578063d06ca61f146106c157600080fd5b8063accb16e0116100e7578063accb16e01461059d578063ad0950cb146105b7578063ad5c4648146105d7578063af2979eb1461060a578063b1be2f0f1461062a57600080fd5b806396ed28f91461051d5780639881fcb41461053d578063a90f63621461055d578063ab0aaadf1461057d57600080fd5b8063590e8e781161019b578063715018a61161016a578063715018a61461046b578063791ac947146104805780637aa497d9146104a05780637ff36ab5146104ec5780638da5cb5b146104ff57600080fd5b8063590e8e78146103cd5780635c11d795146103ed5780635e1e63251461040d5780636cc1e9841461043b57600080fd5b8063283c2ee1116101e2578063283c2ee1146102fe57806338ed17391461032e57806346d886a11461034e578063520709c51461036d578063544caa561461038d57600080fd5b806302751cec14610257578063056bfae114610291578063098b0eaa146102b157806318cbafe5146102d157600080fd5b3661025257336001600160a01b037f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f16146102505761025061372e565b005b600080fd5b34801561026357600080fd5b50610277610272366004613759565b61078f565b604080519283526020830191909152015b60405180910390f35b34801561029d57600080fd5b506102506102ac3660046137c5565b6108e8565b3480156102bd57600080fd5b506102506102cc3660046137c5565b610903565b3480156102dd57600080fd5b506102f16102ec36600461382e565b610927565b60405161028891906138a1565b34801561030a57600080fd5b5060035461031e9062010000900460ff1681565b6040519015158152602001610288565b34801561033a57600080fd5b506102f161034936600461382e565b610bb4565b34801561035a57600080fd5b5060035461031e90610100900460ff1681565b34801561037957600080fd5b506102506103883660046138e5565b610c6a565b34801561039957600080fd5b506103ad6103a836600461391e565b610c9d565b604080516001600160a01b03938416815292909116602083015201610288565b3480156103d957600080fd5b506102506103e83660046137c5565b610d28565b3480156103f957600080fd5b5061025061040836600461382e565b610d4a565b34801561041957600080fd5b5061042d61042836600461394c565b610fb2565b604051908152602001610288565b34801561044757600080fd5b5061031e61045636600461398e565b60016020526000908152604090205460ff1681565b34801561047757600080fd5b506102506110cf565b34801561048c57600080fd5b5061025061049b36600461382e565b6110e3565b3480156104ac57600080fd5b506104d47f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f81565b6040516001600160a01b039091168152602001610288565b6102f16104fa3660046139ab565b61131c565b34801561050b57600080fd5b506000546001600160a01b03166104d4565b34801561052957600080fd5b506104d461053836600461391e565b6115cd565b34801561054957600080fd5b506102f1610558366004613a82565b6116e8565b34801561056957600080fd5b5061025061057836600461398e565b61194d565b34801561058957600080fd5b50610250610598366004613b7d565b611976565b3480156105a957600080fd5b5060035461031e9060ff1681565b3480156105c357600080fd5b506102506105d236600461398e565b611a3c565b3480156105e357600080fd5b507f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6104d4565b34801561061657600080fd5b5061042d610625366004613759565b611a68565b34801561063657600080fd5b5061031e61064536600461398e565b60026020526000908152604090205460ff1681565b6102506106683660046139ab565b611c27565b34801561067957600080fd5b50610277610688366004613be9565b611f4e565b34801561069957600080fd5b506104d47f0000000000000000000000004ddf0fa98b5f9bd7cb0645c25ba89a574fe9be8c81565b3480156106cd57600080fd5b506102f16106dc366004613c5b565b612139565b3480156106ed57600080fd5b506102776106fc36600461391e565b612175565b34801561070d57600080fd5b5061031e61071c36600461398e565b61222b565b34801561072d57600080fd5b5061074161073c366004613ca7565b6122c0565b60408051938452602084019290925290820152606001610288565b34801561076857600080fd5b5061025061077736600461398e565b6123e2565b61074161078a366004613759565b612460565b6003546000908190839060ff1680156107a757504281105b156107c557604051631ab7da6b60e01b815260040160405180910390fd5b6107ef897f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f612723565b61081e897f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f8a8a8a308a611f4e565b909350915061082e89868561293c565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561089057600080fd5b505af11580156108a4573d6000803e3d6000fd5b505050506108b285836129fe565b6108dc897f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f612a8c565b50965096945050505050565b6108f0612c73565b6003805460ff1916911515919091179055565b61090b612c73565b60038054911515620100000262ff000019909216919091179055565b600354606090829060ff16801561093d57504281105b1561095b57604051631ab7da6b60e01b815260040160405180910390fd5b6001600160a01b037f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f168686610992600182613d39565b8181106109a1576109a1613d4c565b90506020020160208101906109b6919061398e565b6001600160a01b0316146109dd576040516320db826760e01b815260040160405180910390fd5b60006109e98787612ccd565b90506109f589826116e8565b9250878360018551610a079190613d39565b81518110610a1757610a17613d4c565b60200260200101511015610a3e576040516342301c2360e01b815260040160405180910390fd5b610ac781600081518110610a5457610a54613d4c565b60200260200101516000015133610aa784600081518110610a7757610a77613d4c565b60200260200101516000015185600081518110610a9657610a96613d4c565b6020026020010151602001516115cd565b86600081518110610aba57610aba613d4c565b6020026020010151612e77565b610ad2838230612f41565b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b0316632e1a7d4d8460018651610b109190613d39565b81518110610b2057610b20613d4c565b60200260200101516040518263ffffffff1660e01b8152600401610b4691815260200190565b600060405180830381600087803b158015610b6057600080fd5b505af1158015610b74573d6000803e3d6000fd5b50505050610ba8858460018651610b8b9190613d39565b81518110610b9b57610b9b613d4c565b60200260200101516129fe565b50509695505050505050565b600354606090829060ff168015610bca57504281105b15610be857604051631ab7da6b60e01b815260040160405180910390fd5b6000610bf48787612ccd565b9050610c0089826116e8565b9250878360018551610c129190613d39565b81518110610c2257610c22613d4c565b60200260200101511015610c49576040516342301c2360e01b815260040160405180910390fd5b610c5f81600081518110610a5457610a54613d4c565b610ba8838287612f41565b610c72612c73565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b600080826001600160a01b0316846001600160a01b031603610cd257604051630bd969eb60e41b815260040160405180910390fd5b826001600160a01b0316846001600160a01b031610610cf2578284610cf5565b83835b90925090506001600160a01b038216610d215760405163d92e233d60e01b815260040160405180910390fd5b9250929050565b610d30612c73565b600380549115156101000261ff0019909216919091179055565b600354819060ff168015610d5d57504281105b15610d7b57604051631ab7da6b60e01b815260040160405180910390fd5b610e0085856000818110610d9157610d91613d4c565b9050602002016020810190610da6919061398e565b33610dfa88886000818110610dbd57610dbd613d4c565b9050602002016020810190610dd2919061398e565b89896001818110610de557610de5613d4c565b9050602002016020810190610538919061398e565b8a612e77565b60008585610e0f600182613d39565b818110610e1e57610e1e613d4c565b9050602002016020810190610e33919061398e565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa158015610e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9f9190613d62565b9050610edf868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613148915050565b86818787610eee600182613d39565b818110610efd57610efd613d4c565b9050602002016020810190610f12919061398e565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b602060405180830381865afa158015610f5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7f9190613d62565b610f899190613d39565b1015610fa8576040516342301c2360e01b815260040160405180910390fd5b5050505050505050565b600080610fbf84846115cd565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f0000000000000000000000004ddf0fa98b5f9bd7cb0645c25ba89a574fe9be8c9091169063e5e31b1390602401602060405180830381865afa15801561102a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104e9190613d7b565b156110c7576040516378a051ad60e11b8152600481018690526001600160a01b03858116602483015282169063f140a35a90604401602060405180830381865afa1580156110a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c49190613d62565b91505b509392505050565b6110d7612c73565b6110e160006133e9565b565b600354819060ff1680156110f657504281105b1561111457604051631ab7da6b60e01b815260040160405180910390fd5b6001600160a01b037f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f16858561114b600182613d39565b81811061115a5761115a613d4c565b905060200201602081019061116f919061398e565b6001600160a01b031614611196576040516320db826760e01b815260040160405180910390fd5b6111ac85856000818110610d9157610d91613d4c565b6111ea858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613148915050565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b0316906370a0823190602401602060405180830381865afa158015611251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112759190613d62565b905086811015611298576040516342301c2360e01b815260040160405180910390fd5b604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156112fa57600080fd5b505af115801561130e573d6000803e3d6000fd5b50505050610fa884826129fe565b600354606090829060ff16801561133257504281105b1561135057604051631ab7da6b60e01b815260040160405180910390fd5b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b03168686600081811061138d5761138d613d4c565b90506020020160208101906113a2919061398e565b6001600160a01b0316146113c9576040516320db826760e01b815260040160405180910390fd5b60006113d58787612ccd565b90506113e134826116e8565b92508783600185516113f39190613d39565b8151811061140357611403613d4c565b6020026020010151101561142a576040516342301c2360e01b815260040160405180910390fd5b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031663d0e30db08460008151811061146c5761146c613d4c565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561149f57600080fd5b505af11580156114b3573d6000803e3d6000fd5b50505050507f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031663a9059cbb61151c836000815181106114fd576114fd613d4c565b60200260200101516000015184600081518110610a9657610a96613d4c565b8560008151811061152f5761152f613d4c565b60200260200101516040518363ffffffff1660e01b81526004016115689291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611587573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ab9190613d7b565b6115b7576115b761372e565b6115c2838287612f41565b505095945050505050565b60008060006115dc8585610c9d565b915091506000600160006115f285856001613439565b6001600160a01b03168152602080820192909252604090810160002054905160ff90911692507f0000000000000000000000004ddf0fa98b5f9bd7cb0645c25ba89a574fe9be8c9161164a9186918691869101613d98565b604051602081830303815290604052805190602001207f28086d29c039f716c897e0615045599a42ea0133fa059e92faff694d05cfcd496040516020016116c6939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b606060018251101561170d576040516320db826760e01b815260040160405180910390fd5b815161171a906001613dcb565b67ffffffffffffffff81111561173257611732613a12565b60405190808252806020026020018201604052801561175b578160200160208202803683370190505b509050828160008151811061177257611772613d4c565b60200260200101818152505060005b82518110156119465760006117bf8483815181106117a1576117a1613d4c565b602002602001015160000151858481518110610a9657610a96613d4c565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f0000000000000000000000004ddf0fa98b5f9bd7cb0645c25ba89a574fe9be8c9091169063e5e31b1390602401602060405180830381865afa15801561182a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184e9190613d7b565b1561193357806001600160a01b031663f140a35a84848151811061187457611874613d4c565b602002602001015186858151811061188e5761188e613d4c565b6020026020010151600001516040518363ffffffff1660e01b81526004016118c99291909182526001600160a01b0316602082015260400190565b602060405180830381865afa1580156118e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190a9190613d62565b83611916846001613dcb565b8151811061192657611926613d4c565b6020026020010181815250505b508061193e81613dde565b915050611781565b5092915050565b611955612c73565b6001600160a01b03166000908152600260205260409020805460ff19169055565b61197e612c73565b82811461199e5760405163512509d360e11b815260040160405180910390fd5b60005b83811015611a35578282828181106119bb576119bb613d4c565b90506020020160208101906119d091906137c5565b600160008787858181106119e6576119e6613d4c565b90506020020160208101906119fb919061398e565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611a2d81613dde565b9150506119a1565b5050505050565b611a44612c73565b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b600354600090829060ff168015611a7e57504281105b15611a9c57604051631ab7da6b60e01b815260040160405180910390fd5b611ac6887f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f612723565b611af5887f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f8989893089611f4e565b6040516370a0823160e01b8152306004820152909350611b6e9150899086906001600160a01b038316906370a0823190602401602060405180830381865afa158015611b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b699190613d62565b61293c565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611bd057600080fd5b505af1158015611be4573d6000803e3d6000fd5b50505050611bf284836129fe565b611c1c887f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f612a8c565b509695505050505050565b600354819060ff168015611c3a57504281105b15611c5857604051631ab7da6b60e01b815260040160405180910390fd5b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031685856000818110611c9557611c95613d4c565b9050602002016020810190611caa919061398e565b6001600160a01b031614611cd1576040516320db826760e01b815260040160405180910390fd5b60003490507f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d3157600080fd5b505af1158015611d45573d6000803e3d6000fd5b50505050507f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031663a9059cbb611d8f88886000818110610dbd57610dbd613d4c565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611ddc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e009190613d7b565b611e0c57611e0c61372e565b60008686611e1b600182613d39565b818110611e2a57611e2a613d4c565b9050602002016020810190611e3f919061398e565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015611e87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eab9190613d62565b9050611eeb878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613148915050565b87818888611efa600182613d39565b818110611f0957611f09613d4c565b9050602002016020810190611f1e919061398e565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a0823190602401610f3e565b6003546000908190839060ff168015611f6657504281105b15611f8457604051631ab7da6b60e01b815260040160405180910390fd5b611f8e8a8a612723565b6000611f9a8b8b6115cd565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015611ff0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120149190613d7b565b612031576040516312171d8360e31b815260040160405180910390fd5b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af115801561207d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a19190613df7565b9150915060006120b18e8e610c9d565b509050806001600160a01b03168e6001600160a01b0316146120d45781836120d7565b82825b90975095508a8710156120fd57604051638dc525d160e01b815260040160405180910390fd5b8986101561211e5760405163ef71d09160e01b815260040160405180910390fd5b6121288e8e612a8c565b505050505097509795505050505050565b6060600282101561215d576040516320db826760e01b815260040160405180910390fd5b60006121698484612ccd565b90506110c485826116e8565b60008060006121848585610c9d565b50905060008061219487876115cd565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156121d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f59190613e1b565b5091509150826001600160a01b0316876001600160a01b03161461221a57808261221d565b81815b909890975095505050505050565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f0000000000000000000000004ddf0fa98b5f9bd7cb0645c25ba89a574fe9be8c9091169063e5e31b1390602401602060405180830381865afa158015612296573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ba9190613d7b565b92915050565b60035460009081908190849060ff1680156122da57504281105b156122f857604051631ab7da6b60e01b815260040160405180910390fd5b6123028c8c612723565b600061230e8d8d6115cd565b6001600160a01b03811660009081526001602052604090205490915060ff1661233c8e8e838f8f8f8f613482565b909650945061234d8e338489612e77565b6123598d338488612e77565b6040516335313c2160e11b81526001600160a01b038981166004830152831690636a627842906024016020604051808303816000875af11580156123a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c59190613d62565b93506123d18e8e612a8c565b505050985098509895505050505050565b6123ea612c73565b6001600160a01b0381166124545760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61245d816133e9565b50565b60035460009081908190849060ff16801561247a57504281105b1561249857604051631ab7da6b60e01b815260040160405180910390fd5b6124c28a7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f612723565b60006124ee8b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6115cd565b6001600160a01b03811660009081526001602052604090205490915060ff1661253c8c7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f838e348f8f613482565b909650945061254d8c338489612e77565b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125a857600080fd5b505af11580156125bc573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038681166004830152602482018a90527f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f16935063a9059cbb925060440190506020604051808303816000875af1158015612631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126559190613d7b565b6126615761266161372e565b6040516335313c2160e11b81526001600160a01b038981166004830152831690636a627842906024016020604051808303816000875af11580156126a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126cd9190613d62565b9350843411156126ea576126ea336126e58734613d39565b6129fe565b6127148c7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f612a8c565b50505096509650969350505050565b600354610100900460ff16612736575050565b60035462010000900460ff16158061276657506001600160a01b03821660009081526002602052604090205460ff165b15612839576040516337e26cd160e21b815230600482015282906001600160a01b0382169063df89b344906024016020604051808303816000875af19250505080156127cf575060408051601f3d908101601f191682019092526127cc91810190613d7b565b60015b156128375780156128355760405163bd7d67e960e01b8152600160048201526001600160a01b0383169063bd7d67e990602401600060405180830381600087803b15801561281c57600080fd5b505af1158015612830573d6000803e3d6000fd5b505050505b505b505b60035462010000900460ff16158061286957506001600160a01b03811660009081526002602052604090205460ff165b15612938576040516337e26cd160e21b815230600482015281906001600160a01b0382169063df89b344906024016020604051808303816000875af19250505080156128d2575060408051601f3d908101601f191682019092526128cf91810190613d7b565b60015b156129365780156129345760405163bd7d67e960e01b8152600160048201526001600160a01b0383169063bd7d67e9906024015b600060405180830381600087803b15801561292057600080fd5b505af1158015610fa8573d6000803e3d6000fd5b505b505b5050565b826001600160a01b03163b6000036129675760405163c1ab6dc160e01b815260040160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b038381166004830152602482018390526000919085169063a9059cbb906044016020604051808303816000875af11580156129ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129de9190613d7b565b905080612934576040516312171d8360e31b815260040160405180910390fd5b604080516000808252602082019092526001600160a01b038416908390604051612a289190613e6d565b60006040518083038185875af1925050503d8060008114612a65576040519150601f19603f3d011682016040523d82523d6000602084013e612a6a565b606091505b505090508061293657604051631db12dd560e21b815260040160405180910390fd5b600354610100900460ff16612a9f575050565b60035462010000900460ff161580612acf57506001600160a01b03821660009081526002602052604090205460ff165b15612ba2576040516337e26cd160e21b815230600482015282906001600160a01b0382169063df89b344906024016020604051808303816000875af1925050508015612b38575060408051601f3d908101601f19168201909252612b3591810190613d7b565b60015b15612ba0578015612b9e5760405163bd7d67e960e01b8152600060048201526001600160a01b0383169063bd7d67e990602401600060405180830381600087803b158015612b8557600080fd5b505af1158015612b99573d6000803e3d6000fd5b505050505b505b505b60035462010000900460ff161580612bd257506001600160a01b03811660009081526002602052604090205460ff165b15612938576040516337e26cd160e21b815230600482015281906001600160a01b0382169063df89b344906024016020604051808303816000875af1925050508015612c3b575060408051601f3d908101601f19168201909252612c3891810190613d7b565b60015b156129365780156129345760405163bd7d67e960e01b8152600060048201526001600160a01b0383169063bd7d67e990602401612906565b6000546001600160a01b031633146110e15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161244b565b6060612cda600183613d39565b67ffffffffffffffff811115612cf257612cf2613a12565b604051908082528060200260200182016040528015612d3d57816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181612d105790505b50905060005b612d4e600184613d39565b81101561194657600060016000612da1878786818110612d7057612d70613d4c565b9050602002016020810190612d85919061398e565b8888612d92886001613dcb565b818110610de557610de5613d4c565b6001600160a01b03168152602081019190915260409081016000205481516060810190925260ff16915080868685818110612dde57612dde613d4c565b9050602002016020810190612df3919061398e565b6001600160a01b031681526020018686612e0e866001613dcb565b818110612e1d57612e1d613d4c565b9050602002016020810190612e32919061398e565b6001600160a01b03168152602001821515815250838381518110612e5857612e58613d4c565b6020026020010181905250508080612e6f90613dde565b915050612d43565b836001600160a01b03163b600003612ea25760405163c1ab6dc160e01b815260040160405180910390fd5b6040516323b872dd60e01b81526001600160a01b038481166004830152838116602483015260448201839052600091908616906323b872dd906064016020604051808303816000875af1158015612efd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f219190613d7b565b905080611a35576040516312171d8360e31b815260040160405180910390fd5b60005b8251811015612934576000612f93848381518110612f6457612f64613d4c565b602002602001015160000151858481518110612f8257612f82613d4c565b602002602001015160200151610c9d565b509050600085612fa4846001613dcb565b81518110612fb457612fb4613d4c565b60200260200101519050600080836001600160a01b0316878681518110612fdd57612fdd613d4c565b6020026020010151600001516001600160a01b031614612fff57826000613003565b6000835b915091506000600188516130179190613d39565b8610613023578661306c565b61306c88613032886001613dcb565b8151811061304257613042613d4c565b6020026020010151600001518988600161305c9190613dcb565b81518110610a9657610a96613d4c565b90506130a188878151811061308357613083613d4c565b602002602001015160000151898881518110610a9657610a96613d4c565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156130de576020820181803683370190505b506040518563ffffffff1660e01b81526004016130fe9493929190613e89565b600060405180830381600087803b15801561311857600080fd5b505af115801561312c573d6000803e3d6000fd5b505050505050505050808061314090613dde565b915050612f44565b60005b600183516131599190613d39565b8110156129365760008084838151811061317557613175613d4c565b60200260200101518584600161318b9190613dcb565b8151811061319b5761319b613d4c565b60200260200101519150915060006131b38383610c9d565b50905060006131c284846115cd565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061322c9190613e1b565b50915091506000866001600160a01b0316896001600160a01b031614613253578183613256565b82825b506040516370a0823160e01b81526001600160a01b03888116600483015291925082918b16906370a0823190602401602060405180830381865afa1580156132a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132c69190613d62565b6132d09190613d39565b94506132dd858a8a610fb2565b9350505050600080856001600160a01b0316886001600160a01b0316146133065782600061330a565b6000835b91509150600060028c5161331e9190613d39565b8a101561335957613352888d6133358d6002613dcb565b8151811061334557613345613d4c565b60200260200101516115cd565b905061335c565b50895b6040805160008152602081019182905263022c0d9f60e01b9091526001600160a01b0387169063022c0d9f9061339b9086908690869060248101613e89565b600060405180830381600087803b1580156133b557600080fd5b505af11580156133c9573d6000803e3d6000fd5b5050505050505050505050505080806133e190613dde565b91505061314b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060006134488686610c9d565b915091507f0000000000000000000000004ddf0fa98b5f9bd7cb0645c25ba89a574fe9be8c82828660405160200161164a93929190613d98565b6000808386108061349257508285105b156134b05760405163162908e360e11b815260040160405180910390fd5b6040516306801cc360e41b81526001600160a01b038a81166004830152898116602483015288151560448301526000917f0000000000000000000000004ddf0fa98b5f9bd7cb0645c25ba89a574fe9be8c90911690636801cc3090606401602060405180830381865afa15801561352b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061354f9190613ed9565b90506001600160a01b0381166135fe576040516320b7f73960e21b81526001600160a01b038b811660048301528a8116602483015289151560448301527f0000000000000000000000004ddf0fa98b5f9bd7cb0645c25ba89a574fe9be8c16906382dfdce4906064016020604051808303816000875af11580156135d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135fb9190613ed9565b90505b60008061360b8c8c612175565b9150915081600014801561361d575080155b1561362d578894508793506136b7565b600061363a8a84846136c6565b905088811161366f57868110156136645760405163ef71d09160e01b815260040160405180910390fd5b8995509350836136b5565b600061367c8a84866136c6565b90508a81111561368e5761368e61372e565b888110156136af57604051638dc525d160e01b815260040160405180910390fd5b95508894505b505b50505097509795505050505050565b60008084116136e857604051632ca2f52b60e11b815260040160405180910390fd5b8215806136f3575081155b156137115760405163bb55fd2760e01b815260040160405180910390fd5b8261371c8386613ef6565b6137269190613f0d565b949350505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b038116811461245d57600080fd5b60008060008060008060c0878903121561377257600080fd5b863561377d81613744565b955060208701359450604087013593506060870135925060808701356137a281613744565b8092505060a087013590509295509295509295565b801515811461245d57600080fd5b6000602082840312156137d757600080fd5b81356137e2816137b7565b9392505050565b60008083601f8401126137fb57600080fd5b50813567ffffffffffffffff81111561381357600080fd5b6020830191508360208260051b8501011115610d2157600080fd5b60008060008060008060a0878903121561384757600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561386c57600080fd5b61387889828a016137e9565b909550935050606087013561388c81613744565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b818110156138d9578351835292840192918401916001016138bd565b50909695505050505050565b600080604083850312156138f857600080fd5b823561390381613744565b91506020830135613913816137b7565b809150509250929050565b6000806040838503121561393157600080fd5b823561393c81613744565b9150602083013561391381613744565b60008060006060848603121561396157600080fd5b83359250602084013561397381613744565b9150604084013561398381613744565b809150509250925092565b6000602082840312156139a057600080fd5b81356137e281613744565b6000806000806000608086880312156139c357600080fd5b85359450602086013567ffffffffffffffff8111156139e157600080fd5b6139ed888289016137e9565b9095509350506040860135613a0181613744565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715613a4b57613a4b613a12565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613a7a57613a7a613a12565b604052919050565b6000806040808486031215613a9657600080fd5b8335925060208085013567ffffffffffffffff80821115613ab657600080fd5b818701915087601f830112613aca57600080fd5b813581811115613adc57613adc613a12565b613aea848260051b01613a51565b8181528481019250606091820284018501918a831115613b0957600080fd5b938501935b82851015613b6c5780858c031215613b265760008081fd5b613b2e613a28565b8535613b3981613744565b815285870135613b4881613744565b8188015285880135613b59816137b7565b8189015284529384019392850192613b0e565b508096505050505050509250929050565b60008060008060408587031215613b9357600080fd5b843567ffffffffffffffff80821115613bab57600080fd5b613bb7888389016137e9565b90965094506020870135915080821115613bd057600080fd5b50613bdd878288016137e9565b95989497509550505050565b600080600080600080600060e0888a031215613c0457600080fd5b8735613c0f81613744565b96506020880135613c1f81613744565b955060408801359450606088013593506080880135925060a0880135613c4481613744565b8092505060c0880135905092959891949750929550565b600080600060408486031215613c7057600080fd5b83359250602084013567ffffffffffffffff811115613c8e57600080fd5b613c9a868287016137e9565b9497909650939450505050565b600080600080600080600080610100898b031215613cc457600080fd5b8835613ccf81613744565b97506020890135613cdf81613744565b965060408901359550606089013594506080890135935060a0890135925060c0890135613d0b81613744565b8092505060e089013590509295985092959890939650565b634e487b7160e01b600052601160045260246000fd5b818103818111156122ba576122ba613d23565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613d7457600080fd5b5051919050565b600060208284031215613d8d57600080fd5b81516137e2816137b7565b6bffffffffffffffffffffffff19606094851b811682529290931b9091166014830152151560f81b602882015260290190565b808201808211156122ba576122ba613d23565b600060018201613df057613df0613d23565b5060010190565b60008060408385031215613e0a57600080fd5b505080516020909101519092909150565b600080600060608486031215613e3057600080fd5b8351925060208401519150604084015190509250925092565b60005b83811015613e64578181015183820152602001613e4c565b50506000910152565b60008251613e7f818460208701613e49565b9190910192915050565b84815283602082015260018060a01b03831660408201526080606082015260008251806080840152613ec28160a0850160208701613e49565b601f01601f19169190910160a00195945050505050565b600060208284031215613eeb57600080fd5b81516137e281613744565b80820281158282048414176122ba576122ba613d23565b600082613f2a57634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212202e016813496ad0b4c738836e30897bee7e4d7ed2b9b7a2e06b10b1433c2e92e764736f6c63430008110033

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

0000000000000000000000004ddf0fa98b5f9bd7cb0645c25ba89a574fe9be8c000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f

-----Decoded View---------------
Arg [0] : _factory (address): 0x4DDf0fa98B5f9Bd7Cb0645c25bA89A574fe9Be8c
Arg [1] : _wcanto (address): 0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000004ddf0fa98b5f9bd7cb0645c25ba89a574fe9be8c
Arg [1] : 000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f


Deployed Bytecode Sourcemap

370:25131:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1911:10;-1:-1:-1;;;;;1933:6:3;1911:29;;1904:37;;;;:::i;:::-;370:25131;;;;;22050:791;;;;;;;;;;-1:-1:-1;22050:791:3;;;;;:::i;:::-;;:::i;:::-;;;;1124:25:9;;;1180:2;1165:18;;1158:34;;;;1097:18;22050:791:3;;;;;;;;24778:105;;;;;;;;;;-1:-1:-1;24778:105:3;;;;;:::i;:::-;;:::i;25022:165::-;;;;;;;;;;-1:-1:-1;25022:165:3;;;;;:::i;:::-;;:::i;12061:883::-;;;;;;;;;;-1:-1:-1;12061:883:3;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;890:47::-;;;;;;;;;;-1:-1:-1;890:47:3;;;;;;;;;;;;;;3529:14:9;;3522:22;3504:41;;3492:2;3477:18;890:47:3;3364:187:9;10696:662:3;;;;;;;;;;-1:-1:-1;10696:662:3;;;;;:::i;:::-;;:::i;846:38::-;;;;;;;;;;-1:-1:-1;846:38:3;;;;;;;;;;;24351:112;;;;;;;;;;-1:-1:-1;24351:112:3;;;;;:::i;:::-;;:::i;4950:361::-;;;;;;;;;;-1:-1:-1;4950:361:3;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4566:15:9;;;4548:34;;4618:15;;;;4613:2;4598:18;;4591:43;4483:18;4950:361:3;4336:304:9;24889:127:3;;;;;;;;;;-1:-1:-1;24889:127:3;;;;;:::i;:::-;;:::i;14461:700::-;;;;;;;;;;-1:-1:-1;14461:700:3;;;;;:::i;:::-;;:::i;7415:342::-;;;;;;;;;;-1:-1:-1;7415:342:3;;;;;:::i;:::-;;:::i;:::-;;;5252:25:9;;;5240:2;5225:18;7415:342:3;5106:177:9;694:43:3;;;;;;;;;;-1:-1:-1;694:43:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;1831:101:0;;;;;;;;;;;;;:::i;15940:811:3:-;;;;;;;;;;-1:-1:-1;15940:811:3;;;;;:::i;:::-;;:::i;563:31::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5720:32:9;;;5702:51;;5690:2;5675:18;563:31:3;5540:219:9;11364:691:3;;;;;;:::i;:::-;;:::i;1201:85:0:-;;;;;;;;;;-1:-1:-1;1247:7:0;1273:6;-1:-1:-1;;;;;1273:6:0;1201:85;;6062:771:3;;;;;;;;;;-1:-1:-1;6062:771:3;;;;;:::i;:::-;;:::i;7836:641::-;;;;;;;;;;-1:-1:-1;7836:641:3;;;;;:::i;:::-;;:::i;25337:162::-;;;;;;;;;;-1:-1:-1;25337:162:3;;;;;:::i;:::-;;:::i;24469:303::-;;;;;;;;;;-1:-1:-1;24469:303:3;;;;;:::i;:::-;;:::i;813:27::-;;;;;;;;;;-1:-1:-1;813:27:3;;;;;;;;25193:138;;;;;;;;;;-1:-1:-1;25193:138:3;;;;;:::i;:::-;;:::i;4857:87::-;;;;;;;;;;-1:-1:-1;4930:6:3;4857:87;;22917:795;;;;;;;;;;-1:-1:-1;22917:795:3;;;;;:::i;:::-;;:::i;743:64::-;;;;;;;;;;-1:-1:-1;743:64:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;15167:767;;;;;;:::i;:::-;;:::i;21073:971::-;;;;;;;;;;-1:-1:-1;21073:971:3;;;;;:::i;:::-;;:::i;525:32::-;;;;;;;;;;;;;;;8514:303;;;;;;;;;;-1:-1:-1;8514:303:3;;;;;:::i;:::-;;:::i;6888:448::-;;;;;;;;;;-1:-1:-1;6888:448:3;;;;;:::i;:::-;;:::i;9269:121::-;;;;;;;;;;-1:-1:-1;9269:121:3;;;;;:::i;:::-;;:::i;18615:1001::-;;;;;;;;;;-1:-1:-1;18615:1001:3;;;;;:::i;:::-;;:::i;:::-;;;;12181:25:9;;;12237:2;12222:18;;12215:34;;;;12265:18;;;12258:34;12169:2;12154:18;18615:1001:3;11979:319:9;2081:198:0;;;;;;;;;;-1:-1:-1;2081:198:0;;;;;:::i;:::-;;:::i;19622:1220:3:-;;;;;;:::i;:::-;;:::i;22050:791::-;1474:15;;22301:19;;;;22274:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;22357:49:::1;22383:5;22398:6;22357:25;:49::i;:::-;22446:201;22475:5;22502:6;22523:9;22546:14;22574;22610:4;22629:8;22446:15;:201::i;:::-;22417:230:::0;;-1:-1:-1;22417:230:3;-1:-1:-1;22657:37:3::1;22671:5:::0;22678:2;22417:230;22657:13:::1;:37::i;:::-;22704:28;::::0;-1:-1:-1;;;22704:28:3;;::::1;::::0;::::1;5252:25:9::0;;;22704:6:3::1;-1:-1:-1::0;;;;;22704:15:3::1;::::0;::::1;::::0;5225:18:9;;22704:28:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22742:33;22759:2;22763:11;22742:16;:33::i;:::-;22786:48;22811:5;22826:6;22786:24;:48::i;:::-;22050:791:::0;;;;;;;;;;:::o;24778:105::-;1094:13:0;:11;:13::i;:::-;24850:15:3::1;:26:::0;;-1:-1:-1;;24850:26:3::1;::::0;::::1;;::::0;;;::::1;::::0;;24778:105::o;25022:165::-;1094:13:0;:11;:13::i;:::-;25134:35:3::1;:46:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;25134:46:3;;::::1;::::0;;;::::1;::::0;;25022:165::o;12061:883::-;1474:15;;12268:24;;12249:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;-1:-1:-1;;;;;12341:6:3::1;12308:40;:4:::0;;12313:15:::1;12327:1;12308:4:::0;12313:15:::1;:::i;:::-;12308:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;12308:40:3::1;;12304:91;;12371:13;;-1:-1:-1::0;;;12371:13:3::1;;;;;;;;;;;12304:91;12404:21;12428:19;12442:4;;12428:13;:19::i;:::-;12404:43;;12467:31;12481:8;12491:6;12467:13;:31::i;:::-;12457:41;;12542:12;12512:7;12537:1;12520:7;:14;:18;;;;:::i;:::-;12512:27;;;;;;;;:::i;:::-;;;;;;;:42;12508:106;;;12577:26;;-1:-1:-1::0;;;12577:26:3::1;;;;;;;;;;;12508:106;12623:154;12654:6;12661:1;12654:9;;;;;;;;:::i;:::-;;;;;;;:14;;;12682:10;12706:37;12714:6;12721:1;12714:9;;;;;;;;:::i;:::-;;;;;;;:14;;;12730:6;12737:1;12730:9;;;;;;;;:::i;:::-;;;;;;;:12;;;12706:7;:37::i;:::-;12757:7;12765:1;12757:10;;;;;;;;:::i;:::-;;;;;;;12623:17;:154::i;:::-;12787:37;12793:7;12802:6;12818:4;12787:5;:37::i;:::-;12834:6;-1:-1:-1::0;;;;;12834:15:3::1;;12850:7;12875:1;12858:7;:14;:18;;;;:::i;:::-;12850:27;;;;;;;;:::i;:::-;;;;;;;12834:44;;;;;;;;;;;;;5252:25:9::0;;5240:2;5225:18;;5106:177;12834:44:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;12888:49;12905:2;12909:7;12934:1;12917:7;:14;:18;;;;:::i;:::-;12909:27;;;;;;;;:::i;:::-;;;;;;;12888:16;:49::i;:::-;12294:650;12061:883:::0;;;;;;;;;:::o;10696:662::-;1474:15;;10906:24;;10887:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;10942:21:::1;10966:19;10980:4;;10966:13;:19::i;:::-;10942:43;;11005:31;11019:8;11029:6;11005:13;:31::i;:::-;10995:41;;11080:12;11050:7;11075:1;11058:7;:14;:18;;;;:::i;:::-;11050:27;;;;;;;;:::i;:::-;;;;;;;:42;11046:106;;;11115:26;;-1:-1:-1::0;;;11115:26:3::1;;;;;;;;;;;11046:106;11161:154;11192:6;11199:1;11192:9;;;;;;;;:::i;11161:154::-;11325:26;11331:7;11340:6;11348:2;11325:5;:26::i;24351:112::-:0;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;24430:17:3;;;::::1;;::::0;;;:11:::1;:17;::::0;;;;:26;;-1:-1:-1;;24430:26:3::1;::::0;::::1;;::::0;;;::::1;::::0;;24351:112::o;4950:361::-;5047:14;5063;5107:6;-1:-1:-1;;;;;5097:16:3;:6;-1:-1:-1;;;;;5097:16:3;;5093:49;;5122:20;;-1:-1:-1;;;5122:20:3;;;;;;;;;;;5093:49;5180:6;-1:-1:-1;;;;;5171:15:3;:6;-1:-1:-1;;;;;5171:15:3;;:77;;5233:6;5241;5171:77;;;5202:6;5210;5171:77;5152:96;;-1:-1:-1;5152:96:3;-1:-1:-1;;;;;;5262:20:3;;5258:46;;5291:13;;-1:-1:-1;;;5291:13:3;;;;;;;;;;;5258:46;4950:361;;;;;:::o;24889:127::-;1094:13:0;:11;:13::i;:::-;24972:26:3::1;:37:::0;;;::::1;;;;-1:-1:-1::0;;24972:37:3;;::::1;::::0;;;::::1;::::0;;24889:127::o;14461:700::-;1474:15;;14689:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;14709:133:::1;14740:4;;14745:1;14740:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;14761:10;14785:25;14793:4;;14798:1;14793:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;14802:4;;14807:1;14802:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;14785:25::-;14824:8;14709:17;:133::i;:::-;14852:21;14883:4:::0;;14888:15:::1;14902:1;14883:4:::0;14888:15:::1;:::i;:::-;14883:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;14876:43;::::0;-1:-1:-1;;;14876:43:3;;-1:-1:-1;;;;;5720:32:9;;;14876:43:3::1;::::0;::::1;5702:51:9::0;14876:39:3;;;::::1;::::0;::::1;::::0;5675:18:9;;14876:43:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14852:67;;14929:44;14964:4;;14929:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;14970:2:3;;-1:-1:-1;14929:34:3::1;::::0;-1:-1:-1;;14929:44:3:i:1;:::-;15074:12:::0;15046:13;15007:4;;15012:15:::1;15026:1;15007:4:::0;15012:15:::1;:::i;:::-;15007:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;15000:43;::::0;-1:-1:-1;;;15000:43:3;;-1:-1:-1;;;;;5720:32:9;;;15000:43:3::1;::::0;::::1;5702:51:9::0;15000:39:3;;;::::1;::::0;::::1;::::0;5675:18:9;;15000:43:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;;:::i;:::-;:86;14983:172;;;15118:26;;-1:-1:-1::0;;;15118:26:3::1;;;;;;;;;;;14983:172;14699:462;14461:700:::0;;;;;;;:::o;7415:342::-;7541:14;7567:12;7582:26;7590:7;7599:8;7582:7;:26::i;:::-;7622:40;;-1:-1:-1;;;7622:40:3;;-1:-1:-1;;;;;5720:32:9;;;7622:40:3;;;5702:51:9;7567:41:3;;-1:-1:-1;7641:7:3;7622:34;;;;;;5675:18:9;;7622:40:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7618:133;;;7687:53;;-1:-1:-1;;;7687:53:3;;;;;13313:25:9;;;-1:-1:-1;;;;;13374:32:9;;;13354:18;;;13347:60;7687:34:3;;;;;13286:18:9;;7687:53:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7678:62;;7618:133;7557:200;7415:342;;;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;15940:811:3:-;1474:15;;16165:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;-1:-1:-1;;;;;16222:6:3::1;16189:40;:4:::0;;16194:15:::1;16208:1;16189:4:::0;16194:15:::1;:::i;:::-;16189:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;16189:40:3::1;;16185:91;;16252:13;;-1:-1:-1::0;;;16252:13:3::1;;;;;;;;;;;16185:91;16285:133;16316:4;;16321:1;16316:7;;;;;;;:::i;16285:133::-;16428:55;16463:4;;16428:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;16477:4:3::1;::::0;-1:-1:-1;16428:34:3::1;::::0;-1:-1:-1;;16428:55:3:i:1;:::-;16513:48;::::0;-1:-1:-1;;;16513:48:3;;16555:4:::1;16513:48;::::0;::::1;5702:51:9::0;16493:17:3::1;::::0;16528:6:::1;-1:-1:-1::0;;;;;16513:33:3::1;::::0;::::1;::::0;5675:18:9;;16513:48:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16493:68;;16587:12;16575:9;:24;16571:88;;;16622:26;;-1:-1:-1::0;;;16622:26:3::1;;;;;;;;;;;16571:88;16668:35;::::0;-1:-1:-1;;;16668:35:3;;::::1;::::0;::::1;5252:25:9::0;;;16676:6:3::1;-1:-1:-1::0;;;;;16668:24:3::1;::::0;::::1;::::0;5225:18:9;;16668:35:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16713:31;16730:2;16734:9;16713:16;:31::i;11364:691::-:0;1474:15;;11553:24;;11534:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;11612:6:::1;-1:-1:-1::0;;;;;11593:26:3::1;:4;;11598:1;11593:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;11593:26:3::1;;11589:52;;11628:13;;-1:-1:-1::0;;;11628:13:3::1;;;;;;;;;;;11589:52;11651:21;11675:19;11689:4;;11675:13;:19::i;:::-;11651:43;;11714:32;11728:9;11739:6;11714:13;:32::i;:::-;11704:42;;11790:12;11760:7;11785:1;11768:7;:14;:18;;;;:::i;:::-;11760:27;;;;;;;;:::i;:::-;;;;;;;:42;11756:106;;;11825:26;;-1:-1:-1::0;;;11825:26:3::1;;;;;;;;;;;11756:106;11871:6;-1:-1:-1::0;;;;;11871:14:3::1;;11893:7;11901:1;11893:10;;;;;;;;:::i;:::-;;;;;;;11871:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;11936:6;-1:-1:-1::0;;;;;11936:15:3::1;;11952:37;11960:6;11967:1;11960:9;;;;;;;;:::i;:::-;;;;;;;:14;;;11976:6;11983:1;11976:9;;;;;;;;:::i;11952:37::-;11991:7;11999:1;11991:10;;;;;;;;:::i;:::-;;;;;;;11936:66;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;13610:32:9;;;;13592:51;;13674:2;13659:18;;13652:34;13580:2;13565:18;;13418:274;11936:66:3::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11916:96;;;;:::i;:::-;12022:26;12028:7;12037:6;12045:2;12022:5;:26::i;:::-;11579:476;11364:691:::0;;;;;;;;:::o;6062:771::-;6156:12;6185:14;6201;6219:26;6230:6;6238;6219:10;:26::i;:::-;6184:61;;;;6255:13;6271:11;:43;6283:30;6292:6;6300;6308:4;6283:8;:30::i;:::-;-1:-1:-1;;;;;6271:43:3;;;;;;;;;;;;;;;-1:-1:-1;6271:43:3;;6604:42;;6271:43;;;;;-1:-1:-1;6524:7:3;;6604:42;;6621:6;;6629;;6271:43;;6604:42;;:::i;:::-;;;;;;;;;;;;;6561:115;;;;;;6706:12;6441:321;;;;;;;;;-1:-1:-1;;;;;;14406:26:9;;14469:2;14465:15;;;;-1:-1:-1;;14461:53:9;14457:1;14448:11;;14441:74;14540:2;14531:12;;14524:28;;;;14577:2;14568:12;;14561:28;14614:2;14605:12;;14120:503;6441:321:3;;;;-1:-1:-1;;6441:321:3;;;;;;;;;6406:378;;6441:321;6406:378;;;;;6062:771;-1:-1:-1;;;;;;6062:771:3:o;7836:641::-;7945:24;8005:1;7989:6;:13;:17;7985:43;;;8015:13;;-1:-1:-1;;;8015:13:3;;;;;;;;;;;7985:43;8062:13;;:17;;8078:1;8062:17;:::i;:::-;8048:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8048:32:3;;8038:42;;8103:8;8090:7;8098:1;8090:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;8126:9;8121:350;8145:6;:13;8141:1;:17;8121:350;;;8179:12;8194:37;8202:6;8209:1;8202:9;;;;;;;;:::i;:::-;;;;;;;:14;;;8218:6;8225:1;8218:9;;;;;;;;:::i;8194:37::-;8249:40;;-1:-1:-1;;;8249:40:3;;-1:-1:-1;;;;;5720:32:9;;;8249:40:3;;;5702:51:9;8179:52:3;;-1:-1:-1;8268:7:3;8249:34;;;;;;5675:18:9;;8249:40:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8245:216;;;8342:4;-1:-1:-1;;;;;8326:34:3;;8382:7;8390:1;8382:10;;;;;;;;:::i;:::-;;;;;;;8414:6;8421:1;8414:9;;;;;;;;:::i;:::-;;;;;;;:14;;;8326:120;;;;;;;;;;;;;;;13313:25:9;;;-1:-1:-1;;;;;13374:32:9;13369:2;13354:18;;13347:60;13301:2;13286:18;;13139:274;8326:120:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8309:7;8317:5;:1;8321;8317:5;:::i;:::-;8309:14;;;;;;;;:::i;:::-;;;;;;:137;;;;;8245:216;-1:-1:-1;8160:3:3;;;;:::i;:::-;;;;8121:350;;;;7836:641;;;;:::o;25337:162::-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;25445:39:3::1;25487:5;25445:39:::0;;;:32:::1;:39;::::0;;;;:47;;-1:-1:-1;;25445:47:3::1;::::0;;25337:162::o;24469:303::-;1094:13:0;:11;:13::i;:::-;24596:29:3;;::::1;24592:63;;24634:21;;-1:-1:-1::0;;;24634:21:3::1;;;;;;;;;;;24592:63;24670:9;24665:101;24685:16:::0;;::::1;24665:101;;;24746:6;;24753:1;24746:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;24722:11;:21;24734:5;;24740:1;24734:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24722:21:3::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;24722:21:3;:33;;-1:-1:-1;;24722:33:3::1;::::0;::::1;;::::0;;;::::1;::::0;;24703:3;::::1;::::0;::::1;:::i;:::-;;;;24665:101;;;;24469:303:::0;;;;:::o;25193:138::-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;25278:39:3::1;;::::0;;;:32:::1;:39;::::0;;;;:46;;-1:-1:-1;;25278:46:3::1;25320:4;25278:46;::::0;;25193:138::o;22917:795::-;1474:15;;23181:19;;23162:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;23212:49:::1;23238:5;23253:6;23212:25;:49::i;:::-;23290:201;23319:5;23346:6;23367:9;23390:14;23418;23454:4;23473:8;23290:15;:201::i;:::-;23526:38;::::0;-1:-1:-1;;;23526:38:3;;23558:4:::1;23526:38;::::0;::::1;5702:51:9::0;23272:219:3;;-1:-1:-1;23501:64:3::1;::::0;-1:-1:-1;23515:5:3;;23522:2;;-1:-1:-1;;;;;23526:23:3;::::1;::::0;::::1;::::0;5675:18:9;;23526:38:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23501:13;:64::i;:::-;23575:28;::::0;-1:-1:-1;;;23575:28:3;;::::1;::::0;::::1;5252:25:9::0;;;23575:6:3::1;-1:-1:-1::0;;;;;23575:15:3::1;::::0;::::1;::::0;5225:18:9;;23575:28:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;23613:33;23630:2;23634:11;23613:16;:33::i;:::-;23657:48;23682:5;23697:6;23657:24;:48::i;:::-;22917:795:::0;;;;;;;;;:::o;15167:767::-;1474:15;;15374:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;15417:6:::1;-1:-1:-1::0;;;;;15398:26:3::1;:4;;15403:1;15398:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;15398:26:3::1;;15394:52;;15433:13;;-1:-1:-1::0;;;15433:13:3::1;;;;;;;;;;;15394:52;15456:16;15475:9;15456:28;;15502:6;-1:-1:-1::0;;;;;15494:23:3::1;;15525:8;15494:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;15561:6;-1:-1:-1::0;;;;;15553:24:3::1;;15578:25;15586:4;;15591:1;15586:7;;;;;;;:::i;15578:25::-;15553:61;::::0;-1:-1:-1;;;;;;15553:61:3::1;::::0;;;;;;-1:-1:-1;;;;;13610:32:9;;;15553:61:3::1;::::0;::::1;13592:51:9::0;13659:18;;;13652:34;;;13565:18;;15553:61:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15546:69;;;;:::i;:::-;15625:21;15656:4:::0;;15661:15:::1;15675:1;15656:4:::0;15661:15:::1;:::i;:::-;15656:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;15649:43;::::0;-1:-1:-1;;;15649:43:3;;-1:-1:-1;;;;;5720:32:9;;;15649:43:3::1;::::0;::::1;5702:51:9::0;15649:39:3;;;::::1;::::0;::::1;::::0;5675:18:9;;15649:43:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15625:67;;15702:44;15737:4;;15702:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;15743:2:3;;-1:-1:-1;15702:34:3::1;::::0;-1:-1:-1;;15702:44:3:i:1;:::-;15847:12:::0;15819:13;15780:4;;15785:15:::1;15799:1;15780:4:::0;15785:15:::1;:::i;:::-;15780:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;15773:43;::::0;-1:-1:-1;;;15773:43:3;;-1:-1:-1;;;;;5720:32:9;;;15773:43:3::1;::::0;::::1;5702:51:9::0;15773:39:3;;;::::1;::::0;::::1;::::0;5675:18:9;;15773:43:3::1;5540:219:9::0;21073:971:3;1474:15;;21314;;;;21295:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;21358:41:::1;21384:6;21392;21358:25;:41::i;:::-;21410:12;21425:23;21433:6;21441;21425:7;:23::i;:::-;21463:63;::::0;-1:-1:-1;;;21463:63:3;;21498:10:::1;21463:63;::::0;::::1;15138:34:9::0;-1:-1:-1;;;;;21463:34:3;::::1;15188:18:9::0;;;15181:43;;;15240:18;;;15233:34;;;21410:38:3;;-1:-1:-1;21463:34:3::1;::::0;15073:18:9;;21463:63:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21458:105;;21547:16;;-1:-1:-1::0;;;21547:16:3::1;;;;;;;;;;;21458:105;21610:30;::::0;-1:-1:-1;;;21610:30:3;;-1:-1:-1;;;;;5720:32:9;;;21610:30:3::1;::::0;::::1;5702:51:9::0;21574:15:3::1;::::0;;;21610:26;::::1;::::0;::::1;::::0;5675:18:9;;21610:30:3::1;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21573:67;;;;21651:14;21671:26;21682:6;21690;21671:10;:26::i;:::-;21650:47;;;21738:6;-1:-1:-1::0;;;;;21728:16:3::1;:6;-1:-1:-1::0;;;;;21728:16:3::1;;:82;;21793:7;21802;21728:82;;;21760:7;21769;21728:82;21707:103:::0;;-1:-1:-1;21707:103:3;-1:-1:-1;21824:20:3;;::::1;21820:79;;;21867:21;;-1:-1:-1::0;;;21867:21:3::1;;;;;;;;;;;21820:79;21922:10;21912:7;:20;21908:79;;;21955:21;;-1:-1:-1::0;;;21955:21:3::1;;;;;;;;;;;21908:79;21997:40;22022:6;22030;21997:24;:40::i;:::-;21348:696;;;;21073:971:::0;;;;;;;;;;;:::o;8514:303::-;8625:24;8683:1;8669:15;;8665:41;;;8693:13;;-1:-1:-1;;;8693:13:3;;;;;;;;;;;8665:41;8716:21;8740:19;8754:4;;8740:13;:19::i;:::-;8716:43;;8779:31;8793:8;8803:6;8779:13;:31::i;6888:448::-;6986:16;7004;7037:14;7057:26;7068:6;7076;7057:10;:26::i;:::-;7036:47;;;7094:16;7112;7163:23;7171:6;7179;7163:7;:23::i;:::-;-1:-1:-1;;;;;7134:74:3;;:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7093:117;;;;;7253:6;-1:-1:-1;;;;;7243:16:3;:6;-1:-1:-1;;;;;7243:16:3;;:86;;7310:8;7320;7243:86;;;7275:8;7285;7243:86;7220:109;;;;-1:-1:-1;6888:448:3;-1:-1:-1;;;;;;6888:448:3:o;9269:121::-;9343:40;;-1:-1:-1;;;9343:40:3;;-1:-1:-1;;;;;5720:32:9;;;9343:40:3;;;5702:51:9;9320:4:3;;9362:7;9343:34;;;;;;5675:18:9;;9343:40:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9336:47;9269:121;-1:-1:-1;;9269:121:3:o;18615:1001::-;1474:15;;18929;;;;;;18889:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;19029:41:::1;19055:6;19063;19029:25;:41::i;:::-;19081:12;19096:23;19104:6;19112;19096:7;:23::i;:::-;-1:-1:-1::0;;;;;19145:17:3;::::1;19129:13;19145:17:::0;;;:11:::1;:17;::::0;;;;;19081:38;;-1:-1:-1;19145:17:3::1;;19193:189;19220:6:::0;19240;19145:17;19282:14;19310;19338:10;19362;19193:13:::1;:189::i;:::-;19172:210:::0;;-1:-1:-1;19172:210:3;-1:-1:-1;19392:52:3::1;19410:6:::0;19418:10:::1;19430:4:::0;19172:210;19392:17:::1;:52::i;:::-;19454;19472:6;19480:10;19492:4;19498:7;19454:17;:52::i;:::-;19528:30;::::0;-1:-1:-1;;;19528:30:3;;-1:-1:-1;;;;;5720:32:9;;;19528:30:3::1;::::0;::::1;5702:51:9::0;19528:26:3;::::1;::::0;::::1;::::0;5675:18:9;;19528:30:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19516:42;;19569:40;19594:6;19602;19569:24;:40::i;:::-;19019:597;;18615:1001:::0;;;;;;;;;;;;;:::o;2081:198:0:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:0;;16041:2:9;2161:73:0::1;::::0;::::1;16023:21:9::0;16080:2;16060:18;;;16053:30;16119:34;16099:18;;;16092:62;-1:-1:-1;;;16170:18:9;;;16163:36;16216:19;;2161:73:0::1;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;19622:1220:3:-;1474:15;;19910:19;;;;;;19870:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;20018:49:::1;20044:5;20059:6;20018:25;:49::i;:::-;20078:12;20093:31;20101:5;20116:6;20093:7;:31::i;:::-;-1:-1:-1::0;;;;;20150:17:3;::::1;20134:13;20150:17:::0;;;:11:::1;:17;::::0;;;;;20078:46;;-1:-1:-1;20150:17:3::1;;20206:204;20233:5:::0;20260:6:::1;20150:17:::0;20303:18;20335:9:::1;20358:14:::0;20386;20206:13:::1;:204::i;:::-;20177:233:::0;;-1:-1:-1;20177:233:3;-1:-1:-1;20420:55:3::1;20438:5:::0;20445:10:::1;20457:4:::0;20177:233;20420:17:::1;:55::i;:::-;20485:6;-1:-1:-1::0;;;;;20485:14:3::1;;20507:11;20485:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;20538:34:3::1;::::0;-1:-1:-1;;;20538:34:3;;-1:-1:-1;;;;;13610:32:9;;;20538:34:3::1;::::0;::::1;13592:51:9::0;13659:18;;;13652:34;;;20538:6:3::1;:15;::::0;-1:-1:-1;20538:15:3::1;::::0;-1:-1:-1;13565:18:9;;;-1:-1:-1;20538:34:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20531:42;;;;:::i;:::-;20595:30;::::0;-1:-1:-1;;;20595:30:3;;-1:-1:-1;;;;;5720:32:9;;;20595:30:3::1;::::0;::::1;5702:51:9::0;20595:26:3;::::1;::::0;::::1;::::0;5675:18:9;;20595:30:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20583:42;;20686:11;20674:9;:23;20670:107;;;20713:53;20730:10;20742:23;20754:11:::0;20742:9:::1;:23;:::i;:::-;20713:16;:53::i;:::-;20787:48;20812:5;20827:6;20787:24;:48::i;:::-;20008:834;;19622:1220:::0;;;;;;;;;;;:::o;2458:1078::-;2561:26;;;;;;;2556:40;;2458:1078;;:::o;2556:40::-;2624:35;;;;;;;2623:36;;:92;;-1:-1:-1;;;;;;2675:40:3;;;;;;:32;:40;;;;;;;;2623:92;2606:457;;;2818:42;;-1:-1:-1;;;2818:42:3;;2854:4;2818:42;;;5702:51:9;2793:6:3;;-1:-1:-1;;;;;2818:27:3;;;;;5675:18:9;;2818:42:3;;;;;;;;;;;;;;;;;;;-1:-1:-1;2818:42:3;;;;;;;;-1:-1:-1;;2818:42:3;;;;;;;;;;;;:::i;:::-;;;2814:239;;;2947:18;2943:86;;;2987:42;;-1:-1:-1;;;2987:42:3;;3024:4;2987:42;;;3504:41:9;-1:-1:-1;;;;;2987:36:3;;;;;3477:18:9;;2987:42:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2943:86;2861:183;2814:239;2726:337;2606:457;3091:35;;;;;;;3090:36;;:92;;-1:-1:-1;;;;;;3142:40:3;;;;;;:32;:40;;;;;;;;3090:92;3073:457;;;3285:42;;-1:-1:-1;;;3285:42:3;;3321:4;3285:42;;;5702:51:9;3260:6:3;;-1:-1:-1;;;;;3285:27:3;;;;;5675:18:9;;3285:42:3;;;;;;;;;;;;;;;;;;;-1:-1:-1;3285:42:3;;;;;;;;-1:-1:-1;;3285:42:3;;;;;;;;;;;;:::i;:::-;;;3281:239;;;3414:18;3410:86;;;3454:42;;-1:-1:-1;;;3454:42:3;;3491:4;3454:42;;;3504:41:9;-1:-1:-1;;;;;3454:36:3;;;;;3477:18:9;;3454:42:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3410:86;3328:183;3281:239;3193:337;3073:457;2458:1078;;:::o;23753:275::-;23871:5;-1:-1:-1;;;;;23871:17:3;;23892:1;23871:22;23867:49;;23902:14;;-1:-1:-1;;;23902:14:3;;;;;;;;;;;23867:49;23941:33;;-1:-1:-1;;;23941:33:3;;-1:-1:-1;;;;;13610:32:9;;;23941:33:3;;;13592:51:9;13659:18;;;13652:34;;;23926:12:3;;23941:22;;;;;;13565:18:9;;23941:33:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23926:48;;23989:7;23984:37;;24005:16;;-1:-1:-1;;;24005:16:3;;;;;;;;;;;20848:185;20961:12;;;20921;20961;;;;;;;;;-1:-1:-1;;;;;20939:7:3;;;20954:5;;20939:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20920:54;;;20989:7;20984:42;;21005:21;;-1:-1:-1;;;21005:21:3;;;;;;;;;;;3753:1067;3843:26;;;;;;;3838:40;;3753:1067;;:::o;3838:40::-;3906:35;;;;;;;3905:36;;:92;;-1:-1:-1;;;;;;3957:40:3;;;;;;:32;:40;;;;;;;;3905:92;3888:458;;;4100:42;;-1:-1:-1;;;4100:42:3;;4136:4;4100:42;;;5702:51:9;4075:6:3;;-1:-1:-1;;;;;4100:27:3;;;;;5675:18:9;;4100:42:3;;;;;;;;;;;;;;;;;;;-1:-1:-1;4100:42:3;;;;;;;;-1:-1:-1;;4100:42:3;;;;;;;;;;;;:::i;:::-;;;4096:240;;;4229:18;4225:87;;;4269:43;;-1:-1:-1;;;4269:43:3;;4306:5;4269:43;;;3504:41:9;-1:-1:-1;;;;;4269:36:3;;;;;3477:18:9;;4269:43:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4225:87;4143:184;4096:240;4008:338;3888:458;4374:35;;;;;;;4373:36;;:92;;-1:-1:-1;;;;;;4425:40:3;;;;;;:32;:40;;;;;;;;4373:92;4356:458;;;4568:42;;-1:-1:-1;;;4568:42:3;;4604:4;4568:42;;;5702:51:9;4543:6:3;;-1:-1:-1;;;;;4568:27:3;;;;;5675:18:9;;4568:42:3;;;;;;;;;;;;;;;;;;;-1:-1:-1;4568:42:3;;;;;;;;-1:-1:-1;;4568:42:3;;;;;;;;;;;;:::i;:::-;;;4564:240;;;4697:18;4693:87;;;4737:43;;-1:-1:-1;;;4737:43:3;;4774:5;4737:43;;;3504:41:9;-1:-1:-1;;;;;4737:36:3;;;;;3477:18:9;;4737:43:3;3364:187:9;1359:130:0;1247:7;1273:6;-1:-1:-1;;;;;1273:6:0;719:10:2;1422:23:0;1414:68;;;;-1:-1:-1;;;1414:68:0;;16995:2:9;1414:68:0;;;16977:21:9;;;17014:18;;;17007:30;17073:34;17053:18;;;17046:62;17125:18;;1414:68:0;16793:356:9;9396:377:3;9491:21;9549:15;9563:1;9549:4;:15;:::i;:::-;9537:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;9537:28:3;;-1:-1:-1;;9537:28:3;;;;;;;;;;;;9528:37;;9580:9;9575:192;9599:15;9613:1;9599:4;:15;:::i;:::-;9595:1;:19;9575:192;;;9635:13;9651:11;:42;9663:29;9671:4;;9676:1;9671:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;9680:4;;9685:5;:1;9689;9685:5;:::i;:::-;9680:11;;;;;;;:::i;9663:29::-;-1:-1:-1;;;;;9651:42:3;;;;;;;;;;;;;;-1:-1:-1;9651:42:3;;9719:37;;;;;;;;9651:42;;;-1:-1:-1;9719:37:3;9725:4;;9730:1;9725:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9719:37:3;;;;;9734:4;;9739:5;:1;9743;9739:5;:::i;:::-;9734:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9719:37:3;;;;;9747:8;9719:37;;;;;9707:6;9714:1;9707:9;;;;;;;;:::i;:::-;;;;;;:49;;;;9621:146;9616:3;;;;;:::i;:::-;;;;9575:192;;24034:311;24178:5;-1:-1:-1;;;;;24178:17:3;;24199:1;24178:22;24174:49;;24209:14;;-1:-1:-1;;;24209:14:3;;;;;;;;;;;24174:49;24248:43;;-1:-1:-1;;;24248:43:3;;-1:-1:-1;;;;;15156:15:9;;;24248:43:3;;;15138:34:9;15208:15;;;15188:18;;;15181:43;15240:18;;;15233:34;;;24233:12:3;;24248:26;;;;;;15073:18:9;;24248:43:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24233:58;;24306:7;24301:37;;24322:16;;-1:-1:-1;;;24322:16:3;;;;;;;;;;;9880:810;10019:9;10014:670;10038:6;:13;10034:1;:17;10014:670;;;10073:14;10093:40;10104:6;10111:1;10104:9;;;;;;;;:::i;:::-;;;;;;;:14;;;10120:6;10127:1;10120:9;;;;;;;;:::i;:::-;;;;;;;:12;;;10093:10;:40::i;:::-;-1:-1:-1;10072:61:3;-1:-1:-1;10147:17:3;10167:7;10175:5;:1;10179;10175:5;:::i;:::-;10167:14;;;;;;;;:::i;:::-;;;;;;;10147:34;;10196:18;10216;10256:6;-1:-1:-1;;;;;10238:24:3;:6;10245:1;10238:9;;;;;;;;:::i;:::-;;;;;;;:14;;;-1:-1:-1;;;;;10238:24:3;;:108;;10324:9;10343:1;10238:108;;;10290:1;10294:9;10238:108;10195:151;;;;10360:10;10393:1;10377:6;:13;:17;;;;:::i;:::-;10373:1;:21;:107;;10477:3;10373:107;;;10413:45;10421:6;10428:5;:1;10432;10428:5;:::i;:::-;10421:13;;;;;;;;:::i;:::-;;;;;;;:18;;;10441:6;10448:1;10452;10448:5;;;;:::i;:::-;10441:13;;;;;;;;:::i;10413:45::-;10360:120;;10510:37;10518:6;10525:1;10518:9;;;;;;;;:::i;:::-;;;;;;;:14;;;10534:6;10541:1;10534:9;;;;;;;;:::i;10510:37::-;-1:-1:-1;;;;;10494:59:3;;10571:10;10599;10627:2;10657:1;10647:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10647:12:3;;10494:179;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10058:626;;;;;10053:3;;;;;:::i;:::-;;;;10014:670;;13087:1368;13221:9;13216:1233;13250:1;13236:4;:11;:15;;;;:::i;:::-;13232:1;:19;13216:1233;;;13273:13;13288:14;13307:4;13312:1;13307:7;;;;;;;;:::i;:::-;;;;;;;13316:4;13321:1;13325;13321:5;;;;:::i;:::-;13316:11;;;;;;;;:::i;:::-;;;;;;;13272:56;;;;13343:14;13363:25;13374:5;13381:6;13363:10;:25::i;:::-;13342:46;;;13402:20;13441:22;13449:5;13456:6;13441:7;:22::i;:::-;13402:62;;13478:19;13511:20;13620:16;13638;13660:4;-1:-1:-1;;;;;13660:16:3;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13619:59;;;;;13697:20;13732:6;-1:-1:-1;;;;;13723:15:3;:5;-1:-1:-1;;;;;13723:15:3;;:101;;13805:8;13815;13723:101;;;13762:8;13772;13723:101;-1:-1:-1;13876:38:3;;-1:-1:-1;;;13876:38:3;;-1:-1:-1;;;;;5720:32:9;;;13876:38:3;;;5702:51:9;13696:128:3;;-1:-1:-1;13696:128:3;;13876:23;;;;;5675:18:9;;13876:38:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:73;;;;:::i;:::-;13842:107;;13982:40;13995:11;14008:5;14015:6;13982:12;:40::i;:::-;13967:55;;13545:492;;;14051:18;14071;14102:6;-1:-1:-1;;;;;14093:15:3;:5;-1:-1:-1;;;;;14093:15:3;;:105;;14173:12;14195:1;14093:105;;;14136:1;14140:12;14093:105;14050:148;;;;14212:10;14258:1;14244:4;:11;:15;;;;:::i;:::-;14240:1;:19;14236:138;;;14284:28;14292:6;14300:4;14305:5;:1;14309;14305:5;:::i;:::-;14300:11;;;;;;;;:::i;:::-;;;;;;;14284:7;:28::i;:::-;14279:33;;14236:138;;;-1:-1:-1;14356:3:3;14236:138;14425:12;;;14435:1;14425:12;;;;;;;;;-1:-1:-1;;;14387:51:3;;;-1:-1:-1;;;;;14387:9:3;;;;;:51;;14397:10;;14409;;14421:2;;14387:51;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13258:1191;;;;;;;;;13253:3;;;;;:::i;:::-;;;;13216:1233;;2433:187:0;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:0;;;-1:-1:-1;;;;;;2541:17:0;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;5317:656:3:-;5433:12;5458:14;5474;5492:26;5503:6;5511;5492:10;:26::i;:::-;5457:61;;;;5728:7;5792:6;5800;5808;5775:40;;;;;;;;;;:::i;16788:1821::-;17024:15;17041;17089:10;17072:14;:27;:58;;;;17120:10;17103:14;:27;17072:58;17068:98;;;17151:15;;-1:-1:-1;;;17151:15:3;;;;;;;;;;;17068:98;17243:105;;-1:-1:-1;;;17243:105:3;;-1:-1:-1;;;;;18048:15:9;;;17243:105:3;;;18030:34:9;18100:15;;;18080:18;;;18073:43;18159:14;;18152:22;18132:18;;;18125:50;17227:13:3;;17262:7;17243:35;;;;;;17965:18:9;;17243:105:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17227:121;-1:-1:-1;;;;;;17362:19:3;;17358:182;;17405:124;;-1:-1:-1;;;17405:124:3;;-1:-1:-1;;;;;18048:15:9;;;17405:124:3;;;18030:34:9;18100:15;;;18080:18;;;18073:43;18159:14;;18152:22;18132:18;;;18125:50;17424:7:3;17405:38;;;;17965:18:9;;17405:124:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17397:132;;17358:182;17550:16;17568;17588:27;17600:6;17608;17588:11;:27::i;:::-;17549:66;;;;17629:8;17641:1;17629:13;:30;;;;-1:-1:-1;17646:13:3;;17629:30;17625:978;;;17697:14;;-1:-1:-1;17713:14:3;;-1:-1:-1;17625:978:3;;;17759:22;17784:112;17816:14;17848:8;17874;17784:14;:112::i;:::-;17759:137;;17932:14;17914;:32;17910:683;;17987:10;17970:14;:27;17966:102;;;18028:21;;-1:-1:-1;;;18028:21:3;;;;;;;;;;;17966:102;18107:14;;-1:-1:-1;18123:14:3;-1:-1:-1;18123:14:3;17910:683;;;18177:22;18202:128;18238:14;18274:8;18304;18202:14;:128::i;:::-;18177:153;;18373:14;18355;:32;;18348:40;;;;:::i;:::-;18427:10;18410:14;:27;18406:102;;;18468:21;;-1:-1:-1;;;18468:21:3;;;;;;;;;;;18406:102;18547:14;-1:-1:-1;18563:14:3;;-1:-1:-1;17910:683:3;17745:858;17625:978;17058:1551;;;16788:1821;;;;;;;;;;:::o;8927:336::-;9057:15;9099:1;9088:7;:12;9084:45;;9109:20;;-1:-1:-1;;;9109:20:3;;;;;;;;;;;9084:45;9143:13;;;:30;;-1:-1:-1;9160:13:3;;9143:30;9139:66;;;9182:23;;-1:-1:-1;;;9182:23:3;;;;;;;;;;;9139:66;9248:8;9226:18;9236:8;9226:7;:18;:::i;:::-;9225:31;;;;:::i;:::-;9215:41;8927:336;-1:-1:-1;;;;8927:336:3:o;14:127:9:-;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:9;;211:42;;201:70;;267:1;264;257:12;282:663;386:6;394;402;410;418;426;479:3;467:9;458:7;454:23;450:33;447:53;;;496:1;493;486:12;447:53;535:9;522:23;554:31;579:5;554:31;:::i;:::-;604:5;-1:-1:-1;656:2:9;641:18;;628:32;;-1:-1:-1;707:2:9;692:18;;679:32;;-1:-1:-1;758:2:9;743:18;;730:32;;-1:-1:-1;814:3:9;799:19;;786:33;828;786;828;:::i;:::-;880:7;870:17;;;934:3;923:9;919:19;906:33;896:43;;282:663;;;;;;;;:::o;1203:118::-;1289:5;1282:13;1275:21;1268:5;1265:32;1255:60;;1311:1;1308;1301:12;1326:241;1382:6;1435:2;1423:9;1414:7;1410:23;1406:32;1403:52;;;1451:1;1448;1441:12;1403:52;1490:9;1477:23;1509:28;1531:5;1509:28;:::i;:::-;1556:5;1326:241;-1:-1:-1;;;1326:241:9:o;1572:367::-;1635:8;1645:6;1699:3;1692:4;1684:6;1680:17;1676:27;1666:55;;1717:1;1714;1707:12;1666:55;-1:-1:-1;1740:20:9;;1783:18;1772:30;;1769:50;;;1815:1;1812;1805:12;1769:50;1852:4;1844:6;1840:17;1828:29;;1912:3;1905:4;1895:6;1892:1;1888:14;1880:6;1876:27;1872:38;1869:47;1866:67;;;1929:1;1926;1919:12;1944:778;2066:6;2074;2082;2090;2098;2106;2159:3;2147:9;2138:7;2134:23;2130:33;2127:53;;;2176:1;2173;2166:12;2127:53;2212:9;2199:23;2189:33;;2269:2;2258:9;2254:18;2241:32;2231:42;;2324:2;2313:9;2309:18;2296:32;2351:18;2343:6;2340:30;2337:50;;;2383:1;2380;2373:12;2337:50;2422:70;2484:7;2475:6;2464:9;2460:22;2422:70;:::i;:::-;2511:8;;-1:-1:-1;2396:96:9;-1:-1:-1;;2596:2:9;2581:18;;2568:32;2609:31;2568:32;2609:31;:::i;:::-;2659:5;2649:15;;;2711:3;2700:9;2696:19;2683:33;2673:43;;1944:778;;;;;;;;:::o;2727:632::-;2898:2;2950:21;;;3020:13;;2923:18;;;3042:22;;;2869:4;;2898:2;3121:15;;;;3095:2;3080:18;;;2869:4;3164:169;3178:6;3175:1;3172:13;3164:169;;;3239:13;;3227:26;;3308:15;;;;3273:12;;;;3200:1;3193:9;3164:169;;;-1:-1:-1;3350:3:9;;2727:632;-1:-1:-1;;;;;;2727:632:9:o;3556:382::-;3621:6;3629;3682:2;3670:9;3661:7;3657:23;3653:32;3650:52;;;3698:1;3695;3688:12;3650:52;3737:9;3724:23;3756:31;3781:5;3756:31;:::i;:::-;3806:5;-1:-1:-1;3863:2:9;3848:18;;3835:32;3876:30;3835:32;3876:30;:::i;:::-;3925:7;3915:17;;;3556:382;;;;;:::o;3943:388::-;4011:6;4019;4072:2;4060:9;4051:7;4047:23;4043:32;4040:52;;;4088:1;4085;4078:12;4040:52;4127:9;4114:23;4146:31;4171:5;4146:31;:::i;:::-;4196:5;-1:-1:-1;4253:2:9;4238:18;;4225:32;4266:33;4225:32;4266:33;:::i;4645:456::-;4722:6;4730;4738;4791:2;4779:9;4770:7;4766:23;4762:32;4759:52;;;4807:1;4804;4797:12;4759:52;4843:9;4830:23;4820:33;;4903:2;4892:9;4888:18;4875:32;4916:31;4941:5;4916:31;:::i;:::-;4966:5;-1:-1:-1;5023:2:9;5008:18;;4995:32;5036:33;4995:32;5036:33;:::i;:::-;5088:7;5078:17;;;4645:456;;;;;:::o;5288:247::-;5347:6;5400:2;5388:9;5379:7;5375:23;5371:32;5368:52;;;5416:1;5413;5406:12;5368:52;5455:9;5442:23;5474:31;5499:5;5474:31;:::i;5764:709::-;5877:6;5885;5893;5901;5909;5962:3;5950:9;5941:7;5937:23;5933:33;5930:53;;;5979:1;5976;5969:12;5930:53;6015:9;6002:23;5992:33;;6076:2;6065:9;6061:18;6048:32;6103:18;6095:6;6092:30;6089:50;;;6135:1;6132;6125:12;6089:50;6174:70;6236:7;6227:6;6216:9;6212:22;6174:70;:::i;:::-;6263:8;;-1:-1:-1;6148:96:9;-1:-1:-1;;6348:2:9;6333:18;;6320:32;6361:31;6320:32;6361:31;:::i;:::-;5764:709;;;;-1:-1:-1;5764:709:9;;6463:2;6448:18;6435:32;;5764:709;-1:-1:-1;;5764:709:9:o;6686:127::-;6747:10;6742:3;6738:20;6735:1;6728:31;6778:4;6775:1;6768:15;6802:4;6799:1;6792:15;6818:253;6890:2;6884:9;6932:4;6920:17;;6967:18;6952:34;;6988:22;;;6949:62;6946:88;;;7014:18;;:::i;:::-;7050:2;7043:22;6818:253;:::o;7076:275::-;7147:2;7141:9;7212:2;7193:13;;-1:-1:-1;;7189:27:9;7177:40;;7247:18;7232:34;;7268:22;;;7229:62;7226:88;;;7294:18;;:::i;:::-;7330:2;7323:22;7076:275;;-1:-1:-1;7076:275:9:o;7356:1644::-;7471:6;7479;7510:2;7553;7541:9;7532:7;7528:23;7524:32;7521:52;;;7569:1;7566;7559:12;7521:52;7605:9;7592:23;7582:33;;7634:2;7687;7676:9;7672:18;7659:32;7710:18;7751:2;7743:6;7740:14;7737:34;;;7767:1;7764;7757:12;7737:34;7805:6;7794:9;7790:22;7780:32;;7850:7;7843:4;7839:2;7835:13;7831:27;7821:55;;7872:1;7869;7862:12;7821:55;7908:2;7895:16;7930:2;7926;7923:10;7920:36;;;7936:18;;:::i;:::-;7976:36;8008:2;8003;8000:1;7996:10;7992:19;7976:36;:::i;:::-;8046:15;;;8077:12;;;;-1:-1:-1;8108:4:9;8147:11;;;8139:20;;8135:29;;;8176:19;;;8173:39;;;8208:1;8205;8198:12;8173:39;8232:11;;;;8252:718;8268:6;8263:3;8260:15;8252:718;;;8348:2;8342:3;8333:7;8329:17;8325:26;8322:116;;;8392:1;8421:2;8417;8410:14;8322:116;8464:22;;:::i;:::-;8527:3;8514:17;8544:33;8569:7;8544:33;:::i;:::-;8590:22;;8653:12;;;8640:26;8679:33;8640:26;8679:33;:::i;:::-;8732:14;;;8725:31;8797:12;;;8784:26;8823:30;8784:26;8823:30;:::i;:::-;8873:14;;;8866:31;8910:18;;8285:12;;;;8948;;;;8252:718;;;8256:3;8989:5;8979:15;;;;;;;;7356:1644;;;;;:::o;9005:770::-;9124:6;9132;9140;9148;9201:2;9189:9;9180:7;9176:23;9172:32;9169:52;;;9217:1;9214;9207:12;9169:52;9257:9;9244:23;9286:18;9327:2;9319:6;9316:14;9313:34;;;9343:1;9340;9333:12;9313:34;9382:70;9444:7;9435:6;9424:9;9420:22;9382:70;:::i;:::-;9471:8;;-1:-1:-1;9356:96:9;-1:-1:-1;9559:2:9;9544:18;;9531:32;;-1:-1:-1;9575:16:9;;;9572:36;;;9604:1;9601;9594:12;9572:36;;9643:72;9707:7;9696:8;9685:9;9681:24;9643:72;:::i;:::-;9005:770;;;;-1:-1:-1;9734:8:9;-1:-1:-1;;;;9005:770:9:o;9780:805::-;9893:6;9901;9909;9917;9925;9933;9941;9994:3;9982:9;9973:7;9969:23;9965:33;9962:53;;;10011:1;10008;10001:12;9962:53;10050:9;10037:23;10069:31;10094:5;10069:31;:::i;:::-;10119:5;-1:-1:-1;10176:2:9;10161:18;;10148:32;10189:33;10148:32;10189:33;:::i;:::-;10241:7;-1:-1:-1;10295:2:9;10280:18;;10267:32;;-1:-1:-1;10346:2:9;10331:18;;10318:32;;-1:-1:-1;10397:3:9;10382:19;;10369:33;;-1:-1:-1;10454:3:9;10439:19;;10426:33;10468;10426;10468;:::i;:::-;10520:7;10510:17;;;10574:3;10563:9;10559:19;10546:33;10536:43;;9780:805;;;;;;;;;;:::o;10590:505::-;10685:6;10693;10701;10754:2;10742:9;10733:7;10729:23;10725:32;10722:52;;;10770:1;10767;10760:12;10722:52;10806:9;10793:23;10783:33;;10867:2;10856:9;10852:18;10839:32;10894:18;10886:6;10883:30;10880:50;;;10926:1;10923;10916:12;10880:50;10965:70;11027:7;11018:6;11007:9;11003:22;10965:70;:::i;:::-;10590:505;;11054:8;;-1:-1:-1;10939:96:9;;-1:-1:-1;;;;10590:505:9:o;11100:874::-;11222:6;11230;11238;11246;11254;11262;11270;11278;11331:3;11319:9;11310:7;11306:23;11302:33;11299:53;;;11348:1;11345;11338:12;11299:53;11387:9;11374:23;11406:31;11431:5;11406:31;:::i;:::-;11456:5;-1:-1:-1;11513:2:9;11498:18;;11485:32;11526:33;11485:32;11526:33;:::i;:::-;11578:7;-1:-1:-1;11632:2:9;11617:18;;11604:32;;-1:-1:-1;11683:2:9;11668:18;;11655:32;;-1:-1:-1;11734:3:9;11719:19;;11706:33;;-1:-1:-1;11786:3:9;11771:19;;11758:33;;-1:-1:-1;11843:3:9;11828:19;;11815:33;11857;11815;11857;:::i;:::-;11909:7;11899:17;;;11963:3;11952:9;11948:19;11935:33;11925:43;;11100:874;;;;;;;;;;;:::o;12303:127::-;12364:10;12359:3;12355:20;12352:1;12345:31;12395:4;12392:1;12385:15;12419:4;12416:1;12409:15;12435:128;12502:9;;;12523:11;;;12520:37;;;12537:18;;:::i;12568:127::-;12629:10;12624:3;12620:20;12617:1;12610:31;12660:4;12657:1;12650:15;12684:4;12681:1;12674:15;12700:184;12770:6;12823:2;12811:9;12802:7;12798:23;12794:32;12791:52;;;12839:1;12836;12829:12;12791:52;-1:-1:-1;12862:16:9;;12700:184;-1:-1:-1;12700:184:9:o;12889:245::-;12956:6;13009:2;12997:9;12988:7;12984:23;12980:32;12977:52;;;13025:1;13022;13015:12;12977:52;13057:9;13051:16;13076:28;13098:5;13076:28;:::i;13697:418::-;-1:-1:-1;;13946:2:9;13942:15;;;13938:24;;13926:37;;13997:15;;;;13993:24;;;13988:2;13979:12;;13972:46;14064:14;14057:22;14052:3;14048:32;14043:2;14034:12;;14027:54;14106:2;14097:12;;13697:418::o;14628:125::-;14693:9;;;14714:10;;;14711:36;;;14727:18;;:::i;14758:135::-;14797:3;14818:17;;;14815:43;;14838:18;;:::i;:::-;-1:-1:-1;14885:1:9;14874:13;;14758:135::o;15278:245::-;15357:6;15365;15418:2;15406:9;15397:7;15393:23;15389:32;15386:52;;;15434:1;15431;15424:12;15386:52;-1:-1:-1;;15457:16:9;;15513:2;15498:18;;;15492:25;15457:16;;15492:25;;-1:-1:-1;15278:245:9:o;15528:306::-;15616:6;15624;15632;15685:2;15673:9;15664:7;15660:23;15656:32;15653:52;;;15701:1;15698;15691:12;15653:52;15730:9;15724:16;15714:26;;15780:2;15769:9;15765:18;15759:25;15749:35;;15824:2;15813:9;15809:18;15803:25;15793:35;;15528:306;;;;;:::o;16246:250::-;16331:1;16341:113;16355:6;16352:1;16349:13;16341:113;;;16431:11;;;16425:18;16412:11;;;16405:39;16377:2;16370:10;16341:113;;;-1:-1:-1;;16488:1:9;16470:16;;16463:27;16246:250::o;16501:287::-;16630:3;16668:6;16662:13;16684:66;16743:6;16738:3;16731:4;16723:6;16719:17;16684:66;:::i;:::-;16766:16;;;;;16501:287;-1:-1:-1;;16501:287:9:o;17154:637::-;17385:6;17374:9;17367:25;17428:6;17423:2;17412:9;17408:18;17401:34;17500:1;17496;17491:3;17487:11;17483:19;17475:6;17471:32;17466:2;17455:9;17451:18;17444:60;17540:3;17535:2;17524:9;17520:18;17513:31;17348:4;17573:6;17567:13;17617:6;17611:3;17600:9;17596:19;17589:35;17633:80;17706:6;17700:3;17689:9;17685:19;17680:2;17672:6;17668:15;17633:80;:::i;:::-;17774:2;17753:15;-1:-1:-1;;17749:29:9;17734:45;;;;17781:3;17730:55;;17154:637;-1:-1:-1;;;;;17154:637:9:o;18186:251::-;18256:6;18309:2;18297:9;18288:7;18284:23;18280:32;18277:52;;;18325:1;18322;18315:12;18277:52;18357:9;18351:16;18376:31;18401:5;18376:31;:::i;18442:168::-;18515:9;;;18546;;18563:15;;;18557:22;;18543:37;18533:71;;18584:18;;:::i;18615:217::-;18655:1;18681;18671:132;;18725:10;18720:3;18716:20;18713:1;18706:31;18760:4;18757:1;18750:15;18788:4;18785:1;18778:15;18671:132;-1:-1:-1;18817:9:9;;18615:217::o

Swarm Source

ipfs://2e016813496ad0b4c738836e30897bee7e4d7ed2b9b7a2e06b10b1433c2e92e7

Block Transaction Gas Used Reward
view all blocks sequenced

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
Loading...
Loading
[ 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.