FTM Price: $0.563269 (-2.98%)
Gas: 3 GWei
 

Multichain Info

1 address found via
Transaction Hash
Method
Block
From
To
Value
Add Liquidity834883922024-06-22 17:46:4123 hrs ago1719078401IN
0xa38cd271...56B34829D
0 FTM0.001515475.94444935
Remove Liquidity834532832024-06-22 6:38:1634 hrs ago1719038296IN
0xa38cd271...56B34829D
0 FTM0.001659136.83035018
Add Liquidity834473962024-06-22 4:39:1136 hrs ago1719031151IN
0xa38cd271...56B34829D
0 FTM0.001889557.9011911
Remove Liquidity833770962024-06-21 5:03:302 days ago1718946210IN
0xa38cd271...56B34829D
0 FTM0.0106249843.27298534
Add Liquidity FT...833743112024-06-21 4:21:492 days ago1718943709IN
0xa38cd271...56B34829D
12.558308 FTM0.0045373524.97913207
Add Liquidity833605892024-06-21 0:59:412 days ago1718931581IN
0xa38cd271...56B34829D
0 FTM0.003651421.32979532
Swap Exact Token...832703182024-06-20 3:18:503 days ago1718853530IN
0xa38cd271...56B34829D
0 FTM0.0082051537
Add Liquidity832701832024-06-20 3:17:083 days ago1718853428IN
0xa38cd271...56B34829D
0 FTM0.0061603224.92707346
Swap Exact Token...831870302024-06-19 6:41:544 days ago1718779314IN
0xa38cd271...56B34829D
0 FTM0.0065260129.2415729
Remove Liquidity827884942024-06-13 3:31:3910 days ago1718249499IN
0xa38cd271...56B34829D
0 FTM0.2142733907
Swap Exact Token...827731182024-06-12 21:28:0410 days ago1718227684IN
0xa38cd271...56B34829D
0 FTM0.0129932653
Remove Liquidity827223212024-06-12 2:37:2411 days ago1718159844IN
0xa38cd271...56B34829D
0 FTM0.0046511119.54502512
Swap Exact Token...826896172024-06-11 12:46:5812 days ago1718110018IN
0xa38cd271...56B34829D
0 FTM0.0078061941
Remove Liquidity826782882024-06-11 7:39:4712 days ago1718091587IN
0xa38cd271...56B34829D
0 FTM0.0076147143.95929512
Remove Liquidity825462752024-06-09 4:19:0914 days ago1717906749IN
0xa38cd271...56B34829D
0 FTM0.0046940518
Remove Liquidity825462052024-06-09 4:17:2014 days ago1717906640IN
0xa38cd271...56B34829D
0 FTM0.0048054718
Swap Exact Token...823762312024-06-06 13:07:4717 days ago1717679267IN
0xa38cd271...56B34829D
0 FTM0.0081107532
Swap Exact FTM F...823642612024-06-06 8:52:2717 days ago1717663947IN
0xa38cd271...56B34829D
1,500 FTM0.0064097826
Swap Exact FTM F...823619852024-06-06 8:06:5217 days ago1717661212IN
0xa38cd271...56B34829D
59 FTM0.0066131525
Remove Liquidity822880712024-06-05 6:48:2118 days ago1717570101IN
0xa38cd271...56B34829D
0 FTM0.0033010214.64609834
Add Liquidity822847452024-06-05 5:41:3118 days ago1717566091IN
0xa38cd271...56B34829D
0 FTM0.0023083513.46479275
Swap Exact Token...822839512024-06-05 5:23:0318 days ago1717564983IN
0xa38cd271...56B34829D
0 FTM0.0022826113.46891521
Swap Exact Token...821854202024-06-03 19:09:1519 days ago1717441755IN
0xa38cd271...56B34829D
0 FTM0.0036091821
Remove Liquidity821853282024-06-03 19:07:3119 days ago1717441651IN
0xa38cd271...56B34829D
0 FTM0.0058916921
Remove Liquidity820766692024-06-02 5:08:4221 days ago1717304922IN
0xa38cd271...56B34829D
0 FTM0.0111571220
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To Value
833743112024-06-21 4:21:492 days ago1718943709
0xa38cd271...56B34829D
0.0000003 FTM
833743112024-06-21 4:21:492 days ago1718943709
0xa38cd271...56B34829D
12.55830769 FTM
827731182024-06-12 21:28:0410 days ago1718227684
0xa38cd271...56B34829D
88.84198758 FTM
827731182024-06-12 21:28:0410 days ago1718227684
0xa38cd271...56B34829D
88.84198758 FTM
823762312024-06-06 13:07:4717 days ago1717679267
0xa38cd271...56B34829D
8.76383126 FTM
823762312024-06-06 13:07:4717 days ago1717679267
0xa38cd271...56B34829D
8.76383126 FTM
823642612024-06-06 8:52:2717 days ago1717663947
0xa38cd271...56B34829D
1,500 FTM
823619852024-06-06 8:06:5217 days ago1717661212
0xa38cd271...56B34829D
59 FTM
821854202024-06-03 19:09:1519 days ago1717441755
0xa38cd271...56B34829D
8.59969027 FTM
821854202024-06-03 19:09:1519 days ago1717441755
0xa38cd271...56B34829D
8.59969027 FTM
820763572024-06-02 5:03:1121 days ago1717304591
0xa38cd271...56B34829D
8 FTM
819705712024-05-31 15:01:3023 days ago1717167690
0xa38cd271...56B34829D
5.11780252 FTM
819705712024-05-31 15:01:3023 days ago1717167690
0xa38cd271...56B34829D
5.11780252 FTM
819436602024-05-31 6:04:3723 days ago1717135477
0xa38cd271...56B34829D
143.93750112 FTM
819436602024-05-31 6:04:3723 days ago1717135477
0xa38cd271...56B34829D
143.93750112 FTM
816064552024-05-26 6:54:3228 days ago1716706472
0xa38cd271...56B34829D
6 FTM
815099222024-05-24 13:34:3330 days ago1716557673
0xa38cd271...56B34829D
40 FTM
808216202024-05-12 17:47:2541 days ago1715536045
0xa38cd271...56B34829D
3.35608358 FTM
808216202024-05-12 17:47:2541 days ago1715536045
0xa38cd271...56B34829D
3.35608358 FTM
808215192024-05-12 17:45:0741 days ago1715535907
0xa38cd271...56B34829D
3.36107176 FTM
808215192024-05-12 17:45:0741 days ago1715535907
0xa38cd271...56B34829D
3.36107176 FTM
808214182024-05-12 17:42:4441 days ago1715535764
0xa38cd271...56B34829D
3.35933361 FTM
808214182024-05-12 17:42:4441 days ago1715535764
0xa38cd271...56B34829D
3.35933361 FTM
808213062024-05-12 17:40:2741 days ago1715535627
0xa38cd271...56B34829D
3.37571224 FTM
808213062024-05-12 17:40:2741 days ago1715535627
0xa38cd271...56B34829D
3.37571224 FTM
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BaseV1Router01

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU LGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at ftmscan.com on 2022-02-10
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.11;

interface IBaseV1Factory {
    function allPairsLength() external view returns (uint);
    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 pair);
}

interface IBaseV1Pair {
    function transferFrom(address src, address dst, uint amount) external returns (bool);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function burn(address to) external returns (uint amount0, uint amount1);
    function mint(address to) external returns (uint liquidity);
    function getReserves() external view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast);
    function getAmountOut(uint, address) external view returns (uint);
}

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

library Math {
    function min(uint a, uint b) internal pure returns (uint) {
        return a < b ? a : b;
    }
    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

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

contract BaseV1Router01 {

    struct route {
        address from;
        address to;
        bool stable;
    }

    address public immutable factory;
    IWFTM public immutable wftm;
    uint internal constant MINIMUM_LIQUIDITY = 10**3;
    bytes32 immutable pairCodeHash;

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

    constructor(address _factory, address _wftm) {
        factory = _factory;
        pairCodeHash = IBaseV1Factory(_factory).pairCodeHash();
        wftm = IWFTM(_wftm);
    }

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

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

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

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

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

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

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(uint amountIn, route[] memory routes) public view returns (uint[] memory amounts) {
        require(routes.length >= 1, 'BaseV1Router: INVALID_PATH');
        amounts = new uint[](routes.length+1);
        amounts[0] = amountIn;
        for (uint i = 0; i < routes.length; i++) {
            address pair = pairFor(routes[i].from, routes[i].to, routes[i].stable);
            if (IBaseV1Factory(factory).isPair(pair)) {
                amounts[i+1] = IBaseV1Pair(pair).getAmountOut(amounts[i], routes[i].from);
            }
        }
    }

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

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

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

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

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

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

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

    }

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, stable, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = pairFor(tokenA, tokenB, stable);
        _safeTransferFrom(tokenA, msg.sender, pair, amountA);
        _safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IBaseV1Pair(pair).mint(to);
    }

    function addLiquidityFTM(
        address token,
        bool stable,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountFTMMin,
        address to,
        uint deadline
    ) external payable ensure(deadline) returns (uint amountToken, uint amountFTM, uint liquidity) {
        (amountToken, amountFTM) = _addLiquidity(
            token,
            address(wftm),
            stable,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountFTMMin
        );
        address pair = pairFor(token, address(wftm), stable);
        _safeTransferFrom(token, msg.sender, pair, amountToken);
        wftm.deposit{value: amountFTM}();
        assert(wftm.transfer(pair, amountFTM));
        liquidity = IBaseV1Pair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountFTM) _safeTransferFTM(msg.sender, msg.value - amountFTM);
    }

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

    function removeLiquidityFTM(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountFTMMin,
        address to,
        uint deadline
    ) public ensure(deadline) returns (uint amountToken, uint amountFTM) {
        (amountToken, amountFTM) = removeLiquidity(
            token,
            address(wftm),
            stable,
            liquidity,
            amountTokenMin,
            amountFTMMin,
            address(this),
            deadline
        );
        _safeTransfer(token, to, amountToken);
        wftm.withdraw(amountFTM);
        _safeTransferFTM(to, amountFTM);
    }

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

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

    function removeLiquidityFTMWithPermit(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountFTMMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountFTM) {
        address pair = pairFor(token, address(wftm), stable);
        uint value = approveMax ? type(uint).max : liquidity;
        IBaseV1Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountFTM) = removeLiquidityFTM(token, stable, liquidity, amountTokenMin, amountFTMMin, to, deadline);
    }

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

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

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

    function swapExactFTMForTokens(uint amountOutMin, route[] calldata routes, address to, uint deadline)
    external
    payable
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(routes[0].from == address(wftm), 'BaseV1Router: INVALID_PATH');
        amounts = getAmountsOut(msg.value, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
        wftm.deposit{value: amounts[0]}();
        assert(wftm.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]));
        _swap(amounts, routes, to);
    }

    function swapExactTokensForFTM(uint amountIn, uint amountOutMin, route[] calldata routes, address to, uint deadline)
    external
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(routes[routes.length - 1].to == address(wftm), 'BaseV1Router: INVALID_PATH');
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, address(this));
        wftm.withdraw(amounts[amounts.length - 1]);
        _safeTransferFTM(to, amounts[amounts.length - 1]);
    }

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

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

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

    function _safeTransferFrom(address token, address from, address to, uint256 value) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) =
        token.call(abi.encodeWithSelector(erc20.transferFrom.selector, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_wftm","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct BaseV1Router01.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"UNSAFE_swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountFTMMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityFTM","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountFTM","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct BaseV1Router01.route[]","name":"routes","type":"tuple[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"}],"name":"quoteAddLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"quoteRemoveLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountFTMMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityFTM","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountFTM","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountFTMMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityFTMWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountFTM","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct BaseV1Router01.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactFTMForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct BaseV1Router01.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForFTM","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct BaseV1Router01.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"tokenFrom","type":"address"},{"internalType":"address","name":"tokenTo","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSimple","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wftm","outputs":[{"internalType":"contract IWFTM","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040523480156200001157600080fd5b5060405162003a4338038062003a438339810160408190526200003491620000d8565b6001600160a01b038216608081905260408051631355724960e31b81529051639aab9248916004808201926020929091908290030181865afa1580156200007f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000a5919062000110565b60c0526001600160a01b031660a052506200012a565b80516001600160a01b0381168114620000d357600080fd5b919050565b60008060408385031215620000ec57600080fd5b620000f783620000bb565b91506200010760208401620000bb565b90509250929050565b6000602082840312156200012357600080fd5b5051919050565b60805160a05160c05161384f620001f46000396000610a7501526000818161013e0152818161049d01528181610c1b01528181610c5101528181610c8601528181610d30015281816118f901528181611acc01528181611be701528181611c3701528181611ccf01528181611e5701528181611f6a015261200a0152600081816103a60152818161089301528181610a3a01528181610f590152818161106d015281816114a50152818161161901528181611dbf0152818161263701526126d8015261384f6000f3fe60806040526004361061012e5760003560e01c80639881fcb4116100ab578063cc1d17731161006f578063cc1d1773146103e8578063d28254b814610408578063e5e31b1314610428578063e8ef468114610458578063f41766d81461046b578063f4f45b461461048b57600080fd5b80639881fcb41461033457806398a0fb3c14610354578063a32b1fcd14610374578063c45a015514610394578063c6b9577e146103c857600080fd5b8063578caf32116100f2578063578caf32146102715780635a47ddc31461029f5780635e1e6325146102bf5780635e60dab5146102f45780637301e3c81461031457600080fd5b80630dede6c41461017257806313dcfc59146101ac5780634386e63c146101d95780634c1ee03e146101f9578063544caa561461023157600080fd5b3661016d57336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461016b5761016b612b43565b005b600080fd5b34801561017e57600080fd5b5061019261018d366004612b8a565b6104bf565b604080519283526020830191909152015b60405180910390f35b3480156101b857600080fd5b506101cc6101c7366004612c0f565b610679565b6040516101a39190612c8a565b3480156101e557600080fd5b506101926101f4366004612cce565b61088c565b34801561020557600080fd5b50610219610214366004612d1f565b6109f3565b6040516001600160a01b0390911681526020016101a3565b34801561023d57600080fd5b5061025161024c366004612d6a565b610afb565b604080516001600160a01b039384168152929091166020830152016101a3565b61028461027f366004612da3565b610bef565b604080519384526020840192909252908201526060016101a3565b3480156102ab57600080fd5b506102846102ba366004612dfe565b610e41565b3480156102cb57600080fd5b506102df6102da366004612e8d565b610f21565b604080519283529015156020830152016101a3565b34801561030057600080fd5b5061019261030f366004612d1f565b611175565b34801561032057600080fd5b506101cc61032f366004612f74565b61123f565b34801561034057600080fd5b506101cc61034f3660046130c7565b61138f565b34801561036057600080fd5b5061028461036f36600461316d565b611611565b34801561038057600080fd5b5061019261038f3660046131d9565b611811565b3480156103a057600080fd5b506102197f000000000000000000000000000000000000000000000000000000000000000081565b3480156103d457600080fd5b506101cc6103e3366004613295565b6118cc565b3480156103f457600080fd5b50610192610403366004612da3565b611bbd565b34801561041457600080fd5b50610192610423366004613308565b611cc4565b34801561043457600080fd5b506104486104433660046133b2565b611d9d565b60405190151581526020016101a3565b6101cc6104663660046133cf565b611e32565b34801561047757600080fd5b506101cc610486366004613295565b61218e565b34801561049757600080fd5b506102197f000000000000000000000000000000000000000000000000000000000000000081565b60008082428110156104ec5760405162461bcd60e51b81526004016104e390613425565b60405180910390fd5b60006104f98c8c8c6109f3565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af115801561054f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105739190613454565b61057c57600080fd5b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af11580156105c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ec9190613471565b9150915060006105fc8f8f610afb565b509050806001600160a01b03168f6001600160a01b03161461061f578183610622565b82825b90975095508a8710156106475760405162461bcd60e51b81526004016104e390613495565b898610156106675760405162461bcd60e51b81526004016104e3906134d8565b50505050509850989650505050505050565b6060814281101561069c5760405162461bcd60e51b81526004016104e390613425565b604080516001808252818301909252600091816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816106b357905050905087816000815181106106f6576106f661351b565b6020026020010151600001906001600160a01b031690816001600160a01b031681525050868160008151811061072e5761072e61351b565b6020026020010151602001906001600160a01b031690816001600160a01b03168152505085816000815181106107665761076661351b565b60209081029190910101519015156040909101526107848a8261138f565b92508883600185516107969190613547565b815181106107a6576107a661351b565b602002602001015110156107cc5760405162461bcd60e51b81526004016104e39061355e565b610874816000815181106107e2576107e261351b565b60200260200101516000015133610854846000815181106108055761080561351b565b602002602001015160000151856000815181106108245761082461351b565b602002602001015160200151866000815181106108435761084361351b565b6020026020010151604001516109f3565b866000815181106108675761086761351b565b60200260200101516122b3565b61087f8382876123ab565b5050979650505050505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308888886040518463ffffffff1660e01b81526004016108e1939291906135a6565b602060405180830381865afa1580156108fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092291906135ca565b90506001600160a01b03811661093f5760008092509250506109ea565b60008061094d898989611175565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b591906135e7565b9050806109c28489613600565b6109cc919061361f565b9550806109d98389613600565b6109e3919061361f565b9450505050505b94509492505050565b6000806000610a028686610afb565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015286151560f81b604882015291935091507f000000000000000000000000000000000000000000000000000000000000000090604901604051602081830303815290604052805190602001207f0000000000000000000000000000000000000000000000000000000000000000604051602001610ad9939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b600080826001600160a01b0316846001600160a01b03161415610b6a5760405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a204944454e544943414c5f41444452455353456044820152605360f81b60648201526084016104e3565b826001600160a01b0316846001600160a01b031610610b8a578284610b8d565b83835b90925090506001600160a01b038216610be85760405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a205a45524f5f4144445245535300000000000060448201526064016104e3565b9250929050565b60008060008342811015610c155760405162461bcd60e51b81526004016104e390613425565b610c448b7f00000000000000000000000000000000000000000000000000000000000000008c8c348d8d612600565b90945092506000610c768c7f00000000000000000000000000000000000000000000000000000000000000008d6109f3565b9050610c848c3383886122b3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b815260040160206040518083038185885af1158015610ce4573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d0991906135e7565b5060405163a9059cbb60e01b81526001600160a01b038281166004830152602482018690527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015610d79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9d9190613454565b610da957610da9612b43565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015610df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1591906135e7565b925083341115610e3257610e3233610e2d8634613547565b61281e565b50509750975097945050505050565b60008060008342811015610e675760405162461bcd60e51b81526004016104e390613425565b610e768d8d8d8d8d8d8d612600565b90945092506000610e888e8e8e6109f3565b9050610e968e3383886122b3565b610ea28d3383876122b3565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015610eea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0e91906135e7565b9250505099509950999650505050505050565b6000806000610f32858560016109f3565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa158015610fa2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc69190613454565b1561103f576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa158015611018573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103c91906135e7565b91505b61104b878760006109f3565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156110b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110da9190613454565b15611153576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa15801561112c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115091906135e7565b90505b80821161116257806000611166565b8160015b94509450505050935093915050565b60008060006111848686610afb565b5090506000806111958888886109f3565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156111d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f69190613658565b506001600160701b031691506001600160701b03169150826001600160a01b0316886001600160a01b03161461122d578082611230565b81815b90999098509650505050505050565b606081428110156112625760405162461bcd60e51b81526004016104e390613425565b611324868660008181106112785761127861351b565b61128e92602060609092020190810191506133b2565b33611311898960008181106112a5576112a561351b565b6112bb92602060609092020190810191506133b2565b8a8a60008181106112ce576112ce61351b565b90506060020160200160208101906112e691906133b2565b8b8b60008181106112f9576112f961351b565b9050606002016040016020810190610214919061369d565b8a6000815181106108675761086761351b565b611381878787808060200260200160405190810160405280939291908181526020016000905b8282101561137657611367606083028601368190038101906136ba565b8152602001906001019061134a565b5050505050866123ab565b8691505b5095945050505050565b60606001825110156113b35760405162461bcd60e51b81526004016104e3906136d6565b81516113c090600161370d565b67ffffffffffffffff8111156113d8576113d8612ec4565b604051908082528060200260200182016040528015611401578160200160208202803683370190505b50905082816000815181106114185761141861351b565b60200260200101818152505060005b825181101561160a5760006114838483815181106114475761144761351b565b6020026020010151600001518584815181106114655761146561351b565b6020026020010151602001518685815181106108435761084361351b565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156114ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115129190613454565b156115f757806001600160a01b031663f140a35a8484815181106115385761153861351b565b60200260200101518685815181106115525761155261351b565b6020026020010151600001516040518363ffffffff1660e01b815260040161158d9291909182526001600160a01b0316602082015260400190565b602060405180830381865afa1580156115aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ce91906135e7565b836115da84600161370d565b815181106115ea576115ea61351b565b6020026020010181815250505b508061160281613725565b915050611427565b5092915050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b8152600401611667939291906135a6565b602060405180830381865afa158015611684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a891906135ca565b9050600080806001600160a01b0384161561173257836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171f91906135e7565b905061172c8c8c8c611175565b90935091505b8215801561173e575081155b1561176f578896508795506103e861175e611759888a613600565b6128ec565b6117689190613547565b9450611802565b600061177c8a858561295c565b90508881116117c4578997509550856117bd84611799848b613600565b6117a3919061361f565b846117ae858b613600565b6117b8919061361f565b612a3c565b9550611800565b60006117d18a858761295c565b98508997508890506117fc856117e78584613600565b6117f1919061361f565b856117ae868c613600565b9650505b505b50505050955095509592505050565b60008060006118218f8f8f6109f3565b9050600087611830578c611834565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061186f903390309086908f908e908e908e90600401613740565b600060405180830381600087803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b50505050506118b28f8f8f8f8f8f8f8f6104bf565b8093508194505050509c509c9a5050505050505050505050565b606081428110156118ef5760405162461bcd60e51b81526004016104e390613425565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686611926600182613547565b8181106119355761193561351b565b905060600201602001602081019061194d91906133b2565b6001600160a01b0316146119735760405162461bcd60e51b81526004016104e3906136d6565b6119cf888787808060200260200160405190810160405280939291908181526020016000905b828210156119c5576119b6606083028601368190038101906136ba565b81526020019060010190611999565b505050505061138f565b91508682600184516119e19190613547565b815181106119f1576119f161351b565b60200260200101511015611a175760405162461bcd60e51b81526004016104e39061355e565b611a6d86866000818110611a2d57611a2d61351b565b611a4392602060609092020190810191506133b2565b33611a5a898960008181106112a5576112a561351b565b856000815181106108675761086761351b565b611aca828787808060200260200160405190810160405280939291908181526020016000905b82821015611abf57611ab0606083028601368190038101906136ba565b81526020019060010190611a93565b5050505050306123ab565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551611b089190613547565b81518110611b1857611b1861351b565b60200260200101516040518263ffffffff1660e01b8152600401611b3e91815260200190565b6020604051808303816000875af1158015611b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8191906135e7565b50611bb2848360018551611b959190613547565b81518110611ba557611ba561351b565b602002602001015161281e565b509695505050505050565b6000808242811015611be15760405162461bcd60e51b81526004016104e390613425565b611c118a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b6104bf565b9093509150611c218a8685612a54565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024016020604051808303816000875af1158015611c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cac91906135e7565b50611cb7858361281e565b5097509795505050505050565b6000806000611cf48e7f00000000000000000000000000000000000000000000000000000000000000008f6109f3565b9050600087611d03578c611d07565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611d42903390309086908f908e908e908e90600401613740565b600060405180830381600087803b158015611d5c57600080fd5b505af1158015611d70573d6000803e3d6000fd5b50505050611d838f8f8f8f8f8f8f611bbd565b809450819550505050509b509b9950505050505050505050565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa158015611e08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2c9190613454565b92915050565b60608142811015611e555760405162461bcd60e51b81526004016104e390613425565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611e9257611e9261351b565b611ea892602060609092020190810191506133b2565b6001600160a01b031614611ece5760405162461bcd60e51b81526004016104e3906136d6565b611f20348787808060200260200160405190810160405280939291908181526020016000905b828210156119c557611f11606083028601368190038101906136ba565b81526020019060010190611ef4565b9150868260018451611f329190613547565b81518110611f4257611f4261351b565b60200260200101511015611f685760405162461bcd60e51b81526004016104e39061355e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611faa57611faa61351b565b60200260200101516040518263ffffffff1660e01b815260040160206040518083038185885af1158015611fe2573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061200791906135e7565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6120a18888600081811061204d5761204d61351b565b61206392602060609092020190810191506133b2565b898960008181106120765761207661351b565b905060600201602001602081019061208e91906133b2565b8a8a60008181106112f9576112f961351b565b846000815181106120b4576120b461351b565b60200260200101516040518363ffffffff1660e01b81526004016120ed9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af115801561210c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121309190613454565b61213c5761213c612b43565b611385828787808060200260200160405190810160405280939291908181526020016000905b828210156113765761217f606083028601368190038101906136ba565b81526020019060010190612162565b606081428110156121b15760405162461bcd60e51b81526004016104e390613425565b612203888787808060200260200160405190810160405280939291908181526020016000905b828210156119c5576121f4606083028601368190038101906136ba565b815260200190600101906121d7565b91508682600184516122159190613547565b815181106122255761222561351b565b6020026020010151101561224b5760405162461bcd60e51b81526004016104e39061355e565b61226186866000818110611a2d57611a2d61351b565b611bb2828787808060200260200160405190810160405280939291908181526020016000905b82821015611376576122a4606083028601368190038101906136ba565b81526020019060010190612287565b6000846001600160a01b03163b116122ca57600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161232e91906137ad565b6000604051808303816000865af19150503d806000811461236b576040519150601f19603f3d011682016040523d82523d6000602084013e612370565b606091505b509150915081801561239a57508051158061239a57508080602001905181019061239a9190613454565b6123a357600080fd5b505050505050565b60005b82518110156125fa5760006123fd8483815181106123ce576123ce61351b565b6020026020010151600001518584815181106123ec576123ec61351b565b602002602001015160200151610afb565b50905060008561240e84600161370d565b8151811061241e5761241e61351b565b60200260200101519050600080836001600160a01b03168786815181106124475761244761351b565b6020026020010151600001516001600160a01b0316146124695782600061246d565b6000835b915091506000600188516124819190613547565b861061248d5786612500565b6125008861249c88600161370d565b815181106124ac576124ac61351b565b602002602001015160000151898860016124c6919061370d565b815181106124d6576124d661351b565b6020026020010151602001518a8960016124f0919061370d565b815181106108435761084361351b565b90506125538887815181106125175761251761351b565b6020026020010151600001518988815181106125355761253561351b565b6020026020010151602001518a89815181106108435761084361351b565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612590576020820181803683370190505b506040518563ffffffff1660e01b81526004016125b094939291906137c9565b600060405180830381600087803b1580156125ca57600080fd5b505af11580156125de573d6000803e3d6000fd5b50505050505050505080806125f290613725565b9150506123ae565b50505050565b6000808386101561261057600080fd5b8285101561261d57600080fd5b6040516306801cc360e41b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636801cc3090612670908d908d908d906004016135a6565b602060405180830381865afa15801561268d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b191906135ca565b90506001600160a01b038116612757576040516320b7f73960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906382dfdce490612711908d908d908d906004016135a6565b6020604051808303816000875af1158015612730573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275491906135ca565b90505b6000806127658c8c8c611175565b91509150816000148015612777575080155b156127875788945087935061280f565b60006127948a848461295c565b90508881116127c857868110156127bd5760405162461bcd60e51b81526004016104e3906134d8565b89955093508361280d565b60006127d58a848661295c565b90508a8111156127e7576127e7612b43565b888110156128075760405162461bcd60e51b81526004016104e390613495565b95508894505b505b50505097509795505050505050565b604080516000808252602082019092526001600160a01b03841690839060405161284891906137ad565b60006040518083038185875af1925050503d8060008114612885576040519150601f19603f3d011682016040523d82523d6000602084013e61288a565b606091505b50509050806128e75760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b60648201526084016104e3565b505050565b6000600382111561294d575080600061290660028361361f565b61291190600161370d565b90505b818110156129475790508060028161292c818661361f565b612936919061370d565b612940919061361f565b9050612914565b50919050565b8115612957575060015b919050565b60008084116129b75760405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a20494e53554646494349454e545f414d4f554e6044820152601560fa1b60648201526084016104e3565b6000831180156129c75750600082115b612a1f5760405162461bcd60e51b8152602060048201526024808201527f426173655631526f757465723a20494e53554646494349454e545f4c495155496044820152634449545960e01b60648201526084016104e3565b82612a2a8386613600565b612a34919061361f565b949350505050565b6000818310612a4b5781612a4d565b825b9392505050565b6000836001600160a01b03163b11612a6b57600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612ac791906137ad565b6000604051808303816000865af19150503d8060008114612b04576040519150601f19603f3d011682016040523d82523d6000602084013e612b09565b606091505b5091509150818015612b33575080511580612b33575080806020019051810190612b339190613454565b612b3c57600080fd5b5050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b0381168114612b6e57600080fd5b50565b803561295781612b59565b8015158114612b6e57600080fd5b600080600080600080600080610100898b031215612ba757600080fd5b8835612bb281612b59565b97506020890135612bc281612b59565b96506040890135612bd281612b7c565b9550606089013594506080890135935060a0890135925060c0890135612bf781612b59565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a031215612c2a57600080fd5b87359650602088013595506040880135612c4381612b59565b94506060880135612c5381612b59565b93506080880135612c6381612b7c565b925060a0880135612c7381612b59565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015612cc257835183529284019291840191600101612ca6565b50909695505050505050565b60008060008060808587031215612ce457600080fd5b8435612cef81612b59565b93506020850135612cff81612b59565b92506040850135612d0f81612b7c565b9396929550929360600135925050565b600080600060608486031215612d3457600080fd5b8335612d3f81612b59565b92506020840135612d4f81612b59565b91506040840135612d5f81612b7c565b809150509250925092565b60008060408385031215612d7d57600080fd5b8235612d8881612b59565b91506020830135612d9881612b59565b809150509250929050565b600080600080600080600060e0888a031215612dbe57600080fd5b8735612dc981612b59565b96506020880135612dd981612b7c565b955060408801359450606088013593506080880135925060a0880135612c7381612b59565b60008060008060008060008060006101208a8c031215612e1d57600080fd5b8935612e2881612b59565b985060208a0135612e3881612b59565b975060408a0135612e4881612b7c565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a0135612e7481612b59565b809250506101008a013590509295985092959850929598565b600080600060608486031215612ea257600080fd5b833592506020840135612eb481612b59565b91506040840135612d5f81612b59565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612f0357612f03612ec4565b604052919050565b600067ffffffffffffffff821115612f2557612f25612ec4565b5060051b60200190565b60008083601f840112612f4157600080fd5b50813567ffffffffffffffff811115612f5957600080fd5b602083019150836020606083028501011115610be857600080fd5b600080600080600060808688031215612f8c57600080fd5b853567ffffffffffffffff80821115612fa457600080fd5b818801915088601f830112612fb857600080fd5b81356020612fcd612fc883612f0b565b612eda565b82815260059290921b8401810191818101908c841115612fec57600080fd5b948201945b8386101561300a57853582529482019490820190612ff1565b9950508901359250508082111561302057600080fd5b5061302d88828901612f2f565b9095509350613040905060408701612b71565b949793965091946060013592915050565b60006060828403121561306357600080fd5b6040516060810181811067ffffffffffffffff8211171561308657613086612ec4565b604052905080823561309781612b59565b815260208301356130a781612b59565b602082015260408301356130ba81612b7c565b6040919091015292915050565b600080604083850312156130da57600080fd5b8235915060208084013567ffffffffffffffff8111156130f957600080fd5b8401601f8101861361310a57600080fd5b8035613118612fc882612f0b565b8181526060918202830184019184820191908984111561313757600080fd5b938501935b8385101561315d5761314e8a86613051565b8352938401939185019161313c565b5080955050505050509250929050565b600080600080600060a0868803121561318557600080fd5b853561319081612b59565b945060208601356131a081612b59565b935060408601356131b081612b7c565b94979396509394606081013594506080013592915050565b803560ff8116811461295757600080fd5b6000806000806000806000806000806000806101808d8f0312156131fc57600080fd5b8c3561320781612b59565b9b5060208d013561321781612b59565b9a5060408d013561322781612b7c565b995060608d0135985060808d0135975060a08d0135965060c08d013561324c81612b59565b955060e08d013594506101008d013561326481612b7c565b93506132736101208e016131c8565b92506101408d013591506101608d013590509295989b509295989b509295989b565b60008060008060008060a087890312156132ae57600080fd5b8635955060208701359450604087013567ffffffffffffffff8111156132d357600080fd5b6132df89828a01612f2f565b90955093505060608701356132f381612b59565b80925050608087013590509295509295509295565b60008060008060008060008060008060006101608c8e03121561332a57600080fd5b8b3561333581612b59565b9a5060208c013561334581612b7c565b995060408c0135985060608c0135975060808c0135965060a08c013561336a81612b59565b955060c08c0135945060e08c013561338181612b7c565b93506133906101008d016131c8565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000602082840312156133c457600080fd5b8135612a4d81612b59565b6000806000806000608086880312156133e757600080fd5b85359450602086013567ffffffffffffffff81111561340557600080fd5b61341188828901612f2f565b909550935050604086013561304081612b59565b60208082526015908201527410985cd9558c549bdd5d195c8e8811561412549151605a1b604082015260600190565b60006020828403121561346657600080fd5b8151612a4d81612b7c565b6000806040838503121561348457600080fd5b505080516020909101519092909150565b60208082526023908201527f426173655631526f757465723a20494e53554646494349454e545f415f414d4f60408201526215539560ea1b606082015260800190565b60208082526023908201527f426173655631526f757465723a20494e53554646494349454e545f425f414d4f60408201526215539560ea1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561355957613559613531565b500390565b60208082526028908201527f426173655631526f757465723a20494e53554646494349454e545f4f555450556040820152671517d05353d5539560c21b606082015260800190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000602082840312156135dc57600080fd5b8151612a4d81612b59565b6000602082840312156135f957600080fd5b5051919050565b600081600019048311821515161561361a5761361a613531565b500290565b60008261363c57634e487b7160e01b600052601260045260246000fd5b500490565b80516001600160701b038116811461295757600080fd5b60008060006060848603121561366d57600080fd5b61367684613641565b925061368460208501613641565b9150604084015163ffffffff81168114612d5f57600080fd5b6000602082840312156136af57600080fd5b8135612a4d81612b7c565b6000606082840312156136cc57600080fd5b612a4d8383613051565b6020808252601a908201527f426173655631526f757465723a20494e56414c49445f50415448000000000000604082015260600190565b6000821982111561372057613720613531565b500190565b600060001982141561373957613739613531565b5060010190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b60005b8381101561379c578181015183820152602001613784565b838111156125fa5750506000910152565b600082516137bf818460208701613781565b9190910192915050565b84815283602082015260018060a01b038316604082015260806060820152600082518060808401526138028160a0850160208701613781565b601f01601f19169190910160a0019594505050505056fea2646970667358221220e6efa68269e8b49fe415e3d43f111437355d5066d7adbf8137894a015eaa750f64736f6c634300080b00330000000000000000000000003faab499b519fdc5819e3d7ed0c26111904cbc2800000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

Deployed Bytecode

0x60806040526004361061012e5760003560e01c80639881fcb4116100ab578063cc1d17731161006f578063cc1d1773146103e8578063d28254b814610408578063e5e31b1314610428578063e8ef468114610458578063f41766d81461046b578063f4f45b461461048b57600080fd5b80639881fcb41461033457806398a0fb3c14610354578063a32b1fcd14610374578063c45a015514610394578063c6b9577e146103c857600080fd5b8063578caf32116100f2578063578caf32146102715780635a47ddc31461029f5780635e1e6325146102bf5780635e60dab5146102f45780637301e3c81461031457600080fd5b80630dede6c41461017257806313dcfc59146101ac5780634386e63c146101d95780634c1ee03e146101f9578063544caa561461023157600080fd5b3661016d57336001600160a01b037f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83161461016b5761016b612b43565b005b600080fd5b34801561017e57600080fd5b5061019261018d366004612b8a565b6104bf565b604080519283526020830191909152015b60405180910390f35b3480156101b857600080fd5b506101cc6101c7366004612c0f565b610679565b6040516101a39190612c8a565b3480156101e557600080fd5b506101926101f4366004612cce565b61088c565b34801561020557600080fd5b50610219610214366004612d1f565b6109f3565b6040516001600160a01b0390911681526020016101a3565b34801561023d57600080fd5b5061025161024c366004612d6a565b610afb565b604080516001600160a01b039384168152929091166020830152016101a3565b61028461027f366004612da3565b610bef565b604080519384526020840192909252908201526060016101a3565b3480156102ab57600080fd5b506102846102ba366004612dfe565b610e41565b3480156102cb57600080fd5b506102df6102da366004612e8d565b610f21565b604080519283529015156020830152016101a3565b34801561030057600080fd5b5061019261030f366004612d1f565b611175565b34801561032057600080fd5b506101cc61032f366004612f74565b61123f565b34801561034057600080fd5b506101cc61034f3660046130c7565b61138f565b34801561036057600080fd5b5061028461036f36600461316d565b611611565b34801561038057600080fd5b5061019261038f3660046131d9565b611811565b3480156103a057600080fd5b506102197f0000000000000000000000003faab499b519fdc5819e3d7ed0c26111904cbc2881565b3480156103d457600080fd5b506101cc6103e3366004613295565b6118cc565b3480156103f457600080fd5b50610192610403366004612da3565b611bbd565b34801561041457600080fd5b50610192610423366004613308565b611cc4565b34801561043457600080fd5b506104486104433660046133b2565b611d9d565b60405190151581526020016101a3565b6101cc6104663660046133cf565b611e32565b34801561047757600080fd5b506101cc610486366004613295565b61218e565b34801561049757600080fd5b506102197f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8381565b60008082428110156104ec5760405162461bcd60e51b81526004016104e390613425565b60405180910390fd5b60006104f98c8c8c6109f3565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af115801561054f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105739190613454565b61057c57600080fd5b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af11580156105c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ec9190613471565b9150915060006105fc8f8f610afb565b509050806001600160a01b03168f6001600160a01b03161461061f578183610622565b82825b90975095508a8710156106475760405162461bcd60e51b81526004016104e390613495565b898610156106675760405162461bcd60e51b81526004016104e3906134d8565b50505050509850989650505050505050565b6060814281101561069c5760405162461bcd60e51b81526004016104e390613425565b604080516001808252818301909252600091816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816106b357905050905087816000815181106106f6576106f661351b565b6020026020010151600001906001600160a01b031690816001600160a01b031681525050868160008151811061072e5761072e61351b565b6020026020010151602001906001600160a01b031690816001600160a01b03168152505085816000815181106107665761076661351b565b60209081029190910101519015156040909101526107848a8261138f565b92508883600185516107969190613547565b815181106107a6576107a661351b565b602002602001015110156107cc5760405162461bcd60e51b81526004016104e39061355e565b610874816000815181106107e2576107e261351b565b60200260200101516000015133610854846000815181106108055761080561351b565b602002602001015160000151856000815181106108245761082461351b565b602002602001015160200151866000815181106108435761084361351b565b6020026020010151604001516109f3565b866000815181106108675761086761351b565b60200260200101516122b3565b61087f8382876123ab565b5050979650505050505050565b60008060007f0000000000000000000000003faab499b519fdc5819e3d7ed0c26111904cbc286001600160a01b0316636801cc308888886040518463ffffffff1660e01b81526004016108e1939291906135a6565b602060405180830381865afa1580156108fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092291906135ca565b90506001600160a01b03811661093f5760008092509250506109ea565b60008061094d898989611175565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b591906135e7565b9050806109c28489613600565b6109cc919061361f565b9550806109d98389613600565b6109e3919061361f565b9450505050505b94509492505050565b6000806000610a028686610afb565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015286151560f81b604882015291935091507f0000000000000000000000003faab499b519fdc5819e3d7ed0c26111904cbc2890604901604051602081830303815290604052805190602001207f57ae84018c47ebdaf7ddb2d1216c8c36389d12481309af65428eb6d460f747a4604051602001610ad9939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b600080826001600160a01b0316846001600160a01b03161415610b6a5760405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a204944454e544943414c5f41444452455353456044820152605360f81b60648201526084016104e3565b826001600160a01b0316846001600160a01b031610610b8a578284610b8d565b83835b90925090506001600160a01b038216610be85760405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a205a45524f5f4144445245535300000000000060448201526064016104e3565b9250929050565b60008060008342811015610c155760405162461bcd60e51b81526004016104e390613425565b610c448b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c838c8c348d8d612600565b90945092506000610c768c7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c838d6109f3565b9050610c848c3383886122b3565b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031663d0e30db0856040518263ffffffff1660e01b815260040160206040518083038185885af1158015610ce4573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d0991906135e7565b5060405163a9059cbb60e01b81526001600160a01b038281166004830152602482018690527f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83169063a9059cbb906044016020604051808303816000875af1158015610d79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9d9190613454565b610da957610da9612b43565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015610df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1591906135e7565b925083341115610e3257610e3233610e2d8634613547565b61281e565b50509750975097945050505050565b60008060008342811015610e675760405162461bcd60e51b81526004016104e390613425565b610e768d8d8d8d8d8d8d612600565b90945092506000610e888e8e8e6109f3565b9050610e968e3383886122b3565b610ea28d3383876122b3565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015610eea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0e91906135e7565b9250505099509950999650505050505050565b6000806000610f32858560016109f3565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f0000000000000000000000003faab499b519fdc5819e3d7ed0c26111904cbc289091169063e5e31b1390602401602060405180830381865afa158015610fa2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc69190613454565b1561103f576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa158015611018573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103c91906135e7565b91505b61104b878760006109f3565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f0000000000000000000000003faab499b519fdc5819e3d7ed0c26111904cbc289091169063e5e31b1390602401602060405180830381865afa1580156110b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110da9190613454565b15611153576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa15801561112c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115091906135e7565b90505b80821161116257806000611166565b8160015b94509450505050935093915050565b60008060006111848686610afb565b5090506000806111958888886109f3565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156111d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f69190613658565b506001600160701b031691506001600160701b03169150826001600160a01b0316886001600160a01b03161461122d578082611230565b81815b90999098509650505050505050565b606081428110156112625760405162461bcd60e51b81526004016104e390613425565b611324868660008181106112785761127861351b565b61128e92602060609092020190810191506133b2565b33611311898960008181106112a5576112a561351b565b6112bb92602060609092020190810191506133b2565b8a8a60008181106112ce576112ce61351b565b90506060020160200160208101906112e691906133b2565b8b8b60008181106112f9576112f961351b565b9050606002016040016020810190610214919061369d565b8a6000815181106108675761086761351b565b611381878787808060200260200160405190810160405280939291908181526020016000905b8282101561137657611367606083028601368190038101906136ba565b8152602001906001019061134a565b5050505050866123ab565b8691505b5095945050505050565b60606001825110156113b35760405162461bcd60e51b81526004016104e3906136d6565b81516113c090600161370d565b67ffffffffffffffff8111156113d8576113d8612ec4565b604051908082528060200260200182016040528015611401578160200160208202803683370190505b50905082816000815181106114185761141861351b565b60200260200101818152505060005b825181101561160a5760006114838483815181106114475761144761351b565b6020026020010151600001518584815181106114655761146561351b565b6020026020010151602001518685815181106108435761084361351b565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f0000000000000000000000003faab499b519fdc5819e3d7ed0c26111904cbc289091169063e5e31b1390602401602060405180830381865afa1580156114ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115129190613454565b156115f757806001600160a01b031663f140a35a8484815181106115385761153861351b565b60200260200101518685815181106115525761155261351b565b6020026020010151600001516040518363ffffffff1660e01b815260040161158d9291909182526001600160a01b0316602082015260400190565b602060405180830381865afa1580156115aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ce91906135e7565b836115da84600161370d565b815181106115ea576115ea61351b565b6020026020010181815250505b508061160281613725565b915050611427565b5092915050565b6000806000807f0000000000000000000000003faab499b519fdc5819e3d7ed0c26111904cbc286001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b8152600401611667939291906135a6565b602060405180830381865afa158015611684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a891906135ca565b9050600080806001600160a01b0384161561173257836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171f91906135e7565b905061172c8c8c8c611175565b90935091505b8215801561173e575081155b1561176f578896508795506103e861175e611759888a613600565b6128ec565b6117689190613547565b9450611802565b600061177c8a858561295c565b90508881116117c4578997509550856117bd84611799848b613600565b6117a3919061361f565b846117ae858b613600565b6117b8919061361f565b612a3c565b9550611800565b60006117d18a858761295c565b98508997508890506117fc856117e78584613600565b6117f1919061361f565b856117ae868c613600565b9650505b505b50505050955095509592505050565b60008060006118218f8f8f6109f3565b9050600087611830578c611834565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061186f903390309086908f908e908e908e90600401613740565b600060405180830381600087803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b50505050506118b28f8f8f8f8f8f8f8f6104bf565b8093508194505050509c509c9a5050505050505050505050565b606081428110156118ef5760405162461bcd60e51b81526004016104e390613425565b6001600160a01b037f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83168686611926600182613547565b8181106119355761193561351b565b905060600201602001602081019061194d91906133b2565b6001600160a01b0316146119735760405162461bcd60e51b81526004016104e3906136d6565b6119cf888787808060200260200160405190810160405280939291908181526020016000905b828210156119c5576119b6606083028601368190038101906136ba565b81526020019060010190611999565b505050505061138f565b91508682600184516119e19190613547565b815181106119f1576119f161351b565b60200260200101511015611a175760405162461bcd60e51b81526004016104e39061355e565b611a6d86866000818110611a2d57611a2d61351b565b611a4392602060609092020190810191506133b2565b33611a5a898960008181106112a5576112a561351b565b856000815181106108675761086761351b565b611aca828787808060200260200160405190810160405280939291908181526020016000905b82821015611abf57611ab0606083028601368190038101906136ba565b81526020019060010190611a93565b5050505050306123ab565b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b0316632e1a7d4d8360018551611b089190613547565b81518110611b1857611b1861351b565b60200260200101516040518263ffffffff1660e01b8152600401611b3e91815260200190565b6020604051808303816000875af1158015611b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8191906135e7565b50611bb2848360018551611b959190613547565b81518110611ba557611ba561351b565b602002602001015161281e565b509695505050505050565b6000808242811015611be15760405162461bcd60e51b81526004016104e390613425565b611c118a7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c838b8b8b8b308b6104bf565b9093509150611c218a8685612a54565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031690632e1a7d4d906024016020604051808303816000875af1158015611c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cac91906135e7565b50611cb7858361281e565b5097509795505050505050565b6000806000611cf48e7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c838f6109f3565b9050600087611d03578c611d07565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611d42903390309086908f908e908e908e90600401613740565b600060405180830381600087803b158015611d5c57600080fd5b505af1158015611d70573d6000803e3d6000fd5b50505050611d838f8f8f8f8f8f8f611bbd565b809450819550505050509b509b9950505050505050505050565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f0000000000000000000000003faab499b519fdc5819e3d7ed0c26111904cbc289091169063e5e31b1390602401602060405180830381865afa158015611e08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2c9190613454565b92915050565b60608142811015611e555760405162461bcd60e51b81526004016104e390613425565b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031686866000818110611e9257611e9261351b565b611ea892602060609092020190810191506133b2565b6001600160a01b031614611ece5760405162461bcd60e51b81526004016104e3906136d6565b611f20348787808060200260200160405190810160405280939291908181526020016000905b828210156119c557611f11606083028601368190038101906136ba565b81526020019060010190611ef4565b9150868260018451611f329190613547565b81518110611f4257611f4261351b565b60200260200101511015611f685760405162461bcd60e51b81526004016104e39061355e565b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031663d0e30db083600081518110611faa57611faa61351b565b60200260200101516040518263ffffffff1660e01b815260040160206040518083038185885af1158015611fe2573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061200791906135e7565b507f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031663a9059cbb6120a18888600081811061204d5761204d61351b565b61206392602060609092020190810191506133b2565b898960008181106120765761207661351b565b905060600201602001602081019061208e91906133b2565b8a8a60008181106112f9576112f961351b565b846000815181106120b4576120b461351b565b60200260200101516040518363ffffffff1660e01b81526004016120ed9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af115801561210c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121309190613454565b61213c5761213c612b43565b611385828787808060200260200160405190810160405280939291908181526020016000905b828210156113765761217f606083028601368190038101906136ba565b81526020019060010190612162565b606081428110156121b15760405162461bcd60e51b81526004016104e390613425565b612203888787808060200260200160405190810160405280939291908181526020016000905b828210156119c5576121f4606083028601368190038101906136ba565b815260200190600101906121d7565b91508682600184516122159190613547565b815181106122255761222561351b565b6020026020010151101561224b5760405162461bcd60e51b81526004016104e39061355e565b61226186866000818110611a2d57611a2d61351b565b611bb2828787808060200260200160405190810160405280939291908181526020016000905b82821015611376576122a4606083028601368190038101906136ba565b81526020019060010190612287565b6000846001600160a01b03163b116122ca57600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161232e91906137ad565b6000604051808303816000865af19150503d806000811461236b576040519150601f19603f3d011682016040523d82523d6000602084013e612370565b606091505b509150915081801561239a57508051158061239a57508080602001905181019061239a9190613454565b6123a357600080fd5b505050505050565b60005b82518110156125fa5760006123fd8483815181106123ce576123ce61351b565b6020026020010151600001518584815181106123ec576123ec61351b565b602002602001015160200151610afb565b50905060008561240e84600161370d565b8151811061241e5761241e61351b565b60200260200101519050600080836001600160a01b03168786815181106124475761244761351b565b6020026020010151600001516001600160a01b0316146124695782600061246d565b6000835b915091506000600188516124819190613547565b861061248d5786612500565b6125008861249c88600161370d565b815181106124ac576124ac61351b565b602002602001015160000151898860016124c6919061370d565b815181106124d6576124d661351b565b6020026020010151602001518a8960016124f0919061370d565b815181106108435761084361351b565b90506125538887815181106125175761251761351b565b6020026020010151600001518988815181106125355761253561351b565b6020026020010151602001518a89815181106108435761084361351b565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612590576020820181803683370190505b506040518563ffffffff1660e01b81526004016125b094939291906137c9565b600060405180830381600087803b1580156125ca57600080fd5b505af11580156125de573d6000803e3d6000fd5b50505050505050505080806125f290613725565b9150506123ae565b50505050565b6000808386101561261057600080fd5b8285101561261d57600080fd5b6040516306801cc360e41b81526000906001600160a01b037f0000000000000000000000003faab499b519fdc5819e3d7ed0c26111904cbc281690636801cc3090612670908d908d908d906004016135a6565b602060405180830381865afa15801561268d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b191906135ca565b90506001600160a01b038116612757576040516320b7f73960e21b81526001600160a01b037f0000000000000000000000003faab499b519fdc5819e3d7ed0c26111904cbc2816906382dfdce490612711908d908d908d906004016135a6565b6020604051808303816000875af1158015612730573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275491906135ca565b90505b6000806127658c8c8c611175565b91509150816000148015612777575080155b156127875788945087935061280f565b60006127948a848461295c565b90508881116127c857868110156127bd5760405162461bcd60e51b81526004016104e3906134d8565b89955093508361280d565b60006127d58a848661295c565b90508a8111156127e7576127e7612b43565b888110156128075760405162461bcd60e51b81526004016104e390613495565b95508894505b505b50505097509795505050505050565b604080516000808252602082019092526001600160a01b03841690839060405161284891906137ad565b60006040518083038185875af1925050503d8060008114612885576040519150601f19603f3d011682016040523d82523d6000602084013e61288a565b606091505b50509050806128e75760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b60648201526084016104e3565b505050565b6000600382111561294d575080600061290660028361361f565b61291190600161370d565b90505b818110156129475790508060028161292c818661361f565b612936919061370d565b612940919061361f565b9050612914565b50919050565b8115612957575060015b919050565b60008084116129b75760405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a20494e53554646494349454e545f414d4f554e6044820152601560fa1b60648201526084016104e3565b6000831180156129c75750600082115b612a1f5760405162461bcd60e51b8152602060048201526024808201527f426173655631526f757465723a20494e53554646494349454e545f4c495155496044820152634449545960e01b60648201526084016104e3565b82612a2a8386613600565b612a34919061361f565b949350505050565b6000818310612a4b5781612a4d565b825b9392505050565b6000836001600160a01b03163b11612a6b57600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612ac791906137ad565b6000604051808303816000865af19150503d8060008114612b04576040519150601f19603f3d011682016040523d82523d6000602084013e612b09565b606091505b5091509150818015612b33575080511580612b33575080806020019051810190612b339190613454565b612b3c57600080fd5b5050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b0381168114612b6e57600080fd5b50565b803561295781612b59565b8015158114612b6e57600080fd5b600080600080600080600080610100898b031215612ba757600080fd5b8835612bb281612b59565b97506020890135612bc281612b59565b96506040890135612bd281612b7c565b9550606089013594506080890135935060a0890135925060c0890135612bf781612b59565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a031215612c2a57600080fd5b87359650602088013595506040880135612c4381612b59565b94506060880135612c5381612b59565b93506080880135612c6381612b7c565b925060a0880135612c7381612b59565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015612cc257835183529284019291840191600101612ca6565b50909695505050505050565b60008060008060808587031215612ce457600080fd5b8435612cef81612b59565b93506020850135612cff81612b59565b92506040850135612d0f81612b7c565b9396929550929360600135925050565b600080600060608486031215612d3457600080fd5b8335612d3f81612b59565b92506020840135612d4f81612b59565b91506040840135612d5f81612b7c565b809150509250925092565b60008060408385031215612d7d57600080fd5b8235612d8881612b59565b91506020830135612d9881612b59565b809150509250929050565b600080600080600080600060e0888a031215612dbe57600080fd5b8735612dc981612b59565b96506020880135612dd981612b7c565b955060408801359450606088013593506080880135925060a0880135612c7381612b59565b60008060008060008060008060006101208a8c031215612e1d57600080fd5b8935612e2881612b59565b985060208a0135612e3881612b59565b975060408a0135612e4881612b7c565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a0135612e7481612b59565b809250506101008a013590509295985092959850929598565b600080600060608486031215612ea257600080fd5b833592506020840135612eb481612b59565b91506040840135612d5f81612b59565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612f0357612f03612ec4565b604052919050565b600067ffffffffffffffff821115612f2557612f25612ec4565b5060051b60200190565b60008083601f840112612f4157600080fd5b50813567ffffffffffffffff811115612f5957600080fd5b602083019150836020606083028501011115610be857600080fd5b600080600080600060808688031215612f8c57600080fd5b853567ffffffffffffffff80821115612fa457600080fd5b818801915088601f830112612fb857600080fd5b81356020612fcd612fc883612f0b565b612eda565b82815260059290921b8401810191818101908c841115612fec57600080fd5b948201945b8386101561300a57853582529482019490820190612ff1565b9950508901359250508082111561302057600080fd5b5061302d88828901612f2f565b9095509350613040905060408701612b71565b949793965091946060013592915050565b60006060828403121561306357600080fd5b6040516060810181811067ffffffffffffffff8211171561308657613086612ec4565b604052905080823561309781612b59565b815260208301356130a781612b59565b602082015260408301356130ba81612b7c565b6040919091015292915050565b600080604083850312156130da57600080fd5b8235915060208084013567ffffffffffffffff8111156130f957600080fd5b8401601f8101861361310a57600080fd5b8035613118612fc882612f0b565b8181526060918202830184019184820191908984111561313757600080fd5b938501935b8385101561315d5761314e8a86613051565b8352938401939185019161313c565b5080955050505050509250929050565b600080600080600060a0868803121561318557600080fd5b853561319081612b59565b945060208601356131a081612b59565b935060408601356131b081612b7c565b94979396509394606081013594506080013592915050565b803560ff8116811461295757600080fd5b6000806000806000806000806000806000806101808d8f0312156131fc57600080fd5b8c3561320781612b59565b9b5060208d013561321781612b59565b9a5060408d013561322781612b7c565b995060608d0135985060808d0135975060a08d0135965060c08d013561324c81612b59565b955060e08d013594506101008d013561326481612b7c565b93506132736101208e016131c8565b92506101408d013591506101608d013590509295989b509295989b509295989b565b60008060008060008060a087890312156132ae57600080fd5b8635955060208701359450604087013567ffffffffffffffff8111156132d357600080fd5b6132df89828a01612f2f565b90955093505060608701356132f381612b59565b80925050608087013590509295509295509295565b60008060008060008060008060008060006101608c8e03121561332a57600080fd5b8b3561333581612b59565b9a5060208c013561334581612b7c565b995060408c0135985060608c0135975060808c0135965060a08c013561336a81612b59565b955060c08c0135945060e08c013561338181612b7c565b93506133906101008d016131c8565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000602082840312156133c457600080fd5b8135612a4d81612b59565b6000806000806000608086880312156133e757600080fd5b85359450602086013567ffffffffffffffff81111561340557600080fd5b61341188828901612f2f565b909550935050604086013561304081612b59565b60208082526015908201527410985cd9558c549bdd5d195c8e8811561412549151605a1b604082015260600190565b60006020828403121561346657600080fd5b8151612a4d81612b7c565b6000806040838503121561348457600080fd5b505080516020909101519092909150565b60208082526023908201527f426173655631526f757465723a20494e53554646494349454e545f415f414d4f60408201526215539560ea1b606082015260800190565b60208082526023908201527f426173655631526f757465723a20494e53554646494349454e545f425f414d4f60408201526215539560ea1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561355957613559613531565b500390565b60208082526028908201527f426173655631526f757465723a20494e53554646494349454e545f4f555450556040820152671517d05353d5539560c21b606082015260800190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000602082840312156135dc57600080fd5b8151612a4d81612b59565b6000602082840312156135f957600080fd5b5051919050565b600081600019048311821515161561361a5761361a613531565b500290565b60008261363c57634e487b7160e01b600052601260045260246000fd5b500490565b80516001600160701b038116811461295757600080fd5b60008060006060848603121561366d57600080fd5b61367684613641565b925061368460208501613641565b9150604084015163ffffffff81168114612d5f57600080fd5b6000602082840312156136af57600080fd5b8135612a4d81612b7c565b6000606082840312156136cc57600080fd5b612a4d8383613051565b6020808252601a908201527f426173655631526f757465723a20494e56414c49445f50415448000000000000604082015260600190565b6000821982111561372057613720613531565b500190565b600060001982141561373957613739613531565b5060010190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b60005b8381101561379c578181015183820152602001613784565b838111156125fa5750506000910152565b600082516137bf818460208701613781565b9190910192915050565b84815283602082015260018060a01b038316604082015260806060820152600082518060808401526138028160a0850160208701613781565b601f01601f19169190910160a0019594505050505056fea2646970667358221220e6efa68269e8b49fe415e3d43f111437355d5066d7adbf8137894a015eaa750f64736f6c634300080b0033

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

0000000000000000000000003faab499b519fdc5819e3d7ed0c26111904cbc2800000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Decoded View---------------
Arg [0] : _factory (address): 0x3fAaB499b519fdC5819e3D7ed0C26111904cbc28
Arg [1] : _wftm (address): 0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000003faab499b519fdc5819e3d7ed0c26111904cbc28
Arg [1] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83


Deployed Bytecode Sourcemap

2319:17320:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2975:10;-1:-1:-1;;;;;2997:4:0;2975:27;;2968:35;;;;:::i;:::-;2319:17320;;;;;11823:832;;;;;;;;;;-1:-1:-1;11823:832:0;;;;;:::i;:::-;;:::i;:::-;;;;1664:25:1;;;1720:2;1705:18;;1698:34;;;;1637:18;11823:832:0;;;;;;;;15540:786;;;;;;;;;;-1:-1:-1;15540:786:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7836:753::-;;;;;;;;;;-1:-1:-1;7836:753:0;;;;;:::i;:::-;;:::i;3505:415::-;;;;;;;;;;-1:-1:-1;3505:415:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4546:32:1;;;4528:51;;4516:2;4501:18;3505:415:0;4382:203:1;3074:339:0;;;;;;;;;;-1:-1:-1;3074:339:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5213:15:1;;;5195:34;;5265:15;;;;5260:2;5245:18;;5238:43;5130:18;3074:339:0;4983:304:1;10825:955:0;;;;;;:::i;:::-;;:::i;:::-;;;;6298:25:1;;;6354:2;6339:18;;6332:34;;;;6382:18;;;6375:34;6286:2;6271:18;10825:955:0;6096:319:1;10115:702:0;;;;;;;;;;-1:-1:-1;10115:702:0;;;;;:::i;:::-;;:::i;4873:680::-;;;;;;;;;;-1:-1:-1;4873:680:0;;;;;:::i;:::-;;:::i;:::-;;;;8064:25:1;;;8132:14;;8125:22;8120:2;8105:18;;8098:50;8037:18;4873:680:0;7896:258:1;4410:381:0;;;;;;;;;;-1:-1:-1;4410:381:0;;;;;:::i;:::-;;:::i;18332:404::-;;;;;;;;;;-1:-1:-1;18332:404:0;;;;;:::i;:::-;;:::i;5635:573::-;;;;;;;;;;-1:-1:-1;5635:573:0;;;;;:::i;:::-;;:::i;6345:1483::-;;;;;;;;;;-1:-1:-1;6345:1483:0;;;;;:::i;:::-;;:::i;13344:707::-;;;;;;;;;;-1:-1:-1;13344:707:0;;;;;:::i;:::-;;:::i;2447:32::-;;;;;;;;;;;;;;;17557:767;;;;;;;;;;-1:-1:-1;17557:767:0;;;;;:::i;:::-;;:::i;12663:673::-;;;;;;;;;;-1:-1:-1;12663:673:0;;;;;:::i;:::-;;:::i;14059:676::-;;;;;;;;;;-1:-1:-1;14059:676:0;;;;;:::i;:::-;;:::i;6216:121::-;;;;;;;;;;-1:-1:-1;6216:121:0;;;;;:::i;:::-;;:::i;:::-;;;16861:14:1;;16854:22;16836:41;;16824:2;16809:18;6216:121:0;16696:187:1;16925:624:0;;;;;;:::i;:::-;;:::i;16334:583::-;;;;;;;;;;-1:-1:-1;16334:583:0;;;;;:::i;:::-;;:::i;2486:27::-;;;;;;;;;;;;;;;11823:832;12082:12;12096;12063:8;2676:15;2664:8;:27;;2656:61;;;;-1:-1:-1;;;2656:61:0;;;;;;;:::i;:::-;;;;;;;;;12121:12:::1;12136:31;12144:6;12152;12160;12136:7;:31::i;:::-;12186:59;::::0;-1:-1:-1;;;12186:59:0;;12217:10:::1;12186:59;::::0;::::1;18451:34:1::0;-1:-1:-1;;;;;12186:30:0;::::1;18501:18:1::0;;;18494:43;;;18553:18;;;18546:34;;;12121:46:0;;-1:-1:-1;12186:30:0::1;::::0;18386:18:1;;12186:59:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12178:68;;;::::0;::::1;;12314:26;::::0;-1:-1:-1;;;12314:26:0;;-1:-1:-1;;;;;4546:32:1;;;12314:26:0::1;::::0;::::1;4528:51:1::0;12284:12:0::1;::::0;;;12314:22;::::1;::::0;::::1;::::0;4501:18:1;;12314:26:0::1;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12283:57;;;;12352:14;12371:26;12382:6;12390;12371:10;:26::i;:::-;12351:46;;;12439:6;-1:-1:-1::0;;;;;12429:16:0::1;:6;-1:-1:-1::0;;;;;12429:16:0::1;;:58;;12470:7;12479;12429:58;;;12449:7;12458;12429:58;12408:79:::0;;-1:-1:-1;12408:79:0;-1:-1:-1;12506:21:0;;::::1;;12498:69;;;;-1:-1:-1::0;;;12498:69:0::1;;;;;;;:::i;:::-;12597:10;12586:7;:21;;12578:69;;;;-1:-1:-1::0;;;12578:69:0::1;;;;;;;:::i;:::-;12110:545;;;;11823:832:::0;;;;;;;;;;;;:::o;15540:786::-;15795:21;15776:8;2676:15;2664:8;:27;;2656:61;;;;-1:-1:-1;;;2656:61:0;;;;;;;:::i;:::-;15853:14:::1;::::0;;15865:1:::1;15853:14:::0;;;;;::::1;::::0;;;15829:21:::1;::::0;15853:14:::1;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;15853:14:0;;-1:-1:-1;;15853:14:0;;;;::::1;::::0;::::1;;;;;15829:38;;15895:9;15878:6;15885:1;15878:9;;;;;;;;:::i;:::-;;;;;;;:14;;:26;-1:-1:-1::0;;;;;15878:26:0::1;;;-1:-1:-1::0;;;;;15878:26:0::1;;;::::0;::::1;15930:7;15915:6;15922:1;15915:9;;;;;;;;:::i;:::-;;;;;;;:12;;:22;-1:-1:-1::0;;;;;15915:22:0::1;;;-1:-1:-1::0;;;;;15915:22:0::1;;;::::0;::::1;15967:6;15948;15955:1;15948:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;:25;::::1;;:16;::::0;;::::1;:25:::0;15994:31:::1;16008:8:::0;16018:6;15994:13:::1;:31::i;:::-;15984:41;;16075:12;16044:7;16069:1;16052:7;:14;:18;;;;:::i;:::-;16044:27;;;;;;;;:::i;:::-;;;;;;;:43;;16036:96;;;;-1:-1:-1::0;;;16036:96:0::1;;;;;;;:::i;:::-;16143:138;16175:6;16182:1;16175:9;;;;;;;;:::i;:::-;;;;;;;:14;;;16191:10;16203:55;16211:6;16218:1;16211:9;;;;;;;;:::i;:::-;;;;;;;:14;;;16227:6;16234:1;16227:9;;;;;;;;:::i;:::-;;;;;;;:12;;;16241:6;16248:1;16241:9;;;;;;;;:::i;:::-;;;;;;;:16;;;16203:7;:55::i;:::-;16260:7;16268:1;16260:10;;;;;;;;:::i;:::-;;;;;;;16143:17;:138::i;:::-;16292:26;16298:7;16307:6;16315:2;16292:5;:26::i;:::-;15818:508;15540:786:::0;;;;;;;;;;:::o;7836:753::-;7993:12;8007;8084:13;8115:7;-1:-1:-1;;;;;8100:31:0;;8132:6;8140;8148;8100:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8084:71;-1:-1:-1;;;;;;8172:19:0;;8168:64;;8216:1;8218;8208:12;;;;;;;8168:64;8245:13;8260;8277:35;8289:6;8297;8305;8277:11;:35::i;:::-;8244:68;;;;8323:17;8349:5;-1:-1:-1;;;;;8343:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8323:46;-1:-1:-1;8323:46:0;8392:20;8404:8;8392:9;:20;:::i;:::-;:35;;;;:::i;:::-;8382:45;-1:-1:-1;8519:12:0;8496:20;8508:8;8496:9;:20;:::i;:::-;:35;;;;:::i;:::-;8486:45;;8021:568;;;;7836:753;;;;;;;;:::o;3505:415::-;3588:12;3614:14;3630;3648:26;3659:6;3667;3648:10;:26::i;:::-;3811:40;;-1:-1:-1;;22181:2:1;22177:15;;;22173:24;;3811:40:0;;;22161:37:1;22232:15;;;22228:24;22214:12;;;22207:46;22299:14;;22292:22;22287:3;22283:32;22269:12;;;22262:54;3613:61:0;;-1:-1:-1;3613:61:0;-1:-1:-1;3779:7:0;;22332:12:1;;3811:40:0;;;;;;;;;;;;3801:51;;;;;;3867:12;3726:182;;;;;;;;;-1:-1:-1;;;;;;22641:26:1;;22704:2;22700:15;;;;-1:-1:-1;;22696:53:1;22692:1;22683:11;;22676:74;22775:2;22766:12;;22759:28;;;;22812:2;22803:12;;22796:28;22849:2;22840:12;;22355:503;3726:182:0;;;;-1:-1:-1;;3726:182:0;;;;;;;;;3716:193;;3726:182;3716:193;;;;;3505:415;-1:-1:-1;;;;;;3505:415:0:o;3074:339::-;3147:14;3163;3208:6;-1:-1:-1;;;;;3198:16:0;:6;-1:-1:-1;;;;;3198:16:0;;;3190:62;;;;-1:-1:-1;;;3190:62:0;;23065:2:1;3190:62:0;;;23047:21:1;23104:2;23084:18;;;23077:30;23143:34;23123:18;;;23116:62;-1:-1:-1;;;23194:18:1;;;23187:31;23235:19;;3190:62:0;22863:397:1;3190:62:0;3291:6;-1:-1:-1;;;;;3282:15:0;:6;-1:-1:-1;;;;;3282:15:0;;:53;;3320:6;3328;3282:53;;;3301:6;3309;3282:53;3263:72;;-1:-1:-1;3263:72:0;-1:-1:-1;;;;;;3354:20:0;;3346:59;;;;-1:-1:-1;;;3346:59:0;;23467:2:1;3346:59:0;;;23449:21:1;23506:2;23486:18;;;23479:30;23545:28;23525:18;;;23518:56;23591:18;;3346:59:0;23265:350:1;3346:59:0;3074:339;;;;;:::o;10825:955::-;11083:16;11101:14;11117;11064:8;2676:15;2664:8;:27;;2656:61;;;;-1:-1:-1;;;2656:61:0;;;;;;;:::i;:::-;11171:206:::1;11199:5;11227:4;11247:6;11268:18;11301:9;11325:14;11354:12;11171:13;:206::i;:::-;11144:233:::0;;-1:-1:-1;11144:233:0;-1:-1:-1;11388:12:0::1;11403:37;11411:5:::0;11426:4:::1;11433:6:::0;11403:7:::1;:37::i;:::-;11388:52;;11451:55;11469:5;11476:10;11488:4;11494:11;11451:17;:55::i;:::-;11517:4;-1:-1:-1::0;;;;;11517:12:0::1;;11537:9;11517:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;11567:30:0::1;::::0;-1:-1:-1;;;11567:30:0;;-1:-1:-1;;;;;23812:32:1;;;11567:30:0::1;::::0;::::1;23794:51:1::0;23861:18;;;23854:34;;;11567:4:0::1;:13;::::0;::::1;::::0;23767:18:1;;11567:30:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11560:38;;;;:::i;:::-;11621:26;::::0;-1:-1:-1;;;11621:26:0;;-1:-1:-1;;;;;4546:32:1;;;11621:26:0::1;::::0;::::1;4528:51:1::0;11621:22:0;::::1;::::0;::::1;::::0;4501:18:1;;11621:26:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11609:38;;11710:9;11698;:21;11694:78;;;11721:51;11738:10;11750:21;11762:9:::0;11750::::1;:21;:::i;:::-;11721:16;:51::i;:::-;11133:647;10825:955:::0;;;;;;;;;;;;:::o;10115:702::-;10408:12;10422;10436:14;10389:8;2676:15;2664:8;:27;;2656:61;;;;-1:-1:-1;;;2656:61:0;;;;;;;:::i;:::-;10484:93:::1;10498:6;10506;10514;10522:14;10538;10554:10;10566;10484:13;:93::i;:::-;10463:114:::0;;-1:-1:-1;10463:114:0;-1:-1:-1;10588:12:0::1;10603:31;10611:6:::0;10619;10627;10603:7:::1;:31::i;:::-;10588:46;;10645:52;10663:6;10671:10;10683:4;10689:7;10645:17;:52::i;:::-;10708;10726:6;10734:10;10746:4;10752:7;10708:17;:52::i;:::-;10783:26;::::0;-1:-1:-1;;;10783:26:0;;-1:-1:-1;;;;;4546:32:1;;;10783:26:0::1;::::0;::::1;4528:51:1::0;10783:22:0;::::1;::::0;::::1;::::0;4501:18:1;;10783:26:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10771:38;;10452:365;10115:702:::0;;;;;;;;;;;;;;:::o;4873:680::-;4968:11;4981;5005:12;5020:32;5028:7;5037:8;5047:4;5020:7;:32::i;:::-;5125:36;;-1:-1:-1;;;5125:36:0;;-1:-1:-1;;;;;4546:32:1;;;5125:36:0;;;4528:51:1;4546:32;;-1:-1:-1;;;;;5140:7:0;5125:30;;;;;;4501:18:1;;5125:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5121:133;;;5193:49;;-1:-1:-1;;;5193:49:0;;;;;24073:25:1;;;-1:-1:-1;;;;;24134:32:1;;;24114:18;;;24107:60;5193:30:0;;;;;24046:18:1;;5193:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5178:64;;5121:133;5271:33;5279:7;5288:8;5298:5;5271:7;:33::i;:::-;5319:36;;-1:-1:-1;;;5319:36:0;;-1:-1:-1;;;;;4546:32:1;;;5319:36:0;;;4528:51:1;5264:40:0;;-1:-1:-1;5334:7:0;5319:30;;;;;;4501:18:1;;5319:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5315:135;;;5389:49;;-1:-1:-1;;;5389:49:0;;;;;24073:25:1;;;-1:-1:-1;;;;;24134:32:1;;;24114:18;;;24107:60;5389:30:0;;;;;24046:18:1;;5389:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5372:66;;5315:135;5482:14;5467:12;:29;:78;;5523:14;5539:5;5467:78;;;5500:12;5514:4;5467:78;5460:85;;;;;;;4873:680;;;;;;:::o;4410:381::-;4497:13;4512;4539:14;4558:26;4569:6;4577;4558:10;:26::i;:::-;4538:46;;;4596:13;4611;4641:31;4649:6;4657;4665;4641:7;:31::i;:::-;-1:-1:-1;;;;;4629:56:0;;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4595:92;-1:-1:-1;;;;;4595:92:0;;;-1:-1:-1;;;;;4595:92:0;;;4731:6;-1:-1:-1;;;;;4721:16:0;:6;-1:-1:-1;;;;;4721:16:0;;:62;;4764:8;4774;4721:62;;;4741:8;4751;4721:62;4698:85;;;;-1:-1:-1;4410:381:0;-1:-1:-1;;;;;;;4410:381:0:o;18332:404::-;18526:13;18507:8;2676:15;2664:8;:27;;2656:61;;;;-1:-1:-1;;;2656:61:0;;;;;;;:::i;:::-;18552:114:::1;18570:6;;18577:1;18570:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;18570:14:0::1;:::i;:::-;18586:10;18598:55;18606:6;;18613:1;18606:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;18606:14:0::1;:::i;:::-;18622:6;;18629:1;18622:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;18636:6;;18643:1;18636:9;;;;;;;:::i;:::-;;;;;;:16;;;;;;;;;;:::i;18598:55::-;18655:7;18663:1;18655:10;;;;;;;;:::i;18552:114::-;18677:26;18683:7;18692:6;;18677:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;18700:2;18677:5;:26::i;:::-;18721:7;18714:14;;2728:1;18332:404:::0;;;;;;;;:::o;5635:573::-;5717:21;5776:1;5759:6;:13;:18;;5751:57;;;;-1:-1:-1;;;5751:57:0;;;;;;;:::i;:::-;5840:13;;:15;;5854:1;5840:15;:::i;:::-;5829:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5829:27:0;;5819:37;;5880:8;5867:7;5875:1;5867:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;5904:6;5899:302;5920:6;:13;5916:1;:17;5899:302;;;5955:12;5970:55;5978:6;5985:1;5978:9;;;;;;;;:::i;:::-;;;;;;;:14;;;5994:6;6001:1;5994:9;;;;;;;;:::i;:::-;;;;;;;:12;;;6008:6;6015:1;6008:9;;;;;;;;:::i;5970:55::-;6044:36;;-1:-1:-1;;;6044:36:0;;-1:-1:-1;;;;;4546:32:1;;;6044:36:0;;;4528:51:1;5955:70:0;;-1:-1:-1;6059:7:0;6044:30;;;;;;4501:18:1;;6044:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6040:150;;;6128:4;-1:-1:-1;;;;;6116:30:0;;6147:7;6155:1;6147:10;;;;;;;;:::i;:::-;;;;;;;6159:6;6166:1;6159:9;;;;;;;;:::i;:::-;;;;;;;:14;;;6116:58;;;;;;;;;;;;;;;24073:25:1;;;-1:-1:-1;;;;;24134:32:1;24129:2;24114:18;;24107:60;24061:2;24046:18;;23899:274;6116:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6101:7;6109:3;:1;6111;6109:3;:::i;:::-;6101:12;;;;;;;;:::i;:::-;;;;;;:73;;;;;6040:150;-1:-1:-1;5935:3:0;;;;:::i;:::-;;;;5899:302;;;;5635:573;;;;:::o;6345:1483::-;6534:12;6548;6562:14;6641:13;6672:7;-1:-1:-1;;;;;6657:31:0;;6689:6;6697;6705;6657:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6641:71;-1:-1:-1;6724:13:0;;;-1:-1:-1;;;;;6808:19:0;;;6804:166;;6865:5;-1:-1:-1;;;;;6859:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6844:41;;6923:35;6935:6;6943;6951;6923:11;:35::i;:::-;6900:58;;-1:-1:-1;6900:58:0;-1:-1:-1;6804:166:0;6984:13;;:30;;;;-1:-1:-1;7001:13:0;;6984:30;6980:841;;;7053:14;;-1:-1:-1;7069:14:0;;-1:-1:-1;2563:5:0;7111:28;7121:17;7069:14;7053;7121:17;:::i;:::-;7111:9;:28::i;:::-;:48;;;;:::i;:::-;7099:60;;6980:841;;;7194:19;7216:50;7231:14;7247:8;7257;7216:14;:50::i;:::-;7194:72;;7303:14;7285;:32;7281:529;;7360:14;;-1:-1:-1;7376:14:0;-1:-1:-1;7376:14:0;7422:78;7456:8;7431:22;7441:12;7360:14;7431:22;:::i;:::-;:33;;;;:::i;:::-;7491:8;7466:22;7476:12;7466:7;:22;:::i;:::-;:33;;;;:::i;:::-;7422:8;:78::i;:::-;7410:90;;7281:529;;;7541:19;7563:50;7578:14;7594:8;7604;7563:14;:50::i;:::-;7541:72;-1:-1:-1;7670:14:0;;-1:-1:-1;7541:72:0;;-1:-1:-1;7716:78:0;7750:8;7725:22;7735:12;7541:72;7725:22;:::i;:::-;:33;;;;:::i;:::-;7785:8;7760:22;7770:12;7760:7;:22;:::i;7716:78::-;7704:90;;7522:288;7281:529;7177:644;6980:841;6578:1250;;;;6345:1483;;;;;;;;;:::o;13344:707::-;13655:12;13669;13694;13709:31;13717:6;13725;13733;13709:7;:31::i;:::-;13694:46;;13766:10;13779;:39;;13809:9;13779:39;;;-1:-1:-1;;13779:39:0;13833:77;;-1:-1:-1;;;13833:77:0;;13766:52;;-1:-1:-1;;;;;;13833:24:0;;;;;:77;;13858:10;;13878:4;;13766:52;;13892:8;;13902:1;;13905;;13908;;13833:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13751:171;13955:88;13971:6;13979;13987;13995:9;14006:10;14018;14030:2;14034:8;13955:15;:88::i;:::-;13934:109;;;;;;;;13683:368;13344:707;;;;;;;;;;;;;;;:::o;17557:767::-;17724:21;17700:8;2676:15;2664:8;:27;;2656:61;;;;-1:-1:-1;;;2656:61:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17811:4:0::1;17771:45;:6:::0;;17778:17:::1;17794:1;17771:6:::0;17778:17:::1;:::i;:::-;17771:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;17771:45:0::1;;17763:84;;;;-1:-1:-1::0;;;17763:84:0::1;;;;;;;:::i;:::-;17868:31;17882:8;17892:6;;17868:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;:13;:31::i;:::-;17858:41;;17949:12;17918:7;17943:1;17926:7;:14;:18;;;;:::i;:::-;17918:27;;;;;;;;:::i;:::-;;;;;;;:43;;17910:96;;;;-1:-1:-1::0;;;17910:96:0::1;;;;;;;:::i;:::-;18017:138;18049:6;;18056:1;18049:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;18049:14:0::1;:::i;:::-;18065:10;18077:55;18085:6;;18092:1;18085:9;;;;;;;:::i;18077:55::-;18134:7;18142:1;18134:10;;;;;;;;:::i;18017:138::-;18166:37;18172:7;18181:6;;18166:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;18197:4;18166:5;:37::i;:::-;18214:4;-1:-1:-1::0;;;;;18214:13:0::1;;18228:7;18253:1;18236:7;:14;:18;;;;:::i;:::-;18228:27;;;;;;;;:::i;:::-;;;;;;;18214:42;;;;;;;;;;;;;26748:25:1::0;;26736:2;26721:18;;26602:177;18214:42:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18267:49;18284:2;18288:7;18313:1;18296:7;:14;:18;;;;:::i;:::-;18288:27;;;;;;;;:::i;:::-;;;;;;;18267:16;:49::i;:::-;17557:767:::0;;;;;;;;;:::o;12663:673::-;12905:16;12923:14;12886:8;2676:15;2664:8;:27;;2656:61;;;;-1:-1:-1;;;2656:61:0;;;;;;;:::i;:::-;12977:226:::1;13007:5;13035:4;13055:6;13076:9;13100:14;13129:12;13164:4;13184:8;12977:15;:226::i;:::-;12950:253:::0;;-1:-1:-1;12950:253:0;-1:-1:-1;13214:37:0::1;13228:5:::0;13235:2;12950:253;13214:13:::1;:37::i;:::-;13262:24;::::0;-1:-1:-1;;;13262:24:0;;::::1;::::0;::::1;26748:25:1::0;;;13262:4:0::1;-1:-1:-1::0;;;;;13262:13:0::1;::::0;::::1;::::0;26721:18:1;;13262:24:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13297:31;13314:2;13318:9;13297:16;:31::i;:::-;12663:673:::0;;;;;;;;;;;:::o;14059:676::-;14353:16;14371:14;14398:12;14413:37;14421:5;14436:4;14443:6;14413:7;:37::i;:::-;14398:52;;14461:10;14474;:39;;14504:9;14474:39;;;-1:-1:-1;;14474:39:0;14524:77;;-1:-1:-1;;;14524:77:0;;14461:52;;-1:-1:-1;;;;;;14524:24:0;;;;;:77;;14549:10;;14569:4;;14461:52;;14583:8;;14593:1;;14596;;14599;;14524:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14639:88;14658:5;14665:6;14673:9;14684:14;14700:12;14714:2;14718:8;14639:18;:88::i;:::-;14612:115;;;;;;;;14387:348;;14059:676;;;;;;;;;;;;;;:::o;6216:121::-;6293:36;;-1:-1:-1;;;6293:36:0;;-1:-1:-1;;;;;4546:32:1;;;6293:36:0;;;4528:51:1;6269:4:0;;6308:7;6293:30;;;;;;4501:18:1;;6293:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6286:43;6216:121;-1:-1:-1;;6216:121:0:o;16925:624::-;17090:21;17066:8;2676:15;2664:8;:27;;2656:61;;;;-1:-1:-1;;;2656:61:0;;;;;;;:::i;:::-;17163:4:::1;-1:-1:-1::0;;;;;17137:31:0::1;:6;;17144:1;17137:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;17137:14:0::1;:::i;:::-;-1:-1:-1::0;;;;;17137:31:0::1;;17129:70;;;;-1:-1:-1::0;;;17129:70:0::1;;;;;;;:::i;:::-;17220:32;17234:9;17245:6;;17220:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;17210:42;;17302:12;17271:7;17296:1;17279:7;:14;:18;;;;:::i;:::-;17271:27;;;;;;;;:::i;:::-;;;;;;;:43;;17263:96;;;;-1:-1:-1::0;;;17263:96:0::1;;;;;;;:::i;:::-;17370:4;-1:-1:-1::0;;;;;17370:12:0::1;;17390:7;17398:1;17390:10;;;;;;;;:::i;:::-;;;;;;;17370:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17421:4;-1:-1:-1::0;;;;;17421:13:0::1;;17435:55;17443:6;;17450:1;17443:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;17443:14:0::1;:::i;:::-;17459:6;;17466:1;17459:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;17473:6;;17480:1;17473:9;;;;;;;:::i;17435:55::-;17492:7;17500:1;17492:10;;;;;;;;:::i;:::-;;;;;;;17421:82;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;23812:32:1;;;;23794:51;;23876:2;23861:18;;23854:34;23782:2;23767:18;;23620:274;17421:82:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17414:90;;;;:::i;:::-;17515:26;17521:7;17530:6;;17515:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;16334:583:::0;16541:21;16522:8;2676:15;2664:8;:27;;2656:61;;;;-1:-1:-1;;;2656:61:0;;;;;;;:::i;:::-;16585:31:::1;16599:8;16609:6;;16585:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;16575:41;;16666:12;16635:7;16660:1;16643:7;:14;:18;;;;:::i;:::-;16635:27;;;;;;;;:::i;:::-;;;;;;;:43;;16627:96;;;;-1:-1:-1::0;;;16627:96:0::1;;;;;;;:::i;:::-;16734:138;16766:6;;16773:1;16766:9;;;;;;;:::i;16734:138::-;16883:26;16889:7;16898:6;;16883:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;19282:354:::0;19413:1;19393:5;-1:-1:-1;;;;;19393:17:0;;:21;19385:30;;;;;;19482:68;;;-1:-1:-1;;;;;18469:15:1;;;19482:68:0;;;18451:34:1;18521:15;;;18501:18;;;18494:43;18553:18;;;;18546:34;;;19482:68:0;;;;;;;;;;18386:18:1;;;;19482:68:0;;;;;;;-1:-1:-1;;;;;19482:68:0;-1:-1:-1;;;19482:68:0;;;19471:80;;-1:-1:-1;;;;19471:10:0;;;;:80;;19482:68;19471:80;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19426:125;;;;19570:7;:57;;;;-1:-1:-1;19582:11:0;;:16;;:44;;;19613:4;19602:24;;;;;;;;;;;;:::i;:::-;19562:66;;;;;;19374:262;;19282:354;;;;:::o;14846:686::-;14953:6;14948:577;14969:6;:13;14965:1;:17;14948:577;;;15005:14;15024:40;15035:6;15042:1;15035:9;;;;;;;;:::i;:::-;;;;;;;:14;;;15051:6;15058:1;15051:9;;;;;;;;:::i;:::-;;;;;;;:12;;;15024:10;:40::i;:::-;-1:-1:-1;15004:60:0;-1:-1:-1;15079:14:0;15096:7;15104:5;:1;15108;15104:5;:::i;:::-;15096:14;;;;;;;;:::i;:::-;;;;;;;15079:31;;15126:15;15143;15180:6;-1:-1:-1;;;;;15162:24:0;:6;15169:1;15162:9;;;;;;;;:::i;:::-;;;;;;;:14;;;-1:-1:-1;;;;;15162:24:0;;:70;;15213:9;15229:1;15162:70;;;15195:1;15199:9;15162:70;15125:107;;;;15247:10;15280:1;15264:6;:13;:17;;;;:::i;:::-;15260:1;:21;:91;;15348:3;15260:91;;;15284:61;15292:6;15299:3;:1;15301;15299:3;:::i;:::-;15292:11;;;;;;;;:::i;:::-;;;;;;;:16;;;15310:6;15317:1;15319;15317:3;;;;:::i;:::-;15310:11;;;;;;;;:::i;:::-;;;;;;;:14;;;15326:6;15333:1;15335;15333:3;;;;:::i;:::-;15326:11;;;;;;;;:::i;15284:61::-;15247:104;;15378:55;15386:6;15393:1;15386:9;;;;;;;;:::i;:::-;;;;;;;:14;;;15402:6;15409:1;15402:9;;;;;;;;:::i;:::-;;;;;;;:12;;;15416:6;15423:1;15416:9;;;;;;;;:::i;15378:55::-;-1:-1:-1;;;;;15366:73:0;;15458:10;15470;15482:2;15496:1;15486:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15486:12:0;;15366:147;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14989:536;;;;;14984:3;;;;;:::i;:::-;;;;14948:577;;;;14846:686;;;:::o;8597:1510::-;8829:12;8843;8894:10;8876:14;:28;;8868:37;;;;;;8942:10;8924:14;:28;;8916:37;;;;;;9032:55;;-1:-1:-1;;;9032:55:0;;9016:13;;-1:-1:-1;;;;;9047:7:0;9032:31;;;;:55;;9064:6;;9072;;9080;;9032:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9016:71;-1:-1:-1;;;;;;9102:19:0;;9098:118;;9146:58;;-1:-1:-1;;;9146:58:0;;-1:-1:-1;;;;;9161:7:0;9146:34;;;;:58;;9181:6;;9189;;9197;;9146:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9138:66;;9098:118;9227:13;9242;9259:35;9271:6;9279;9287;9259:11;:35::i;:::-;9226:68;;;;9309:8;9321:1;9309:13;:30;;;;-1:-1:-1;9326:13:0;;9309:30;9305:795;;;9378:14;;-1:-1:-1;9394:14:0;;-1:-1:-1;9305:795:0;;;9442:19;9464:50;9479:14;9495:8;9505;9464:14;:50::i;:::-;9442:72;;9551:14;9533;:32;9529:560;;9612:10;9594:14;:28;;9586:76;;;;-1:-1:-1;;;9586:76:0;;;;;;;:::i;:::-;9703:14;;-1:-1:-1;9719:14:0;-1:-1:-1;9719:14:0;9529:560;;;9775:19;9797:50;9812:14;9828:8;9838;9797:14;:50::i;:::-;9775:72;;9891:14;9873;:32;;9866:40;;;;:::i;:::-;9951:10;9933:14;:28;;9925:76;;;;-1:-1:-1;;;9925:76:0;;;;;;;:::i;:::-;10042:14;-1:-1:-1;10058:14:0;;-1:-1:-1;9529:560:0;9427:673;9305:795;8857:1250;;;8597:1510;;;;;;;;;;:::o;18744:196::-;18853:12;;;18815;18853;;;;;;;;;-1:-1:-1;;;;;18832:7:0;;;18846:5;;18832:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18814:52;;;18885:7;18877:55;;;;-1:-1:-1;;;18877:55:0;;28157:2:1;18877:55:0;;;28139:21:1;28196:2;28176:18;;;28169:30;28235:34;28215:18;;;28208:62;-1:-1:-1;;;28286:18:1;;;28279:33;28329:19;;18877:55:0;27955:399:1;18877:55:0;18803:137;18744:196;;:::o;1802:303::-;1847:6;1874:1;1870;:5;1866:232;;;-1:-1:-1;1896:1:0;1912:6;1921:5;1925:1;1896;1921:5;:::i;:::-;:9;;1929:1;1921:9;:::i;:::-;1912:18;;1945:92;1956:1;1952;:5;1945:92;;;1982:1;-1:-1:-1;1982:1:0;2020;1982;2007:5;1982:1;2007;:5;:::i;:::-;:9;;;;:::i;:::-;2006:15;;;;:::i;:::-;2002:19;;1945:92;;;1877:171;1802:303;;;:::o;1866:232::-;2058:6;;2054:44;;-1:-1:-1;2085:1:0;2054:44;1802:303;;;:::o;4033:319::-;4124:12;4167:1;4157:7;:11;4149:57;;;;-1:-1:-1;;;4149:57:0;;28561:2:1;4149:57:0;;;28543:21:1;28600:2;28580:18;;;28573:30;28639:34;28619:18;;;28612:62;-1:-1:-1;;;28690:18:1;;;28683:31;28731:19;;4149:57:0;28359:397:1;4149:57:0;4236:1;4225:8;:12;:28;;;;;4252:1;4241:8;:12;4225:28;4217:77;;;;-1:-1:-1;;;4217:77:0;;28963:2:1;4217:77:0;;;28945:21:1;29002:2;28982:18;;;28975:30;29041:34;29021:18;;;29014:62;-1:-1:-1;;;29092:18:1;;;29085:34;29136:19;;4217:77:0;28761:400:1;4217:77:0;4336:8;4315:18;4325:8;4315:7;:18;:::i;:::-;:29;;;;:::i;:::-;4305:39;4033:319;-1:-1:-1;;;;4033:319:0:o;1699:97::-;1751:4;1779:1;1775;:5;:13;;1787:1;1775:13;;;1783:1;1775:13;1768:20;1699:97;-1:-1:-1;;;1699:97:0:o;18948:326::-;19061:1;19041:5;-1:-1:-1;;;;;19041:17:0;;:21;19033:30;;;;;;19130:58;;;-1:-1:-1;;;;;23812:32:1;;;19130:58:0;;;23794:51:1;23861:18;;;;23854:34;;;19130:58:0;;;;;;;;;;23767:18:1;;;;19130:58:0;;;;;;;-1:-1:-1;;;;;19130:58:0;-1:-1:-1;;;19130:58:0;;;19119:70;;-1:-1:-1;;;;19119:10:0;;;;:70;;19130:58;19119:70;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19074:115;;;;19208:7;:57;;;;-1:-1:-1;19220:11:0;;:16;;:44;;;19251:4;19240:24;;;;;;;;;;;;:::i;:::-;19200:66;;;;;;19022:252;;18948:326;;;:::o;14:127:1:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:131;-1:-1:-1;;;;;221:31:1;;211:42;;201:70;;267:1;264;257:12;201:70;146:131;:::o;282:134::-;350:20;;379:31;350:20;379:31;:::i;421:118::-;507:5;500:13;493:21;486:5;483:32;473:60;;529:1;526;519:12;544:941;663:6;671;679;687;695;703;711;719;772:3;760:9;751:7;747:23;743:33;740:53;;;789:1;786;779:12;740:53;828:9;815:23;847:31;872:5;847:31;:::i;:::-;897:5;-1:-1:-1;954:2:1;939:18;;926:32;967:33;926:32;967:33;:::i;:::-;1019:7;-1:-1:-1;1078:2:1;1063:18;;1050:32;1091:30;1050:32;1091:30;:::i;:::-;1140:7;-1:-1:-1;1194:2:1;1179:18;;1166:32;;-1:-1:-1;1245:3:1;1230:19;;1217:33;;-1:-1:-1;1297:3:1;1282:19;;1269:33;;-1:-1:-1;1354:3:1;1339:19;;1326:33;1368;1326;1368;:::i;:::-;1420:7;1410:17;;;1474:3;1463:9;1459:19;1446:33;1436:43;;544:941;;;;;;;;;;;:::o;1743:872::-;1853:6;1861;1869;1877;1885;1893;1901;1954:3;1942:9;1933:7;1929:23;1925:33;1922:53;;;1971:1;1968;1961:12;1922:53;2007:9;1994:23;1984:33;;2064:2;2053:9;2049:18;2036:32;2026:42;;2118:2;2107:9;2103:18;2090:32;2131:31;2156:5;2131:31;:::i;:::-;2181:5;-1:-1:-1;2238:2:1;2223:18;;2210:32;2251:33;2210:32;2251:33;:::i;:::-;2303:7;-1:-1:-1;2362:3:1;2347:19;;2334:33;2376:30;2334:33;2376:30;:::i;:::-;2425:7;-1:-1:-1;2484:3:1;2469:19;;2456:33;2498;2456;2498;:::i;:::-;2550:7;2540:17;;;2604:3;2593:9;2589:19;2576:33;2566:43;;1743:872;;;;;;;;;;:::o;2620:632::-;2791:2;2843:21;;;2913:13;;2816:18;;;2935:22;;;2762:4;;2791:2;3014:15;;;;2988:2;2973:18;;;2762:4;3057:169;3071:6;3068:1;3065:13;3057:169;;;3132:13;;3120:26;;3201:15;;;;3166:12;;;;3093:1;3086:9;3057:169;;;-1:-1:-1;3243:3:1;;2620:632;-1:-1:-1;;;;;;2620:632:1:o;3257:592::-;3340:6;3348;3356;3364;3417:3;3405:9;3396:7;3392:23;3388:33;3385:53;;;3434:1;3431;3424:12;3385:53;3473:9;3460:23;3492:31;3517:5;3492:31;:::i;:::-;3542:5;-1:-1:-1;3599:2:1;3584:18;;3571:32;3612:33;3571:32;3612:33;:::i;:::-;3664:7;-1:-1:-1;3723:2:1;3708:18;;3695:32;3736:30;3695:32;3736:30;:::i;:::-;3257:592;;;;-1:-1:-1;3785:7:1;;3839:2;3824:18;3811:32;;-1:-1:-1;;3257:592:1:o;3854:523::-;3928:6;3936;3944;3997:2;3985:9;3976:7;3972:23;3968:32;3965:52;;;4013:1;4010;4003:12;3965:52;4052:9;4039:23;4071:31;4096:5;4071:31;:::i;:::-;4121:5;-1:-1:-1;4178:2:1;4163:18;;4150:32;4191:33;4150:32;4191:33;:::i;:::-;4243:7;-1:-1:-1;4302:2:1;4287:18;;4274:32;4315:30;4274:32;4315:30;:::i;:::-;4364:7;4354:17;;;3854:523;;;;;:::o;4590:388::-;4658:6;4666;4719:2;4707:9;4698:7;4694:23;4690:32;4687:52;;;4735:1;4732;4725:12;4687:52;4774:9;4761:23;4793:31;4818:5;4793:31;:::i;:::-;4843:5;-1:-1:-1;4900:2:1;4885:18;;4872:32;4913:33;4872:32;4913:33;:::i;:::-;4965:7;4955:17;;;4590:388;;;;;:::o;5292:799::-;5402:6;5410;5418;5426;5434;5442;5450;5503:3;5491:9;5482:7;5478:23;5474:33;5471:53;;;5520:1;5517;5510:12;5471:53;5559:9;5546:23;5578:31;5603:5;5578:31;:::i;:::-;5628:5;-1:-1:-1;5685:2:1;5670:18;;5657:32;5698:30;5657:32;5698:30;:::i;:::-;5747:7;-1:-1:-1;5801:2:1;5786:18;;5773:32;;-1:-1:-1;5852:2:1;5837:18;;5824:32;;-1:-1:-1;5903:3:1;5888:19;;5875:33;;-1:-1:-1;5960:3:1;5945:19;;5932:33;5974;5932;5974;:::i;6420:1010::-;6548:6;6556;6564;6572;6580;6588;6596;6604;6612;6665:3;6653:9;6644:7;6640:23;6636:33;6633:53;;;6682:1;6679;6672:12;6633:53;6721:9;6708:23;6740:31;6765:5;6740:31;:::i;:::-;6790:5;-1:-1:-1;6847:2:1;6832:18;;6819:32;6860:33;6819:32;6860:33;:::i;:::-;6912:7;-1:-1:-1;6971:2:1;6956:18;;6943:32;6984:30;6943:32;6984:30;:::i;:::-;7033:7;-1:-1:-1;7087:2:1;7072:18;;7059:32;;-1:-1:-1;7138:3:1;7123:19;;7110:33;;-1:-1:-1;7190:3:1;7175:19;;7162:33;;-1:-1:-1;7242:3:1;7227:19;;7214:33;;-1:-1:-1;7299:3:1;7284:19;;7271:33;7313;7271;7313;:::i;:::-;7365:7;7355:17;;;7419:3;7408:9;7404:19;7391:33;7381:43;;6420:1010;;;;;;;;;;;:::o;7435:456::-;7512:6;7520;7528;7581:2;7569:9;7560:7;7556:23;7552:32;7549:52;;;7597:1;7594;7587:12;7549:52;7633:9;7620:23;7610:33;;7693:2;7682:9;7678:18;7665:32;7706:31;7731:5;7706:31;:::i;:::-;7756:5;-1:-1:-1;7813:2:1;7798:18;;7785:32;7826:33;7785:32;7826:33;:::i;8159:127::-;8220:10;8215:3;8211:20;8208:1;8201:31;8251:4;8248:1;8241:15;8275:4;8272:1;8265:15;8291:275;8362:2;8356:9;8427:2;8408:13;;-1:-1:-1;;8404:27:1;8392:40;;8462:18;8447:34;;8483:22;;;8444:62;8441:88;;;8509:18;;:::i;:::-;8545:2;8538:22;8291:275;;-1:-1:-1;8291:275:1:o;8571:183::-;8631:4;8664:18;8656:6;8653:30;8650:56;;;8686:18;;:::i;:::-;-1:-1:-1;8731:1:1;8727:14;8743:4;8723:25;;8571:183::o;8759:384::-;8836:8;8846:6;8900:3;8893:4;8885:6;8881:17;8877:27;8867:55;;8918:1;8915;8908:12;8867:55;-1:-1:-1;8941:20:1;;8984:18;8973:30;;8970:50;;;9016:1;9013;9006:12;8970:50;9053:4;9045:6;9041:17;9029:29;;9116:3;9109:4;9101;9093:6;9089:17;9081:6;9077:30;9073:41;9070:50;9067:70;;;9133:1;9130;9123:12;9148:1410;9310:6;9318;9326;9334;9342;9395:3;9383:9;9374:7;9370:23;9366:33;9363:53;;;9412:1;9409;9402:12;9363:53;9452:9;9439:23;9481:18;9522:2;9514:6;9511:14;9508:34;;;9538:1;9535;9528:12;9508:34;9576:6;9565:9;9561:22;9551:32;;9621:7;9614:4;9610:2;9606:13;9602:27;9592:55;;9643:1;9640;9633:12;9592:55;9679:2;9666:16;9701:4;9725:60;9741:43;9781:2;9741:43;:::i;:::-;9725:60;:::i;:::-;9819:15;;;9901:1;9897:10;;;;9889:19;;9885:28;;;9850:12;;;;9925:19;;;9922:39;;;9957:1;9954;9947:12;9922:39;9981:11;;;;10001:142;10017:6;10012:3;10009:15;10001:142;;;10083:17;;10071:30;;10034:12;;;;10121;;;;10001:142;;;10162:5;-1:-1:-1;;10205:18:1;;10192:32;;-1:-1:-1;;10236:16:1;;;10233:36;;;10265:1;10262;10255:12;10233:36;;10304:86;10382:7;10371:8;10360:9;10356:24;10304:86;:::i;:::-;10409:8;;-1:-1:-1;10278:112:1;-1:-1:-1;10463:38:1;;-1:-1:-1;10497:2:1;10482:18;;10463:38;:::i;:::-;9148:1410;;;;-1:-1:-1;9148:1410:1;;10548:2;10533:18;10520:32;;9148:1410;-1:-1:-1;;9148:1410:1:o;10563:752::-;10615:5;10663:4;10651:9;10646:3;10642:19;10638:30;10635:50;;;10681:1;10678;10671:12;10635:50;10714:2;10708:9;10756:4;10748:6;10744:17;10827:6;10815:10;10812:22;10791:18;10779:10;10776:34;10773:62;10770:88;;;10838:18;;:::i;:::-;10874:2;10867:22;10907:6;-1:-1:-1;10907:6:1;10937:23;;10969:33;10937:23;10969:33;:::i;:::-;11011:23;;11086:2;11071:18;;11058:32;11099:33;11058:32;11099:33;:::i;:::-;11160:2;11148:15;;11141:32;11225:2;11210:18;;11197:32;11238:30;11197:32;11238:30;:::i;:::-;11296:2;11284:15;;;;11277:32;10563:752;;-1:-1:-1;;10563:752:1:o;11320:1025::-;11435:6;11443;11496:2;11484:9;11475:7;11471:23;11467:32;11464:52;;;11512:1;11509;11502:12;11464:52;11548:9;11535:23;11525:33;;11577:2;11630;11619:9;11615:18;11602:32;11657:18;11649:6;11646:30;11643:50;;;11689:1;11686;11679:12;11643:50;11712:22;;11765:4;11757:13;;11753:27;-1:-1:-1;11743:55:1;;11794:1;11791;11784:12;11743:55;11830:2;11817:16;11853:60;11869:43;11909:2;11869:43;:::i;11853:60::-;11947:15;;;12009:4;12048:11;;;12040:20;;12036:29;;;11978:12;;;;11935:3;12077:19;;;12074:39;;;12109:1;12106;12099:12;12074:39;12133:11;;;;12153:162;12169:6;12164:3;12161:15;12153:162;;;12235:37;12264:7;12259:3;12235:37;:::i;:::-;12223:50;;12186:12;;;;12293;;;;12153:162;;;12157:3;12334:5;12324:15;;;;;;;11320:1025;;;;;:::o;12350:661::-;12442:6;12450;12458;12466;12474;12527:3;12515:9;12506:7;12502:23;12498:33;12495:53;;;12544:1;12541;12534:12;12495:53;12583:9;12570:23;12602:31;12627:5;12602:31;:::i;:::-;12652:5;-1:-1:-1;12709:2:1;12694:18;;12681:32;12722:33;12681:32;12722:33;:::i;:::-;12774:7;-1:-1:-1;12833:2:1;12818:18;;12805:32;12846:30;12805:32;12846:30;:::i;:::-;12350:661;;;;-1:-1:-1;12895:7:1;;12949:2;12934:18;;12921:32;;-1:-1:-1;13000:3:1;12985:19;12972:33;;12350:661;-1:-1:-1;;12350:661:1:o;13016:156::-;13082:20;;13142:4;13131:16;;13121:27;;13111:55;;13162:1;13159;13152:12;13177:1290;13327:6;13335;13343;13351;13359;13367;13375;13383;13391;13399;13407:7;13416;13470:3;13458:9;13449:7;13445:23;13441:33;13438:53;;;13487:1;13484;13477:12;13438:53;13526:9;13513:23;13545:31;13570:5;13545:31;:::i;:::-;13595:5;-1:-1:-1;13652:2:1;13637:18;;13624:32;13665:33;13624:32;13665:33;:::i;:::-;13717:7;-1:-1:-1;13776:2:1;13761:18;;13748:32;13789:30;13748:32;13789:30;:::i;:::-;13838:7;-1:-1:-1;13892:2:1;13877:18;;13864:32;;-1:-1:-1;13943:3:1;13928:19;;13915:33;;-1:-1:-1;13995:3:1;13980:19;;13967:33;;-1:-1:-1;14052:3:1;14037:19;;14024:33;14066;14024;14066;:::i;:::-;14118:7;-1:-1:-1;14172:3:1;14157:19;;14144:33;;-1:-1:-1;14229:3:1;14214:19;;14201:33;14243:30;14201:33;14243:30;:::i;:::-;14292:7;-1:-1:-1;14318:37:1;14350:3;14335:19;;14318:37;:::i;:::-;14308:47;;14403:3;14392:9;14388:19;14375:33;14364:44;;14456:3;14445:9;14441:19;14428:33;14417:44;;13177:1290;;;;;;;;;;;;;;:::o;14472:816::-;14618:6;14626;14634;14642;14650;14658;14711:3;14699:9;14690:7;14686:23;14682:33;14679:53;;;14728:1;14725;14718:12;14679:53;14764:9;14751:23;14741:33;;14821:2;14810:9;14806:18;14793:32;14783:42;;14876:2;14865:9;14861:18;14848:32;14903:18;14895:6;14892:30;14889:50;;;14935:1;14932;14925:12;14889:50;14974:84;15050:7;15041:6;15030:9;15026:22;14974:84;:::i;:::-;15077:8;;-1:-1:-1;14948:110:1;-1:-1:-1;;15162:2:1;15147:18;;15134:32;15175:31;15134:32;15175:31;:::i;:::-;15225:5;15215:15;;;15277:3;15266:9;15262:19;15249:33;15239:43;;14472:816;;;;;;;;:::o;15293:1146::-;15434:6;15442;15450;15458;15466;15474;15482;15490;15498;15506;15514:7;15568:3;15556:9;15547:7;15543:23;15539:33;15536:53;;;15585:1;15582;15575:12;15536:53;15624:9;15611:23;15643:31;15668:5;15643:31;:::i;:::-;15693:5;-1:-1:-1;15750:2:1;15735:18;;15722:32;15763:30;15722:32;15763:30;:::i;:::-;15812:7;-1:-1:-1;15866:2:1;15851:18;;15838:32;;-1:-1:-1;15917:2:1;15902:18;;15889:32;;-1:-1:-1;15968:3:1;15953:19;;15940:33;;-1:-1:-1;16025:3:1;16010:19;;15997:33;16039;15997;16039;:::i;:::-;16091:7;-1:-1:-1;16145:3:1;16130:19;;16117:33;;-1:-1:-1;16202:3:1;16187:19;;16174:33;16216:30;16174:33;16216:30;:::i;:::-;16265:7;-1:-1:-1;16291:37:1;16323:3;16308:19;;16291:37;:::i;:::-;16281:47;;16375:3;16364:9;16360:19;16347:33;16337:43;;16428:3;16417:9;16413:19;16400:33;16389:44;;15293:1146;;;;;;;;;;;;;;:::o;16444:247::-;16503:6;16556:2;16544:9;16535:7;16531:23;16527:32;16524:52;;;16572:1;16569;16562:12;16524:52;16611:9;16598:23;16630:31;16655:5;16630:31;:::i;16888:747::-;17025:6;17033;17041;17049;17057;17110:3;17098:9;17089:7;17085:23;17081:33;17078:53;;;17127:1;17124;17117:12;17078:53;17163:9;17150:23;17140:33;;17224:2;17213:9;17209:18;17196:32;17251:18;17243:6;17240:30;17237:50;;;17283:1;17280;17273:12;17237:50;17322:84;17398:7;17389:6;17378:9;17374:22;17322:84;:::i;:::-;17425:8;;-1:-1:-1;17296:110:1;-1:-1:-1;;17510:2:1;17495:18;;17482:32;17523:31;17482:32;17523:31;:::i;17861:345::-;18063:2;18045:21;;;18102:2;18082:18;;;18075:30;-1:-1:-1;;;18136:2:1;18121:18;;18114:51;18197:2;18182:18;;17861:345::o;18591:245::-;18658:6;18711:2;18699:9;18690:7;18686:23;18682:32;18679:52;;;18727:1;18724;18717:12;18679:52;18759:9;18753:16;18778:28;18800:5;18778:28;:::i;18841:245::-;18920:6;18928;18981:2;18969:9;18960:7;18956:23;18952:32;18949:52;;;18997:1;18994;18987:12;18949:52;-1:-1:-1;;19020:16:1;;19076:2;19061:18;;;19055:25;19020:16;;19055:25;;-1:-1:-1;18841:245:1:o;19091:399::-;19293:2;19275:21;;;19332:2;19312:18;;;19305:30;19371:34;19366:2;19351:18;;19344:62;-1:-1:-1;;;19437:2:1;19422:18;;19415:33;19480:3;19465:19;;19091:399::o;19495:::-;19697:2;19679:21;;;19736:2;19716:18;;;19709:30;19775:34;19770:2;19755:18;;19748:62;-1:-1:-1;;;19841:2:1;19826:18;;19819:33;19884:3;19869:19;;19495:399::o;19899:127::-;19960:10;19955:3;19951:20;19948:1;19941:31;19991:4;19988:1;19981:15;20015:4;20012:1;20005:15;20031:127;20092:10;20087:3;20083:20;20080:1;20073:31;20123:4;20120:1;20113:15;20147:4;20144:1;20137:15;20163:125;20203:4;20231:1;20228;20225:8;20222:34;;;20236:18;;:::i;:::-;-1:-1:-1;20273:9:1;;20163:125::o;20293:404::-;20495:2;20477:21;;;20534:2;20514:18;;;20507:30;20573:34;20568:2;20553:18;;20546:62;-1:-1:-1;;;20639:2:1;20624:18;;20617:38;20687:3;20672:19;;20293:404::o;20702:385::-;-1:-1:-1;;;;;20954:15:1;;;20936:34;;21006:15;;;;21001:2;20986:18;;20979:43;21065:14;;21058:22;21053:2;21038:18;;21031:50;20886:2;20871:18;;20702:385::o;21092:251::-;21162:6;21215:2;21203:9;21194:7;21190:23;21186:32;21183:52;;;21231:1;21228;21221:12;21183:52;21263:9;21257:16;21282:31;21307:5;21282:31;:::i;21348:184::-;21418:6;21471:2;21459:9;21450:7;21446:23;21442:32;21439:52;;;21487:1;21484;21477:12;21439:52;-1:-1:-1;21510:16:1;;21348:184;-1:-1:-1;21348:184:1:o;21537:168::-;21577:7;21643:1;21639;21635:6;21631:14;21628:1;21625:21;21620:1;21613:9;21606:17;21602:45;21599:71;;;21650:18;;:::i;:::-;-1:-1:-1;21690:9:1;;21537:168::o;21710:217::-;21750:1;21776;21766:132;;21820:10;21815:3;21811:20;21808:1;21801:31;21855:4;21852:1;21845:15;21883:4;21880:1;21873:15;21766:132;-1:-1:-1;21912:9:1;;21710:217::o;24178:188::-;24257:13;;-1:-1:-1;;;;;24299:42:1;;24289:53;;24279:81;;24356:1;24353;24346:12;24371:450;24458:6;24466;24474;24527:2;24515:9;24506:7;24502:23;24498:32;24495:52;;;24543:1;24540;24533:12;24495:52;24566:40;24596:9;24566:40;:::i;:::-;24556:50;;24625:49;24670:2;24659:9;24655:18;24625:49;:::i;:::-;24615:59;;24717:2;24706:9;24702:18;24696:25;24761:10;24754:5;24750:22;24743:5;24740:33;24730:61;;24787:1;24784;24777:12;24826:241;24882:6;24935:2;24923:9;24914:7;24910:23;24906:32;24903:52;;;24951:1;24948;24941:12;24903:52;24990:9;24977:23;25009:28;25031:5;25009:28;:::i;25072:222::-;25153:6;25206:2;25194:9;25185:7;25181:23;25177:32;25174:52;;;25222:1;25219;25212:12;25174:52;25245:43;25280:7;25269:9;25245:43;:::i;25299:350::-;25501:2;25483:21;;;25540:2;25520:18;;;25513:30;25579:28;25574:2;25559:18;;25552:56;25640:2;25625:18;;25299:350::o;25654:128::-;25694:3;25725:1;25721:6;25718:1;25715:13;25712:39;;;25731:18;;:::i;:::-;-1:-1:-1;25767:9:1;;25654:128::o;25787:135::-;25826:3;-1:-1:-1;;25847:17:1;;25844:43;;;25867:18;;:::i;:::-;-1:-1:-1;25914:1:1;25903:13;;25787:135::o;25927:670::-;-1:-1:-1;;;;;26294:15:1;;;26276:34;;26346:15;;;;26341:2;26326:18;;26319:43;26393:2;26378:18;;26371:34;;;;26436:2;26421:18;;26414:34;;;;26497:4;26485:17;26479:3;26464:19;;26457:46;26256:3;26519:19;;26512:35;26578:3;26563:19;;26556:35;;;;26225:3;26210:19;;25927:670::o;26784:258::-;26856:1;26866:113;26880:6;26877:1;26874:13;26866:113;;;26956:11;;;26950:18;26937:11;;;26930:39;26902:2;26895:10;26866:113;;;26997:6;26994:1;26991:13;26988:48;;;-1:-1:-1;;27032:1:1;27014:16;;27007:27;26784:258::o;27047:274::-;27176:3;27214:6;27208:13;27230:53;27276:6;27271:3;27264:4;27256:6;27252:17;27230:53;:::i;:::-;27299:16;;;;;27047:274;-1:-1:-1;;27047:274:1:o;27326:624::-;27557:6;27546:9;27539:25;27600:6;27595:2;27584:9;27580:18;27573:34;27672:1;27668;27663:3;27659:11;27655:19;27647:6;27643:32;27638:2;27627:9;27623:18;27616:60;27712:3;27707:2;27696:9;27692:18;27685:31;27520:4;27745:6;27739:13;27789:6;27783:3;27772:9;27768:19;27761:35;27805:67;27865:6;27859:3;27848:9;27844:19;27839:2;27831:6;27827:15;27805:67;:::i;:::-;27933:2;27912:15;-1:-1:-1;;27908:29:1;27893:45;;;;27940:3;27889:55;;27326:624;-1:-1:-1;;;;;27326:624:1:o

Swarm Source

ipfs://e6efa68269e8b49fe415e3d43f111437355d5066d7adbf8137894a015eaa750f

Block Transaction Gas Used Reward
view all blocks produced

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

Validator Index Block Amount
View All Withdrawals

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

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