MON Price: $0.018847 (+2.88%)

Contract

0xfc9869eF6E04e8dcF09234Ad0bC48a6f78a493cC

Overview

MON Balance

Monad Chain LogoMonad Chain LogoMonad Chain Logo0 MON

MON Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Add Liquidity ET...484706892026-01-13 15:56:0011 days ago1768319760IN
0xfc9869eF...f78a493cC
0.01 MON0.47046584126.5625
Add Liquidity ET...484705072026-01-13 15:54:4711 days ago1768319687IN
0xfc9869eF...f78a493cC
0.01 MON0.37916062102
Add Liquidity ET...484704642026-01-13 15:54:3011 days ago1768319670IN
0xfc9869eF...f78a493cC
0.01 MON0.47047343126.5625
Add Liquidity ET...484703102026-01-13 15:53:2811 days ago1768319608IN
0xfc9869eF...f78a493cC
0.01 MON0.37173247100.0001
Add Liquidity ET...484700072026-01-13 15:51:2611 days ago1768319486IN
0xfc9869eF...f78a493cC
0.01 MON0.37916674102
Add Liquidity ET...484679632026-01-13 15:37:4711 days ago1768318667IN
0xfc9869eF...f78a493cC
0.01 MON0.38092481102

Latest 6 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
484706892026-01-13 15:56:0011 days ago1768319760
0xfc9869eF...f78a493cC
0.01 MON
484705072026-01-13 15:54:4711 days ago1768319687
0xfc9869eF...f78a493cC
0.01 MON
484704642026-01-13 15:54:3011 days ago1768319670
0xfc9869eF...f78a493cC
0.01 MON
484703102026-01-13 15:53:2811 days ago1768319608
0xfc9869eF...f78a493cC
0.01 MON
484700072026-01-13 15:51:2611 days ago1768319486
0xfc9869eF...f78a493cC
0.01 MON
484679632026-01-13 15:37:4711 days ago1768318667
0xfc9869eF...f78a493cC
0.01 MON
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x26CEb692...A103fc474
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
DyorRouterV2

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 20000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at monadscan.com on 2025-11-24
*/

/**
 *Submitted for verification at BscScan.com on 2021-04-23
*/

// File: @uniswap\lib\contracts\libraries\TransferHelper.sol

pragma solidity >=0.6.0;

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

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

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

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


pragma solidity >=0.6.2;

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

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

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


pragma solidity >=0.6.2;

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

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


pragma solidity >=0.5.0;

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

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

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

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

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

    function INIT_CODE_PAIR_HASH() external view returns (bytes32);
}

// File: contracts\libraries\SafeMath.sol

pragma solidity =0.6.6;

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

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

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

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


pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}


pragma solidity >=0.5.0;



library DyorLibrary {
    using SafeMath for uint;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'DyorLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'DyorLibrary: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal view returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair  =  IDyorFactory(factory).getPair(token0, token1);

        // = address(uint(keccak256(abi.encodePacked(
        //         hex'ff',
        //         factory,
        //          (abi.encodePacked(token0, token1)),
        //         hex'e18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303' // init code hash
        //     ))));
    }

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

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

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'DyorLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'DyorLibrary: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(9970);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(10000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'DyorLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'DyorLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(10000);
        uint denominator = reserveOut.sub(amountOut).mul(9970);
        amountIn = (numerator / denominator).add(1);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'DyorLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[0] = amountIn;
        for (uint i; i < path.length - 1; i++) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]);
            amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
        }
    }

    // performs chained getAmountIn calculations on any number of pairs
    function getAmountsIn(address factory, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'DyorLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint i = path.length - 1; i > 0; i--) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

// File: contracts\interfaces\IERC20.sol

pragma solidity >=0.5.0;

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

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

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

// File: contracts\interfaces\IWETH.sol

pragma solidity >=0.5.0;

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


pragma solidity =0.6.6;



contract DyorRouterV2 is IDyorRouter02 {
    using SafeMath for uint;

    address public feeTo;
    address public feeToSetter;
    uint256 public ratePercent = 40;
    address public immutable override factory;
    address public immutable override WETH;
    mapping(address => bool) public feeCurrency;

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

    constructor(address _factory, address _WETH, address _feeToSetter , address _feeTo) public {
        factory = _factory;
        WETH = _WETH;
        feeCurrency[_WETH] = true;
        feeTo=_feeTo;
        feeToSetter = _feeToSetter;
    }

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

    function setFeeTo(address _feeTo) external {
        require(msg.sender == feeToSetter, 'DyorRouterV2: FORBIDDEN');
        feeTo = _feeTo;
    }

    function setFeeToSetter(address _feeToSetter) external {
        require(msg.sender == feeToSetter, 'DyorRouterV2: FORBIDDEN');
        feeToSetter = _feeToSetter;
    }

    function setFeeCurrencyList(address [] calldata currencyList,  bool fee) external {
        require(msg.sender == feeToSetter, 'DyorRouterV2: FORBIDDEN');
        for(uint i; i < currencyList.length; i++){
            feeCurrency[currencyList[i]] = fee;
        }
    }

    function setFeeCurrency(address currency, bool fee) external {
        require(msg.sender == feeToSetter, 'DyorRouterV2: FORBIDDEN');
        feeCurrency[currency] = fee;
    }

    function setRatePercent(uint256 _ratePercent) external {
        require(msg.sender == feeToSetter, 'DyorRouterV2: FORBIDDEN');
        ratePercent = _ratePercent;
    }

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (IDyorFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IDyorFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = DyorLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = DyorLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'DyorRouterV2: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = DyorLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'DyorRouterV2: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = DyorLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IDyorPair(pair).mint(to);
    }
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = DyorLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IDyorPair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = DyorLibrary.pairFor(factory, tokenA, tokenB);
        IDyorPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IDyorPair(pair).burn(to);
        (address token0,) = DyorLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'DyorRouterV2: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'DyorRouterV2: INSUFFICIENT_B_AMOUNT');
    }
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountA, uint amountB) {
        address pair = DyorLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IDyorPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountToken, uint amountETH) {
        address pair = DyorLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IDyorPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountETH) {
        (, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountETH) {
        address pair = DyorLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IDyorPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token, liquidity, amountTokenMin, amountETHMin, to, deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = DyorLibrary.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? DyorLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IDyorPair(DyorLibrary.pairFor(factory, input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = DyorLibrary.getAmountsOut(factory, amountIn, path);
        _swapExactTokensForTokensSupportingFeeOnTransferTokens(amountIn, amountOutMin, path, to);
    }

    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = DyorLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'DyorRouterV2: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, DyorLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        amounts = DyorLibrary.getAmountsOut(factory, msg.value, path);
        _swapExactETHForTokensSupportingFeeOnTransferTokens(amountOutMin , path, to);
    }

    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'DyorRouterV2: INVALID_PATH');
        amounts = DyorLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'DyorRouterV2: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, DyorLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        amounts = DyorLibrary.getAmountsOut(factory, amountIn, path);
        _swapExactTokensForETHSupportingFeeOnTransferTokens(amountIn, amountOutMin, path, to);
    }

    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'DyorRouterV2: INVALID_PATH');
        amounts = DyorLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'DyorRouterV2: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(DyorLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = DyorLibrary.sortTokens(input, output);
            IDyorPair pair = IDyorPair(DyorLibrary.pairFor(factory, input, output));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
            (uint reserve0, uint reserve1,) = pair.getReserves();
            (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
            amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = DyorLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }

            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? DyorLibrary.pairFor(factory, output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }

    function _swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] memory path,
        address to
    ) internal {

        uint fee;
        bool isFeeCurrency;
        address recipient = address(this);
        // bool startFee = feeCurrency[path[0]] || feeCurrency[path[path.length - 1]];
        if(ratePercent > 0 && feeTo != address(0) && (feeCurrency[path[0]] || feeCurrency[path[path.length - 1]])){
            if(feeCurrency[path[0]]){
                fee = amountIn * ratePercent / 10000;
                TransferHelper.safeTransferFrom( path[0], msg.sender, address(this) , amountIn);
                TransferHelper.safeTransfer(path[0], feeTo, fee);
                TransferHelper.safeTransfer(path[0],  DyorLibrary.pairFor(factory, path[0], path[1]), amountIn - fee);
                isFeeCurrency = true;
                recipient = to;
            }
        }else{
            recipient = to;
        }
        if(!isFeeCurrency){
            TransferHelper.safeTransferFrom( path[0], msg.sender, DyorLibrary.pairFor(factory, path[0], path[1]), amountIn - fee );
        }
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, recipient);

        if(ratePercent > 0 &&  feeTo != address(0) && (feeCurrency[path[0]] || feeCurrency[path[path.length - 1]])){
            if(!feeCurrency[path[0]]){
                uint balance = IERC20(path[path.length - 1]).balanceOf(recipient);
                fee = balance * ratePercent / 10000;
                TransferHelper.safeTransfer(path[path.length - 1], to,  balance - fee);
                TransferHelper.safeTransfer(path[path.length - 1], feeTo, fee);
            }
        }
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'DyorRouterV2: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        _swapExactTokensForTokensSupportingFeeOnTransferTokens(amountIn, amountOutMin, path, to);
    }

    function _swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] memory path,
        address to
    )  internal {
        require(path[0] == WETH, 'DyorRouterV2: INVALID_PATH');
        uint amountIn = msg.value;
        uint fee = 0;
        if(ratePercent > 0 &&  feeTo != address(0)){
            fee = amountIn * ratePercent / 10000;
            TransferHelper.safeTransferETH( feeTo, fee);
        }
        IWETH(WETH).deposit{value: amountIn - fee}();
        assert(IWETH(WETH).transfer(DyorLibrary.pairFor(factory, path[0], path[1]), amountIn - fee));
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens( path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'DyorRouterV2: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external  virtual override payable ensure(deadline) {
        _swapExactETHForTokensSupportingFeeOnTransferTokens(amountOutMin , path, to);
    }

    function _swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] memory path,
        address to
    )  internal {
        require(path[path.length - 1] == WETH, 'DyorRouterV2: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, DyorLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(  path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        IWETH(WETH).withdraw(amountOut);
        uint fee = 0;
        if(ratePercent > 0 && feeTo != address(0)){
            fee = amountOut * ratePercent / 10000;
            TransferHelper.safeTransferETH( feeTo, fee);
        }
        require(amountOut - fee >= amountOutMin, 'DyorRouterV2: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferETH(to, amountOut - fee);

    }

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        _swapExactTokensForETHSupportingFeeOnTransferTokens(amountIn, amountOutMin, path, to);
    }

    // **** LIBRARY FUNCTIONS ****
    function quote(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) {
        return DyorLibrary.quote(amountA, reserveA, reserveB);
    }

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

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

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

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"},{"internalType":"address","name":"_feeToSetter","type":"address"},{"internalType":"address","name":"_feeTo","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feeCurrency","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeToSetter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"ratePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"},{"internalType":"bool","name":"fee","type":"bool"}],"name":"setFeeCurrency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"currencyList","type":"address[]"},{"internalType":"bool","name":"fee","type":"bool"}],"name":"setFeeCurrencyList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTo","type":"address"}],"name":"setFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeToSetter","type":"address"}],"name":"setFeeToSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ratePercent","type":"uint256"}],"name":"setRatePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

0x60c0604052602860025534801561001557600080fd5b50604051620052d4380380620052d48339818101604052608081101561003a57600080fd5b5080516020808301516040808501516060958601516001600160601b031995871b86166080529583901b90941660a0526001600160a01b03918216600090815260039093528220805460ff1916600190811790915582549482166001600160a01b031995861617909255815492169190921617905560805160601c60a05160601c615106620001ce600039806102125280610f9e5280610fd9528061145952806116a4528061185a5280611e115280611e9e5280611f6652806123a35280612719528061276f52806127a352806128175280612a625280612bb75280612c3f52806132d5528061342852806134d8528061416e528061425752806142cd5250806110ec528061119952806111d2528061135c528061151752806115eb52806118385280611b6b5280611c7952806120e95280612313528061233c52806123815280612537528061274d5280612b075280612c71528061338e528061395e52806139d95280613fe8528061401e52806142ff528061480a52806148d152806149515280614c5b5280614de152506151066000f3fe6080604052600436106102025760003560e01c806385f8c2591161011d578063c45a0155116100b0578063e8e337001161007f578063f305d71911610064578063f305d71914610e31578063f46901ed14610e77578063fb3bdb4114610eaa5761023b565b8063e8e3370014610d76578063ed31db6014610df65761023b565b8063c45a015514610bf0578063d06ca61f14610c05578063d50c552a14610cbc578063ded9382a14610d035761023b565b8063ad615dec116100ec578063ad615dec14610a84578063af2979eb14610aba578063b6f9de9514610b0d578063baa2abde14610b935761023b565b806385f8c2591461096e5780638803dbee146109a4578063a2e74af614610a3c578063ad5c464814610a6f5761023b565b806338ed1739116101955780635c11d795116101645780635c11d7951461078e5780635ccfe6e314610826578063791ac947146108505780637ff36ab5146108e85761023b565b806338ed17391461056c5780634a25d94a146106045780634f3122ed1461069c5780635b0d59841461071b5761023b565b806318cbafe5116101d157806318cbafe51461033a5780631f00ca74146104225780632195995c146104d957806324fd2272146105575761023b565b8063017e7e581461024057806302751cec14610271578063054d50d4146102dd578063094b7415146103255761023b565b3661023b57336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461023957fe5b005b600080fd5b34801561024c57600080fd5b50610255610f30565b604080516001600160a01b039092168252519081900360200190f35b34801561027d57600080fd5b506102c4600480360360c081101561029457600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610f3f565b6040805192835260208301919091528051918290030190f35b3480156102e957600080fd5b506103136004803603606081101561030057600080fd5b508035906020810135906040013561106b565b60408051918252519081900360200190f35b34801561033157600080fd5b50610255611080565b34801561034657600080fd5b506103d2600480360360a081101561035d57600080fd5b81359160208101359181019060608101604082013564010000000081111561038457600080fd5b82018360208201111561039657600080fd5b803590602001918460208302840111640100000000831117156103b857600080fd5b91935091506001600160a01b03813516906020013561108f565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561040e5781810151838201526020016103f6565b505050509050019250505060405180910390f35b34801561042e57600080fd5b506103d26004803603604081101561044557600080fd5b8135919081019060408101602082013564010000000081111561046757600080fd5b82018360208201111561047957600080fd5b8035906020019184602083028401116401000000008311171561049b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611192945050505050565b3480156104e557600080fd5b506102c460048036036101608110156104fd57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff61010082013516906101208101359061014001356111c8565b34801561056357600080fd5b506103136112f9565b34801561057857600080fd5b506103d2600480360360a081101561058f57600080fd5b8135916020810135918101906060810160408201356401000000008111156105b657600080fd5b8201836020820111156105c857600080fd5b803590602001918460208302840111640100000000831117156105ea57600080fd5b91935091506001600160a01b0381351690602001356112ff565b34801561061057600080fd5b506103d2600480360360a081101561062757600080fd5b81359160208101359181019060608101604082013564010000000081111561064e57600080fd5b82018360208201111561066057600080fd5b8035906020019184602083028401116401000000008311171561068257600080fd5b91935091506001600160a01b0381351690602001356113f7565b3480156106a857600080fd5b50610239600480360360408110156106bf57600080fd5b8101906020810181356401000000008111156106da57600080fd5b8201836020820111156106ec57600080fd5b8035906020019184602083028401116401000000008311171561070e57600080fd5b9193509150351515611758565b34801561072757600080fd5b50610313600480360361014081101561073f57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611830565b34801561079a57600080fd5b50610239600480360360a08110156107b157600080fd5b8135916020810135918101906060810160408201356401000000008111156107d857600080fd5b8201836020820111156107ea57600080fd5b8035906020019184602083028401116401000000008311171561080c57600080fd5b91935091506001600160a01b038135169060200135611975565b34801561083257600080fd5b506102396004803603602081101561084957600080fd5b5035611a14565b34801561085c57600080fd5b50610239600480360360a081101561087357600080fd5b81359160208101359181019060608101604082013564010000000081111561089a57600080fd5b8201836020820111156108ac57600080fd5b803590602001918460208302840111640100000000831117156108ce57600080fd5b91935091506001600160a01b038135169060200135611a78565b6103d2600480360360808110156108fe57600080fd5b8135919081019060408101602082013564010000000081111561092057600080fd5b82018360208201111561093257600080fd5b8035906020019184602083028401116401000000008311171561095457600080fd5b91935091506001600160a01b038135169060200135611b0e565b34801561097a57600080fd5b506103136004803603606081101561099157600080fd5b5080359060208101359060400135611c0f565b3480156109b057600080fd5b506103d2600480360360a08110156109c757600080fd5b8135916020810135918101906060810160408201356401000000008111156109ee57600080fd5b820183602082011115610a0057600080fd5b80359060200191846020830284011164010000000083111715610a2257600080fd5b91935091506001600160a01b038135169060200135611c1c565b348015610a4857600080fd5b5061023960048036036020811015610a5f57600080fd5b50356001600160a01b0316611d76565b348015610a7b57600080fd5b50610255611e0f565b348015610a9057600080fd5b5061031360048036036060811015610aa757600080fd5b5080359060208101359060400135611e33565b348015610ac657600080fd5b50610313600480360360c0811015610add57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611e40565b61023960048036036080811015610b2357600080fd5b81359190810190604081016020820135640100000000811115610b4557600080fd5b820183602082011115610b5757600080fd5b80359060200191846020830284011164010000000083111715610b7957600080fd5b91935091506001600160a01b038135169060200135611fec565b348015610b9f57600080fd5b506102c4600480360360e0811015610bb657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612089565b348015610bfc57600080fd5b50610255612311565b348015610c1157600080fd5b506103d260048036036040811015610c2857600080fd5b81359190810190604081016020820135640100000000811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b80359060200191846020830284011164010000000083111715610c7e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612335945050505050565b348015610cc857600080fd5b50610cef60048036036020811015610cdf57600080fd5b50356001600160a01b0316612362565b604080519115158252519081900360200190f35b348015610d0f57600080fd5b506102c46004803603610140811015610d2757600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612377565b348015610d8257600080fd5b50610dd86004803603610100811015610d9a57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e001356124c2565b60408051938452602084019290925282820152519081900360600190f35b348015610e0257600080fd5b5061023960048036036040811015610e1957600080fd5b506001600160a01b0381351690602001351515612610565b610dd8600480360360c0811015610e4757600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356126b8565b348015610e8357600080fd5b5061023960048036036020811015610e9a57600080fd5b50356001600160a01b031661296f565b6103d260048036036080811015610ec057600080fd5b81359190810190604081016020820135640100000000811115610ee257600080fd5b820183602082011115610ef457600080fd5b80359060200191846020830284011164010000000083111715610f1657600080fd5b91935091506001600160a01b038135169060200135612a08565b6000546001600160a01b031681565b6000808242811015610f98576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b610fc7897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612089565b9093509150610fd7898685612dcb565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561103d57600080fd5b505af1158015611051573d6000803e3d6000fd5b5050505061105f8583612f81565b50965096945050505050565b6000611078848484613097565b949350505050565b6001546001600160a01b031681565b606081428110156110e7576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b6111457f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061318792505050565b915061118788888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a92506132d3915050565b509695505050505050565b60606111bf7f000000000000000000000000000000000000000000000000000000000000000084846135d2565b90505b92915050565b60008060006111f87f00000000000000000000000000000000000000000000000000000000000000008f8f613746565b9050600087611207578c611229565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156112b857600080fd5b505af11580156112cc573d6000803e3d6000fd5b505050506112df8f8f8f8f8f8f8f612089565b809450819550505050509b509b9950505050505050505050565b60025481565b60608142811015611357576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b6113b57f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061318792505050565b915061118788888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a92506137fb915050565b6060814281101561144f576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181106114a757fe5b905060200201356001600160a01b03166001600160a01b031614611512576040805162461bcd60e51b815260206004820152601a60248201527f44796f72526f7574657256323a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b6115707f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506135d292505050565b9150868260008151811061158057fe5b602002602001015111156115c55760405162461bcd60e51b81526004018080602001828103825260248152602001806150196024913960400191505060405180910390fd5b611663868660008181106115d557fe5b905060200201356001600160a01b0316336116497f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061161757fe5b905060200201356001600160a01b03168b8b600181811061163457fe5b905060200201356001600160a01b0316613746565b8560008151811061165657fe5b6020026020010151613d98565b6116a282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613f39915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836001855103815181106116e157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561171f57600080fd5b505af1158015611733573d6000803e3d6000fd5b50505050611187848360018551038151811061174b57fe5b6020026020010151612f81565b6001546001600160a01b031633146117b7576040805162461bcd60e51b815260206004820152601760248201527f44796f72526f7574657256323a20464f5242494444454e000000000000000000604482015290519081900360640190fd5b60005b8281101561182a5781600360008686858181106117d357fe5b602090810292909201356001600160a01b031683525081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556001016117ba565b50505050565b60008061187e7f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613746565b905060008661188d578b6118af565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561193e57600080fd5b505af1158015611952573d6000803e3d6000fd5b505050506119648d8d8d8d8d8d611e40565b9d9c50505050505050505050505050565b80428110156119cb576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b611a0b87878787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506137fb915050565b50505050505050565b6001546001600160a01b03163314611a73576040805162461bcd60e51b815260206004820152601760248201527f44796f72526f7574657256323a20464f5242494444454e000000000000000000604482015290519081900360640190fd5b600255565b8042811015611ace576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b611a0b87878787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506132d3915050565b60608142811015611b66576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b611bc47f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061318792505050565b9150611c058787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061416c915050565b5095945050505050565b600061107884848461451a565b60608142811015611c74576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b611cd27f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506135d292505050565b91508682600081518110611ce257fe5b60200260200101511115611d275760405162461bcd60e51b81526004018080602001828103825260248152602001806150196024913960400191505060405180910390fd5b611d37868660008181106115d557fe5b61118782878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613f39915050565b6001546001600160a01b03163314611dd5576040805162461bcd60e51b815260206004820152601760248201527f44796f72526f7574657256323a20464f5242494444454e000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061107884848461460a565b60008142811015611e98576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b611ec7887f00000000000000000000000000000000000000000000000000000000000000008989893089612089565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051919450611f6492508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015611f3357600080fd5b505afa158015611f47573d6000803e3d6000fd5b505050506040513d6020811015611f5d57600080fd5b5051612dcb565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611fca57600080fd5b505af1158015611fde573d6000803e3d6000fd5b505050506111878483612f81565b8042811015612042576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b6120818686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525088925061416c915050565b505050505050565b60008082428110156120e2576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b600061210f7f00000000000000000000000000000000000000000000000000000000000000008c8c613746565b604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561218357600080fd5b505af1158015612197573d6000803e3d6000fd5b505050506040513d60208110156121ad57600080fd5b5050604080517f89afcb440000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561221357600080fd5b505af1158015612227573d6000803e3d6000fd5b505050506040513d604081101561223d57600080fd5b508051602090910151909250905060006122578e8e6146cc565b509050806001600160a01b03168e6001600160a01b03161461227a57818361227d565b82825b90975095508a8710156122c15760405162461bcd60e51b8152600401808060200182810382526023815260200180614fd36023913960400191505060405180910390fd5b898610156123005760405162461bcd60e51b8152600401808060200182810382526023815260200180614fb06023913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111bf7f00000000000000000000000000000000000000000000000000000000000000008484613187565b60036020526000908152604090205460ff1681565b60008060006123c77f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613746565b90506000876123d6578c6123f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561248757600080fd5b505af115801561249b573d6000803e3d6000fd5b505050506124ad8e8e8e8e8e8e610f3f565b909f909e509c50505050505050505050505050565b6000806000834281101561251d576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b61252b8c8c8c8c8c8c6147c0565b9094509250600061255d7f00000000000000000000000000000000000000000000000000000000000000008e8e613746565b905061256b8d338388613d98565b6125778c338387613d98565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156125cf57600080fd5b505af11580156125e3573d6000803e3d6000fd5b505050506040513d60208110156125f957600080fd5b5051949d939c50939a509198505050505050505050565b6001546001600160a01b0316331461266f576040805162461bcd60e51b815260206004820152601760248201527f44796f72526f7574657256323a20464f5242494444454e000000000000000000604482015290519081900360640190fd5b6001600160a01b0391909116600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60008060008342811015612713576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b6127418a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c6147c0565b909450925060006127937f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613746565b90506127a18b338388613d98565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156127fc57600080fd5b505af1158015612810573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561289557600080fd5b505af11580156128a9573d6000803e3d6000fd5b505050506040513d60208110156128bf57600080fd5b50516128c757fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561291f57600080fd5b505af1158015612933573d6000803e3d6000fd5b505050506040513d602081101561294957600080fd5b50519250348410156129615761296133853403612f81565b505096509650969350505050565b6001546001600160a01b031633146129ce576040805162461bcd60e51b815260206004820152601760248201527f44796f72526f7574657256323a20464f5242494444454e000000000000000000604482015290519081900360640190fd5b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60608142811015612a60576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612a9757fe5b905060200201356001600160a01b03166001600160a01b031614612b02576040805162461bcd60e51b815260206004820152601a60248201527f44796f72526f7574657256323a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b612b607f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506135d292505050565b91503482600081518110612b7057fe5b60200260200101511115612bb55760405162461bcd60e51b81526004018080602001828103825260248152602001806150196024913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612bf157fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612c2457600080fd5b505af1158015612c38573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612cba7f000000000000000000000000000000000000000000000000000000000000000089896000818110612c9d57fe5b905060200201356001600160a01b03168a8a600181811061163457fe5b84600081518110612cc757fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612d1e57600080fd5b505af1158015612d32573d6000803e3d6000fd5b505050506040513d6020811015612d4857600080fd5b5051612d5057fe5b612d8f82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613f39915050565b81600081518110612d9c57fe5b6020026020010151341115611c0557611c053383600081518110612dbc57fe5b60200260200101513403612f81565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310612e9457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612e57565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612ef6576040519150601f19603f3d011682016040523d82523d6000602084013e612efb565b606091505b5091509150818015612f29575080511580612f295750808060200190516020811015612f2657600080fd5b50515b612f7a576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b60208310612feb57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612fae565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461304d576040519150601f19603f3d011682016040523d82523d6000602084013e613052565b606091505b50509050806130925760405162461bcd60e51b81526004018080602001828103825260238152602001806150646023913960400191505060405180910390fd5b505050565b60008084116130d75760405162461bcd60e51b81526004018080602001828103825260268152602001806150876026913960400191505060405180910390fd5b6000831180156130e75750600082115b6131225760405162461bcd60e51b8152600401808060200182810382526023815260200180614ff66023913960400191505060405180910390fd5b6000613136856126f263ffffffff614a6616565b9050600061314a828563ffffffff614a6616565b90506000613170836131648861271063ffffffff614a6616565b9063ffffffff614ad216565b905080828161317b57fe5b04979650505050505050565b60606002825110156131e0576040805162461bcd60e51b815260206004820152601960248201527f44796f724c6962726172793a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b815167ffffffffffffffff811180156131f857600080fd5b50604051908082528060200260200182016040528015613222578160200160208202803683370190505b509050828160008151811061323357fe5b60200260200101818152505060005b60018351038110156132cb576000806132858786858151811061326157fe5b602002602001015187866001018151811061327857fe5b6020026020010151614b2a565b915091506132a784848151811061329857fe5b60200260200101518383613097565b8484600101815181106132b657fe5b60209081029190910101525050600101613242565b509392505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168260018451038151811061330d57fe5b60200260200101516001600160a01b031614613370576040805162461bcd60e51b815260206004820152601a60248201527f44796f72526f7574657256323a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b6133e28260008151811061338057fe5b6020026020010151336133dc7f0000000000000000000000000000000000000000000000000000000000000000866000815181106133ba57fe5b6020026020010151876001815181106133cf57fe5b6020026020010151613746565b87613d98565b6133ec8230614c04565b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b15801561346f57600080fd5b505afa158015613483573d6000803e3d6000fd5b505050506040513d602081101561349957600080fd5b5051604080517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810183905290519192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691632e1a7d4d9160248082019260009290919082900301818387803b15801561352057600080fd5b505af1158015613534573d6000803e3d6000fd5b505060025460009250158015915061355657506000546001600160a01b031615155b156135855761271060025483028161356a57fe5b6000549190049150613585906001600160a01b031682612f81565b8481830310156135c65760405162461bcd60e51b8152600401808060200182810382526028815260200180614f886028913960400191505060405180910390fd5b61208183828403612f81565b606060028251101561362b576040805162461bcd60e51b815260206004820152601960248201527f44796f724c6962726172793a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561364357600080fd5b5060405190808252806020026020018201604052801561366d578160200160208202803683370190505b509050828160018351038151811061368157fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b80156132cb576000806136e1878660018603815181106136cd57fe5b602002602001015187868151811061327857fe5b915091506137038484815181106136f457fe5b6020026020010151838361451a565b84600185038151811061371257fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016136b1565b600080600061375585856146cc565b604080517fe6a439050000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301528084166024830152915193955091935088169163e6a4390591604480820192602092909190829003018186803b1580156137c557600080fd5b505afa1580156137d9573d6000803e3d6000fd5b505050506040513d60208110156137ef57600080fd5b50519695505050505050565b6000806000309050600060025411801561381f57506000546001600160a01b031615155b80156138a05750600360008660008151811061383757fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16806138a05750600360008660018851038151811061387857fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff165b156139b35760036000866000815181106138b657fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16156139ae576127106002548802816138f157fe5b0492506139148560008151811061390457fe5b602002602001015133308a613d98565b6139418560008151811061392457fe5b60209081029190910101516000546001600160a01b031685612dcb565b6139a78560008151811061395157fe5b602002602001015161399f7f00000000000000000000000000000000000000000000000000000000000000008860008151811061398a57fe5b6020026020010151896001815181106133cf57fe5b858a03612dcb565b5060019050825b6139b6565b50825b81613a2257613a22856000815181106139cb57fe5b602002602001015133613a1a7f000000000000000000000000000000000000000000000000000000000000000089600081518110613a0557fe5b60200260200101518a6001815181106133cf57fe5b868b03613d98565b600085600187510381518110613a3457fe5b60200260200101516001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613a9157600080fd5b505afa158015613aa5573d6000803e3d6000fd5b505050506040513d6020811015613abb57600080fd5b50519050613ac98683614c04565b6000600254118015613ae557506000546001600160a01b031615155b8015613b6657506003600087600081518110613afd57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1680613b6657506003600087600189510381518110613b3e57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff165b15613ca7576003600087600081518110613b7c57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16613ca757600086600188510381518110613bb957fe5b60200260200101516001600160a01b03166370a08231846040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613c1657600080fd5b505afa158015613c2a573d6000803e3d6000fd5b505050506040513d6020811015613c4057600080fd5b5051600254909150612710908202049450613c7587600189510381518110613c6457fe5b602002602001015187878403612dcb565b613ca587600189510381518110613c8857fe5b60209081029190910101516000546001600160a01b031687612dcb565b505b86613d51828860018a510381518110613cbc57fe5b60200260200101516001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613d1957600080fd5b505afa158015613d2d573d6000803e3d6000fd5b505050506040513d6020811015613d4357600080fd5b50519063ffffffff614f2f16565b1015613d8e5760405162461bcd60e51b8152600401808060200182810382526028815260200180614f886028913960400191505060405180910390fd5b5050505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b60208310613e6957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613e2c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613ecb576040519150601f19603f3d011682016040523d82523d6000602084013e613ed0565b606091505b5091509150818015613efe575080511580613efe5750808060200190516020811015613efb57600080fd5b50515b6120815760405162461bcd60e51b81526004018080602001828103825260248152602001806150ad6024913960400191505060405180910390fd5b60005b600183510381101561182a57600080848381518110613f5757fe5b6020026020010151858460010181518110613f6e57fe5b6020026020010151915091506000613f8683836146cc565b5090506000878560010181518110613f9a57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b031614613fc857826000613fcc565b6000835b91509150600060028a51038810613fe35788614017565b6140177f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106133cf57fe5b90506140447f00000000000000000000000000000000000000000000000000000000000000008888613746565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015614081576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156140f25781810151838201526020016140da565b50505050905090810190601f16801561411f5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561414157600080fd5b505af1158015614155573d6000803e3d6000fd5b505060019099019850613f3c975050505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826000815181106141a357fe5b60200260200101516001600160a01b031614614206576040805162461bcd60e51b815260206004820152601a60248201527f44796f72526f7574657256323a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b60025434906000901580159061422657506000546001600160a01b031615155b156142555761271060025483028161423a57fe5b6000549190049150614255906001600160a01b031682612f81565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08284036040518263ffffffff1660e01b81526004016000604051808303818588803b1580156142b257600080fd5b505af11580156142c6573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6143407f00000000000000000000000000000000000000000000000000000000000000008760008151811061432b57fe5b6020026020010151886001815181106133cf57fe5b8385036040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561439257600080fd5b505af11580156143a6573d6000803e3d6000fd5b505050506040513d60208110156143bc57600080fd5b50516143c457fe5b6000846001865103815181106143d657fe5b60200260200101516001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561443357600080fd5b505afa158015614447573d6000803e3d6000fd5b505050506040513d602081101561445d57600080fd5b5051905061446b8585614c04565b856144dd828760018951038151811061448057fe5b60200260200101516001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613d1957600080fd5b10156120815760405162461bcd60e51b8152600401808060200182810382526028815260200180614f886028913960400191505060405180910390fd5b600080841161455a5760405162461bcd60e51b815260040180806020018281038252602781526020018061503d6027913960400191505060405180910390fd5b60008311801561456a5750600082115b6145a55760405162461bcd60e51b8152600401808060200182810382526023815260200180614ff66023913960400191505060405180910390fd5b60006145c96127106145bd868863ffffffff614a6616565b9063ffffffff614a6616565b905060006145e36126f26145bd868963ffffffff614f2f16565b905061460060018284816145f357fe5b049063ffffffff614ad216565b9695505050505050565b6000808411614660576040805162461bcd60e51b815260206004820181905260248201527f44796f724c6962726172793a20494e53554646494349454e545f414d4f554e54604482015290519081900360640190fd5b6000831180156146705750600082115b6146ab5760405162461bcd60e51b8152600401808060200182810382526023815260200180614ff66023913960400191505060405180910390fd5b826146bc858463ffffffff614a6616565b816146c357fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415614736576040805162461bcd60e51b815260206004820181905260248201527f44796f724c6962726172793a204944454e544943414c5f414444524553534553604482015290519081900360640190fd5b826001600160a01b0316846001600160a01b031610614756578284614759565b83835b90925090506001600160a01b0382166147b9576040805162461bcd60e51b815260206004820152601960248201527f44796f724c6962726172793a205a45524f5f4144445245535300000000000000604482015290519081900360640190fd5b9250929050565b604080517fe6a439050000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b15801561485357600080fd5b505afa158015614867573d6000803e3d6000fd5b505050506040513d602081101561487d57600080fd5b50516001600160a01b0316141561494957604080517fc9c653960000000000000000000000000000000000000000000000000000000081526001600160a01b038a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b15801561491c57600080fd5b505af1158015614930573d6000803e3d6000fd5b505050506040513d602081101561494657600080fd5b50505b6000806149777f00000000000000000000000000000000000000000000000000000000000000008b8b614b2a565b91509150816000148015614989575080155b1561499957879350869250614a59565b60006149a689848461460a565b90508781116149f957858110156149ee5760405162461bcd60e51b8152600401808060200182810382526023815260200180614fb06023913960400191505060405180910390fd5b889450925082614a57565b6000614a0689848661460a565b905089811115614a1257fe5b87811015614a515760405162461bcd60e51b8152600401808060200182810382526023815260200180614fd36023913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b6000811580614a8157505080820282828281614a7e57fe5b04145b6111c2576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b808201828110156111c2576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b6000806000614b3985856146cc565b509050614b47868686613746565b50600080614b56888888613746565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015614b8e57600080fd5b505afa158015614ba2573d6000803e3d6000fd5b505050506040513d6060811015614bb857600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506001600160a01b0387811690841614614bf2578082614bf5565b81815b90999098509650505050505050565b60005b600183510381101561309257600080848381518110614c2257fe5b6020026020010151858460010181518110614c3957fe5b6020026020010151915091506000614c5183836146cc565b5090506000614c817f00000000000000000000000000000000000000000000000000000000000000008585613746565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015614cc257600080fd5b505afa158015614cd6573d6000803e3d6000fd5b505050506040513d6060811015614cec57600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506000806001600160a01b038a811690891614614d29578284614d2c565b83835b91509150614d8a828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613d1957600080fd5b9550614d97868383613097565b945050505050600080856001600160a01b0316886001600160a01b031614614dc157826000614dc5565b6000835b91509150600060028c51038a10614ddc578a614e10565b614e107f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106133cf57fe5b60408051600080825260208201928390527f022c0d9f00000000000000000000000000000000000000000000000000000000835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015614eb3578181015183820152602001614e9b565b50505050905090810190601f168015614ee05780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015614f0257600080fd5b505af1158015614f16573d6000803e3d6000fd5b50506001909b019a50614c079950505050505050505050565b808203828111156111c2576040805162461bcd60e51b815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fdfe44796f72526f7574657256323a20494e53554646494349454e545f4f55545055545f414d4f554e5444796f72526f7574657256323a20494e53554646494349454e545f425f414d4f554e5444796f72526f7574657256323a20494e53554646494349454e545f415f414d4f554e5444796f724c6962726172793a20494e53554646494349454e545f4c495155494449545944796f72526f7574657256323a204558434553534956455f494e5055545f414d4f554e5444796f724c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c454444796f724c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a2646970667358221220fb8ee90cc71d482d54b2adadadaa6137ba9a683aa02b598085d923ab9128cba064736f6c63430006060033000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a000000000000000000000000ce54513ab9c2fbc8a2f9034bab6170572e2eef470000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102025760003560e01c806385f8c2591161011d578063c45a0155116100b0578063e8e337001161007f578063f305d71911610064578063f305d71914610e31578063f46901ed14610e77578063fb3bdb4114610eaa5761023b565b8063e8e3370014610d76578063ed31db6014610df65761023b565b8063c45a015514610bf0578063d06ca61f14610c05578063d50c552a14610cbc578063ded9382a14610d035761023b565b8063ad615dec116100ec578063ad615dec14610a84578063af2979eb14610aba578063b6f9de9514610b0d578063baa2abde14610b935761023b565b806385f8c2591461096e5780638803dbee146109a4578063a2e74af614610a3c578063ad5c464814610a6f5761023b565b806338ed1739116101955780635c11d795116101645780635c11d7951461078e5780635ccfe6e314610826578063791ac947146108505780637ff36ab5146108e85761023b565b806338ed17391461056c5780634a25d94a146106045780634f3122ed1461069c5780635b0d59841461071b5761023b565b806318cbafe5116101d157806318cbafe51461033a5780631f00ca74146104225780632195995c146104d957806324fd2272146105575761023b565b8063017e7e581461024057806302751cec14610271578063054d50d4146102dd578063094b7415146103255761023b565b3661023b57336001600160a01b037f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a161461023957fe5b005b600080fd5b34801561024c57600080fd5b50610255610f30565b604080516001600160a01b039092168252519081900360200190f35b34801561027d57600080fd5b506102c4600480360360c081101561029457600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610f3f565b6040805192835260208301919091528051918290030190f35b3480156102e957600080fd5b506103136004803603606081101561030057600080fd5b508035906020810135906040013561106b565b60408051918252519081900360200190f35b34801561033157600080fd5b50610255611080565b34801561034657600080fd5b506103d2600480360360a081101561035d57600080fd5b81359160208101359181019060608101604082013564010000000081111561038457600080fd5b82018360208201111561039657600080fd5b803590602001918460208302840111640100000000831117156103b857600080fd5b91935091506001600160a01b03813516906020013561108f565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561040e5781810151838201526020016103f6565b505050509050019250505060405180910390f35b34801561042e57600080fd5b506103d26004803603604081101561044557600080fd5b8135919081019060408101602082013564010000000081111561046757600080fd5b82018360208201111561047957600080fd5b8035906020019184602083028401116401000000008311171561049b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611192945050505050565b3480156104e557600080fd5b506102c460048036036101608110156104fd57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff61010082013516906101208101359061014001356111c8565b34801561056357600080fd5b506103136112f9565b34801561057857600080fd5b506103d2600480360360a081101561058f57600080fd5b8135916020810135918101906060810160408201356401000000008111156105b657600080fd5b8201836020820111156105c857600080fd5b803590602001918460208302840111640100000000831117156105ea57600080fd5b91935091506001600160a01b0381351690602001356112ff565b34801561061057600080fd5b506103d2600480360360a081101561062757600080fd5b81359160208101359181019060608101604082013564010000000081111561064e57600080fd5b82018360208201111561066057600080fd5b8035906020019184602083028401116401000000008311171561068257600080fd5b91935091506001600160a01b0381351690602001356113f7565b3480156106a857600080fd5b50610239600480360360408110156106bf57600080fd5b8101906020810181356401000000008111156106da57600080fd5b8201836020820111156106ec57600080fd5b8035906020019184602083028401116401000000008311171561070e57600080fd5b9193509150351515611758565b34801561072757600080fd5b50610313600480360361014081101561073f57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611830565b34801561079a57600080fd5b50610239600480360360a08110156107b157600080fd5b8135916020810135918101906060810160408201356401000000008111156107d857600080fd5b8201836020820111156107ea57600080fd5b8035906020019184602083028401116401000000008311171561080c57600080fd5b91935091506001600160a01b038135169060200135611975565b34801561083257600080fd5b506102396004803603602081101561084957600080fd5b5035611a14565b34801561085c57600080fd5b50610239600480360360a081101561087357600080fd5b81359160208101359181019060608101604082013564010000000081111561089a57600080fd5b8201836020820111156108ac57600080fd5b803590602001918460208302840111640100000000831117156108ce57600080fd5b91935091506001600160a01b038135169060200135611a78565b6103d2600480360360808110156108fe57600080fd5b8135919081019060408101602082013564010000000081111561092057600080fd5b82018360208201111561093257600080fd5b8035906020019184602083028401116401000000008311171561095457600080fd5b91935091506001600160a01b038135169060200135611b0e565b34801561097a57600080fd5b506103136004803603606081101561099157600080fd5b5080359060208101359060400135611c0f565b3480156109b057600080fd5b506103d2600480360360a08110156109c757600080fd5b8135916020810135918101906060810160408201356401000000008111156109ee57600080fd5b820183602082011115610a0057600080fd5b80359060200191846020830284011164010000000083111715610a2257600080fd5b91935091506001600160a01b038135169060200135611c1c565b348015610a4857600080fd5b5061023960048036036020811015610a5f57600080fd5b50356001600160a01b0316611d76565b348015610a7b57600080fd5b50610255611e0f565b348015610a9057600080fd5b5061031360048036036060811015610aa757600080fd5b5080359060208101359060400135611e33565b348015610ac657600080fd5b50610313600480360360c0811015610add57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611e40565b61023960048036036080811015610b2357600080fd5b81359190810190604081016020820135640100000000811115610b4557600080fd5b820183602082011115610b5757600080fd5b80359060200191846020830284011164010000000083111715610b7957600080fd5b91935091506001600160a01b038135169060200135611fec565b348015610b9f57600080fd5b506102c4600480360360e0811015610bb657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612089565b348015610bfc57600080fd5b50610255612311565b348015610c1157600080fd5b506103d260048036036040811015610c2857600080fd5b81359190810190604081016020820135640100000000811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b80359060200191846020830284011164010000000083111715610c7e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612335945050505050565b348015610cc857600080fd5b50610cef60048036036020811015610cdf57600080fd5b50356001600160a01b0316612362565b604080519115158252519081900360200190f35b348015610d0f57600080fd5b506102c46004803603610140811015610d2757600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612377565b348015610d8257600080fd5b50610dd86004803603610100811015610d9a57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e001356124c2565b60408051938452602084019290925282820152519081900360600190f35b348015610e0257600080fd5b5061023960048036036040811015610e1957600080fd5b506001600160a01b0381351690602001351515612610565b610dd8600480360360c0811015610e4757600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356126b8565b348015610e8357600080fd5b5061023960048036036020811015610e9a57600080fd5b50356001600160a01b031661296f565b6103d260048036036080811015610ec057600080fd5b81359190810190604081016020820135640100000000811115610ee257600080fd5b820183602082011115610ef457600080fd5b80359060200191846020830284011164010000000083111715610f1657600080fd5b91935091506001600160a01b038135169060200135612a08565b6000546001600160a01b031681565b6000808242811015610f98576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b610fc7897f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a8a8a8a308a612089565b9093509150610fd7898685612dcb565b7f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a6001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561103d57600080fd5b505af1158015611051573d6000803e3d6000fd5b5050505061105f8583612f81565b50965096945050505050565b6000611078848484613097565b949350505050565b6001546001600160a01b031681565b606081428110156110e7576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b6111457f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac8988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061318792505050565b915061118788888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a92506132d3915050565b509695505050505050565b60606111bf7f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac84846135d2565b90505b92915050565b60008060006111f87f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac8f8f613746565b9050600087611207578c611229565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156112b857600080fd5b505af11580156112cc573d6000803e3d6000fd5b505050506112df8f8f8f8f8f8f8f612089565b809450819550505050509b509b9950505050505050505050565b60025481565b60608142811015611357576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b6113b57f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac8988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061318792505050565b915061118788888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a92506137fb915050565b6060814281101561144f576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a1686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181106114a757fe5b905060200201356001600160a01b03166001600160a01b031614611512576040805162461bcd60e51b815260206004820152601a60248201527f44796f72526f7574657256323a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b6115707f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506135d292505050565b9150868260008151811061158057fe5b602002602001015111156115c55760405162461bcd60e51b81526004018080602001828103825260248152602001806150196024913960400191505060405180910390fd5b611663868660008181106115d557fe5b905060200201356001600160a01b0316336116497f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac8a8a600081811061161757fe5b905060200201356001600160a01b03168b8b600181811061163457fe5b905060200201356001600160a01b0316613746565b8560008151811061165657fe5b6020026020010151613d98565b6116a282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613f39915050565b7f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a6001600160a01b0316632e1a7d4d836001855103815181106116e157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561171f57600080fd5b505af1158015611733573d6000803e3d6000fd5b50505050611187848360018551038151811061174b57fe5b6020026020010151612f81565b6001546001600160a01b031633146117b7576040805162461bcd60e51b815260206004820152601760248201527f44796f72526f7574657256323a20464f5242494444454e000000000000000000604482015290519081900360640190fd5b60005b8281101561182a5781600360008686858181106117d357fe5b602090810292909201356001600160a01b031683525081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556001016117ba565b50505050565b60008061187e7f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac8d7f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a613746565b905060008661188d578b6118af565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561193e57600080fd5b505af1158015611952573d6000803e3d6000fd5b505050506119648d8d8d8d8d8d611e40565b9d9c50505050505050505050505050565b80428110156119cb576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b611a0b87878787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506137fb915050565b50505050505050565b6001546001600160a01b03163314611a73576040805162461bcd60e51b815260206004820152601760248201527f44796f72526f7574657256323a20464f5242494444454e000000000000000000604482015290519081900360640190fd5b600255565b8042811015611ace576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b611a0b87878787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506132d3915050565b60608142811015611b66576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b611bc47f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac3488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061318792505050565b9150611c058787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061416c915050565b5095945050505050565b600061107884848461451a565b60608142811015611c74576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b611cd27f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506135d292505050565b91508682600081518110611ce257fe5b60200260200101511115611d275760405162461bcd60e51b81526004018080602001828103825260248152602001806150196024913960400191505060405180910390fd5b611d37868660008181106115d557fe5b61118782878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613f39915050565b6001546001600160a01b03163314611dd5576040805162461bcd60e51b815260206004820152601760248201527f44796f72526f7574657256323a20464f5242494444454e000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a81565b600061107884848461460a565b60008142811015611e98576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b611ec7887f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a8989893089612089565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051919450611f6492508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015611f3357600080fd5b505afa158015611f47573d6000803e3d6000fd5b505050506040513d6020811015611f5d57600080fd5b5051612dcb565b7f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a6001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611fca57600080fd5b505af1158015611fde573d6000803e3d6000fd5b505050506111878483612f81565b8042811015612042576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b6120818686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525088925061416c915050565b505050505050565b60008082428110156120e2576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b600061210f7f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac8c8c613746565b604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561218357600080fd5b505af1158015612197573d6000803e3d6000fd5b505050506040513d60208110156121ad57600080fd5b5050604080517f89afcb440000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561221357600080fd5b505af1158015612227573d6000803e3d6000fd5b505050506040513d604081101561223d57600080fd5b508051602090910151909250905060006122578e8e6146cc565b509050806001600160a01b03168e6001600160a01b03161461227a57818361227d565b82825b90975095508a8710156122c15760405162461bcd60e51b8152600401808060200182810382526023815260200180614fd36023913960400191505060405180910390fd5b898610156123005760405162461bcd60e51b8152600401808060200182810382526023815260200180614fb06023913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac81565b60606111bf7f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac8484613187565b60036020526000908152604090205460ff1681565b60008060006123c77f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac8e7f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a613746565b90506000876123d6578c6123f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561248757600080fd5b505af115801561249b573d6000803e3d6000fd5b505050506124ad8e8e8e8e8e8e610f3f565b909f909e509c50505050505050505050505050565b6000806000834281101561251d576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b61252b8c8c8c8c8c8c6147c0565b9094509250600061255d7f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac8e8e613746565b905061256b8d338388613d98565b6125778c338387613d98565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156125cf57600080fd5b505af11580156125e3573d6000803e3d6000fd5b505050506040513d60208110156125f957600080fd5b5051949d939c50939a509198505050505050505050565b6001546001600160a01b0316331461266f576040805162461bcd60e51b815260206004820152601760248201527f44796f72526f7574657256323a20464f5242494444454e000000000000000000604482015290519081900360640190fd5b6001600160a01b0391909116600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60008060008342811015612713576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b6127418a7f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a8b348c8c6147c0565b909450925060006127937f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac8c7f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a613746565b90506127a18b338388613d98565b7f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a6001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156127fc57600080fd5b505af1158015612810573d6000803e3d6000fd5b50505050507f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a6001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561289557600080fd5b505af11580156128a9573d6000803e3d6000fd5b505050506040513d60208110156128bf57600080fd5b50516128c757fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561291f57600080fd5b505af1158015612933573d6000803e3d6000fd5b505050506040513d602081101561294957600080fd5b50519250348410156129615761296133853403612f81565b505096509650969350505050565b6001546001600160a01b031633146129ce576040805162461bcd60e51b815260206004820152601760248201527f44796f72526f7574657256323a20464f5242494444454e000000000000000000604482015290519081900360640190fd5b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60608142811015612a60576040805162461bcd60e51b815260206004820152601560248201527f44796f72526f7574657256323a20455850495245440000000000000000000000604482015290519081900360640190fd5b7f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a6001600160a01b031686866000818110612a9757fe5b905060200201356001600160a01b03166001600160a01b031614612b02576040805162461bcd60e51b815260206004820152601a60248201527f44796f72526f7574657256323a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b612b607f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506135d292505050565b91503482600081518110612b7057fe5b60200260200101511115612bb55760405162461bcd60e51b81526004018080602001828103825260248152602001806150196024913960400191505060405180910390fd5b7f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a6001600160a01b031663d0e30db083600081518110612bf157fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612c2457600080fd5b505af1158015612c38573d6000803e3d6000fd5b50505050507f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a6001600160a01b031663a9059cbb612cba7f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac89896000818110612c9d57fe5b905060200201356001600160a01b03168a8a600181811061163457fe5b84600081518110612cc757fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612d1e57600080fd5b505af1158015612d32573d6000803e3d6000fd5b505050506040513d6020811015612d4857600080fd5b5051612d5057fe5b612d8f82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613f39915050565b81600081518110612d9c57fe5b6020026020010151341115611c0557611c053383600081518110612dbc57fe5b60200260200101513403612f81565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310612e9457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612e57565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612ef6576040519150601f19603f3d011682016040523d82523d6000602084013e612efb565b606091505b5091509150818015612f29575080511580612f295750808060200190516020811015612f2657600080fd5b50515b612f7a576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b60208310612feb57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612fae565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461304d576040519150601f19603f3d011682016040523d82523d6000602084013e613052565b606091505b50509050806130925760405162461bcd60e51b81526004018080602001828103825260238152602001806150646023913960400191505060405180910390fd5b505050565b60008084116130d75760405162461bcd60e51b81526004018080602001828103825260268152602001806150876026913960400191505060405180910390fd5b6000831180156130e75750600082115b6131225760405162461bcd60e51b8152600401808060200182810382526023815260200180614ff66023913960400191505060405180910390fd5b6000613136856126f263ffffffff614a6616565b9050600061314a828563ffffffff614a6616565b90506000613170836131648861271063ffffffff614a6616565b9063ffffffff614ad216565b905080828161317b57fe5b04979650505050505050565b60606002825110156131e0576040805162461bcd60e51b815260206004820152601960248201527f44796f724c6962726172793a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b815167ffffffffffffffff811180156131f857600080fd5b50604051908082528060200260200182016040528015613222578160200160208202803683370190505b509050828160008151811061323357fe5b60200260200101818152505060005b60018351038110156132cb576000806132858786858151811061326157fe5b602002602001015187866001018151811061327857fe5b6020026020010151614b2a565b915091506132a784848151811061329857fe5b60200260200101518383613097565b8484600101815181106132b657fe5b60209081029190910101525050600101613242565b509392505050565b7f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a6001600160a01b03168260018451038151811061330d57fe5b60200260200101516001600160a01b031614613370576040805162461bcd60e51b815260206004820152601a60248201527f44796f72526f7574657256323a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b6133e28260008151811061338057fe5b6020026020010151336133dc7f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac866000815181106133ba57fe5b6020026020010151876001815181106133cf57fe5b6020026020010151613746565b87613d98565b6133ec8230614c04565b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000916001600160a01b037f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a16916370a0823191602480820192602092909190829003018186803b15801561346f57600080fd5b505afa158015613483573d6000803e3d6000fd5b505050506040513d602081101561349957600080fd5b5051604080517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810183905290519192506001600160a01b037f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a1691632e1a7d4d9160248082019260009290919082900301818387803b15801561352057600080fd5b505af1158015613534573d6000803e3d6000fd5b505060025460009250158015915061355657506000546001600160a01b031615155b156135855761271060025483028161356a57fe5b6000549190049150613585906001600160a01b031682612f81565b8481830310156135c65760405162461bcd60e51b8152600401808060200182810382526028815260200180614f886028913960400191505060405180910390fd5b61208183828403612f81565b606060028251101561362b576040805162461bcd60e51b815260206004820152601960248201527f44796f724c6962726172793a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561364357600080fd5b5060405190808252806020026020018201604052801561366d578160200160208202803683370190505b509050828160018351038151811061368157fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b80156132cb576000806136e1878660018603815181106136cd57fe5b602002602001015187868151811061327857fe5b915091506137038484815181106136f457fe5b6020026020010151838361451a565b84600185038151811061371257fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016136b1565b600080600061375585856146cc565b604080517fe6a439050000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301528084166024830152915193955091935088169163e6a4390591604480820192602092909190829003018186803b1580156137c557600080fd5b505afa1580156137d9573d6000803e3d6000fd5b505050506040513d60208110156137ef57600080fd5b50519695505050505050565b6000806000309050600060025411801561381f57506000546001600160a01b031615155b80156138a05750600360008660008151811061383757fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16806138a05750600360008660018851038151811061387857fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff165b156139b35760036000866000815181106138b657fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16156139ae576127106002548802816138f157fe5b0492506139148560008151811061390457fe5b602002602001015133308a613d98565b6139418560008151811061392457fe5b60209081029190910101516000546001600160a01b031685612dcb565b6139a78560008151811061395157fe5b602002602001015161399f7f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac8860008151811061398a57fe5b6020026020010151896001815181106133cf57fe5b858a03612dcb565b5060019050825b6139b6565b50825b81613a2257613a22856000815181106139cb57fe5b602002602001015133613a1a7f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac89600081518110613a0557fe5b60200260200101518a6001815181106133cf57fe5b868b03613d98565b600085600187510381518110613a3457fe5b60200260200101516001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613a9157600080fd5b505afa158015613aa5573d6000803e3d6000fd5b505050506040513d6020811015613abb57600080fd5b50519050613ac98683614c04565b6000600254118015613ae557506000546001600160a01b031615155b8015613b6657506003600087600081518110613afd57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1680613b6657506003600087600189510381518110613b3e57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff165b15613ca7576003600087600081518110613b7c57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16613ca757600086600188510381518110613bb957fe5b60200260200101516001600160a01b03166370a08231846040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613c1657600080fd5b505afa158015613c2a573d6000803e3d6000fd5b505050506040513d6020811015613c4057600080fd5b5051600254909150612710908202049450613c7587600189510381518110613c6457fe5b602002602001015187878403612dcb565b613ca587600189510381518110613c8857fe5b60209081029190910101516000546001600160a01b031687612dcb565b505b86613d51828860018a510381518110613cbc57fe5b60200260200101516001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613d1957600080fd5b505afa158015613d2d573d6000803e3d6000fd5b505050506040513d6020811015613d4357600080fd5b50519063ffffffff614f2f16565b1015613d8e5760405162461bcd60e51b8152600401808060200182810382526028815260200180614f886028913960400191505060405180910390fd5b5050505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b60208310613e6957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613e2c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613ecb576040519150601f19603f3d011682016040523d82523d6000602084013e613ed0565b606091505b5091509150818015613efe575080511580613efe5750808060200190516020811015613efb57600080fd5b50515b6120815760405162461bcd60e51b81526004018080602001828103825260248152602001806150ad6024913960400191505060405180910390fd5b60005b600183510381101561182a57600080848381518110613f5757fe5b6020026020010151858460010181518110613f6e57fe5b6020026020010151915091506000613f8683836146cc565b5090506000878560010181518110613f9a57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b031614613fc857826000613fcc565b6000835b91509150600060028a51038810613fe35788614017565b6140177f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac878c8b600201815181106133cf57fe5b90506140447f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac8888613746565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015614081576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156140f25781810151838201526020016140da565b50505050905090810190601f16801561411f5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561414157600080fd5b505af1158015614155573d6000803e3d6000fd5b505060019099019850613f3c975050505050505050565b7f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a6001600160a01b0316826000815181106141a357fe5b60200260200101516001600160a01b031614614206576040805162461bcd60e51b815260206004820152601a60248201527f44796f72526f7574657256323a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b60025434906000901580159061422657506000546001600160a01b031615155b156142555761271060025483028161423a57fe5b6000549190049150614255906001600160a01b031682612f81565b7f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a6001600160a01b031663d0e30db08284036040518263ffffffff1660e01b81526004016000604051808303818588803b1580156142b257600080fd5b505af11580156142c6573d6000803e3d6000fd5b50505050507f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a6001600160a01b031663a9059cbb6143407f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac8760008151811061432b57fe5b6020026020010151886001815181106133cf57fe5b8385036040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561439257600080fd5b505af11580156143a6573d6000803e3d6000fd5b505050506040513d60208110156143bc57600080fd5b50516143c457fe5b6000846001865103815181106143d657fe5b60200260200101516001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561443357600080fd5b505afa158015614447573d6000803e3d6000fd5b505050506040513d602081101561445d57600080fd5b5051905061446b8585614c04565b856144dd828760018951038151811061448057fe5b60200260200101516001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613d1957600080fd5b10156120815760405162461bcd60e51b8152600401808060200182810382526028815260200180614f886028913960400191505060405180910390fd5b600080841161455a5760405162461bcd60e51b815260040180806020018281038252602781526020018061503d6027913960400191505060405180910390fd5b60008311801561456a5750600082115b6145a55760405162461bcd60e51b8152600401808060200182810382526023815260200180614ff66023913960400191505060405180910390fd5b60006145c96127106145bd868863ffffffff614a6616565b9063ffffffff614a6616565b905060006145e36126f26145bd868963ffffffff614f2f16565b905061460060018284816145f357fe5b049063ffffffff614ad216565b9695505050505050565b6000808411614660576040805162461bcd60e51b815260206004820181905260248201527f44796f724c6962726172793a20494e53554646494349454e545f414d4f554e54604482015290519081900360640190fd5b6000831180156146705750600082115b6146ab5760405162461bcd60e51b8152600401808060200182810382526023815260200180614ff66023913960400191505060405180910390fd5b826146bc858463ffffffff614a6616565b816146c357fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415614736576040805162461bcd60e51b815260206004820181905260248201527f44796f724c6962726172793a204944454e544943414c5f414444524553534553604482015290519081900360640190fd5b826001600160a01b0316846001600160a01b031610614756578284614759565b83835b90925090506001600160a01b0382166147b9576040805162461bcd60e51b815260206004820152601960248201527f44796f724c6962726172793a205a45524f5f4144445245535300000000000000604482015290519081900360640190fd5b9250929050565b604080517fe6a439050000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015287811660248301529151600092839283927f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac9092169163e6a4390591604480820192602092909190829003018186803b15801561485357600080fd5b505afa158015614867573d6000803e3d6000fd5b505050506040513d602081101561487d57600080fd5b50516001600160a01b0316141561494957604080517fc9c653960000000000000000000000000000000000000000000000000000000081526001600160a01b038a81166004830152898116602483015291517f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac9092169163c9c65396916044808201926020929091908290030181600087803b15801561491c57600080fd5b505af1158015614930573d6000803e3d6000fd5b505050506040513d602081101561494657600080fd5b50505b6000806149777f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac8b8b614b2a565b91509150816000148015614989575080155b1561499957879350869250614a59565b60006149a689848461460a565b90508781116149f957858110156149ee5760405162461bcd60e51b8152600401808060200182810382526023815260200180614fb06023913960400191505060405180910390fd5b889450925082614a57565b6000614a0689848661460a565b905089811115614a1257fe5b87811015614a515760405162461bcd60e51b8152600401808060200182810382526023815260200180614fd36023913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b6000811580614a8157505080820282828281614a7e57fe5b04145b6111c2576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b808201828110156111c2576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b6000806000614b3985856146cc565b509050614b47868686613746565b50600080614b56888888613746565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015614b8e57600080fd5b505afa158015614ba2573d6000803e3d6000fd5b505050506040513d6060811015614bb857600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506001600160a01b0387811690841614614bf2578082614bf5565b81815b90999098509650505050505050565b60005b600183510381101561309257600080848381518110614c2257fe5b6020026020010151858460010181518110614c3957fe5b6020026020010151915091506000614c5183836146cc565b5090506000614c817f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac8585613746565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015614cc257600080fd5b505afa158015614cd6573d6000803e3d6000fd5b505050506040513d6060811015614cec57600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506000806001600160a01b038a811690891614614d29578284614d2c565b83835b91509150614d8a828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613d1957600080fd5b9550614d97868383613097565b945050505050600080856001600160a01b0316886001600160a01b031614614dc157826000614dc5565b6000835b91509150600060028c51038a10614ddc578a614e10565b614e107f000000000000000000000000a9f2c3e18e22f19e6c2cef49a88c79bce5b482ac898e8d600201815181106133cf57fe5b60408051600080825260208201928390527f022c0d9f00000000000000000000000000000000000000000000000000000000835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015614eb3578181015183820152602001614e9b565b50505050905090810190601f168015614ee05780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015614f0257600080fd5b505af1158015614f16573d6000803e3d6000fd5b50506001909b019a50614c079950505050505050505050565b808203828111156111c2576040805162461bcd60e51b815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fdfe44796f72526f7574657256323a20494e53554646494349454e545f4f55545055545f414d4f554e5444796f72526f7574657256323a20494e53554646494349454e545f425f414d4f554e5444796f72526f7574657256323a20494e53554646494349454e545f415f414d4f554e5444796f724c6962726172793a20494e53554646494349454e545f4c495155494449545944796f72526f7574657256323a204558434553534956455f494e5055545f414d4f554e5444796f724c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c454444796f724c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a2646970667358221220fb8ee90cc71d482d54b2adadadaa6137ba9a683aa02b598085d923ab9128cba064736f6c63430006060033

Deployed Bytecode Sourcemap

16078:21187:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16830:10;-1:-1:-1;;;;;16844:4:0;16830:18;;16823:26;;;;16078:21187;;12:1:-1;9;2:12;16156:20:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16156:20:0;;;:::i;:::-;;;;-1:-1:-1;;;;;16156:20:0;;;;;;;;;;;;;;21888:673;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21888:673:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;21888:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36229:257;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36229:257:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36229:257:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;16183:26;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16183:26:0;;;:::i;28501:417::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28501:417:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;28501:417:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;28501:417:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;28501:417:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;28501:417:0;;-1:-1:-1;28501:417:0;-1:-1:-1;;;;;;28501:417:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28501:417:0;;;;;;;;;;;;;;;;;37014:248;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37014:248:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;37014:248:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;37014:248:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;37014:248:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37014:248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;37014:248:0;;-1:-1:-1;37014:248:0;;-1:-1:-1;;;;;37014:248:0:i;22567:667::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22567:667:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22567:667:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16216:31::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16216:31:0;;;:::i;26224:425::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26224:425:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;26224:425:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;26224:425:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26224:425:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26224:425:0;;-1:-1:-1;26224:425:0;-1:-1:-1;;;;;;26224:425:0;;;;;;;;:::i;27681:812::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27681:812:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;27681:812:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;27681:812:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;27681:812:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27681:812:0;;-1:-1:-1;27681:812:0;-1:-1:-1;;;;;;27681:812:0;;;;;;;;:::i;17256:274::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17256:274:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;17256:274:0;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;17256:274:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;17256:274:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;17256:274:0;;-1:-1:-1;17256:274:0;-1:-1:-1;17256:274:0;;;;:::i;24684:708::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24684:708:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;24684:708:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33066:351::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33066:351:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;33066:351:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;33066:351:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33066:351:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33066:351:0;;-1:-1:-1;33066:351:0;-1:-1:-1;;;;;;33066:351:0;;;;;;;;:::i;17725:172::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17725:172:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17725:172:0;;:::i;35649:345::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35649:345:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;35649:345:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;35649:345:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35649:345:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;35649:345:0;;-1:-1:-1;35649:345:0;-1:-1:-1;;;;;;35649:345:0;;;;;;;;:::i;27262:411::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;27262:411:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;27262:411:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;27262:411:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27262:411:0;;-1:-1:-1;27262:411:0;-1:-1:-1;;;;;;27262:411:0;;;;;;;;:::i;36494:256::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36494:256:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36494:256:0;;;;;;;;;;;;:::i;26657:593::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26657:593:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;26657:593:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;26657:593:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26657:593:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26657:593:0;;-1:-1:-1;26657:593:0;-1:-1:-1;;;;;;26657:593:0;;;;;;;;:::i;17076:172::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17076:172:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17076:172:0;-1:-1:-1;;;;;17076:172:0;;:::i;16302:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16302:38:0;;;:::i;36038:183::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36038:183:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36038:183:0;;;;;;;;;;;;:::i;23978:700::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23978:700:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;23978:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34366:321::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;34366:321:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;34366:321:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34366:321:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34366:321:0;;-1:-1:-1;34366:321:0;-1:-1:-1;;;;;;34366:321:0;;;;;;;;:::i;21043:839::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21043:839:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;21043:839:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16254:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16254:41:0;;;:::i;36758:248::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36758:248:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;36758:248:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;36758:248:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;36758:248:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;36758:248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;36758:248:0;;-1:-1:-1;36758:248:0;;-1:-1:-1;;;;;36758:248:0:i;16347:43::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16347:43:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16347:43:0;-1:-1:-1;;;;;16347:43:0;;:::i;:::-;;;;;;;;;;;;;;;;;;23240:659;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23240:659:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;23240:659:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19302:728::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19302:728:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;19302:728:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;17538:179;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17538:179:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;17538:179:0;;;;;;;;;;:::i;20036:964::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;20036:964:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16920:148::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16920:148:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16920:148:0;-1:-1:-1;;;;;16920:148:0;;:::i;28926:794::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;28926:794:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;28926:794:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;28926:794:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;28926:794:0;;-1:-1:-1;28926:794:0;-1:-1:-1;;;;;;28926:794:0;;;;;;;;:::i;16156:20::-;;;-1:-1:-1;;;;;16156:20:0;;:::o;21888:673::-;22125:16;22143:14;22106:8;16461:15;16449:8;:27;;16441:61;;;;;-1:-1:-1;;;16441:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22197:196:::1;22227:5;22247:4;22266:9;22290:14;22319:12;22354:4;22374:8;22197:15;:196::i;:::-;22170:223:::0;;-1:-1:-1;22170:223:0;-1:-1:-1;22404:51:0::1;22432:5:::0;22439:2;22170:223;22404:27:::1;:51::i;:::-;22472:4;-1:-1:-1::0;;;;;22466:20:0::1;;22487:9;22466:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;22466:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22466:31:0;;;;22508:45;22539:2;22543:9;22508:30;:45::i;:::-;21888:673:::0;;;;;;;;;;:::o;36229:257::-;36382:14;36421:57;36446:8;36456:9;36467:10;36421:24;:57::i;:::-;36414:64;36229:257;-1:-1:-1;;;;36229:257:0:o;16183:26::-;;;-1:-1:-1;;;;;16183:26:0;;:::o;28501:417::-;28715:21;28687:8;16461:15;16449:8;:27;;16441:61;;;;;-1:-1:-1;;;16441:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28764:50:::1;28790:7;28799:8;28809:4;;28764:50;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28764:25:0::1;::::0;-1:-1:-1;;;28764:50:0:i:1;:::-;28754:60;;28825:85;28877:8;28887:12;28901:4;;28825:85;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28907:2:0;;-1:-1:-1;28825:51:0::1;::::0;-1:-1:-1;;28825:85:0:i:1;:::-;28501:417:::0;;;;;;;;;:::o;37014:248::-;37158:21;37204:50;37229:7;37238:9;37249:4;37204:24;:50::i;:::-;37197:57;;37014:248;;;;;:::o;22567:667::-;22873:12;22887;22912;22927:44;22947:7;22956:6;22964;22927:19;:44::i;:::-;22912:59;;22982:10;22995;:33;;23019:9;22995:33;;;23013:2;22995:33;23039:75;;;;;;23062:10;23039:75;;;;23082:4;23039:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22982:46;;-1:-1:-1;;;;;;23039:22:0;;;;;:75;;;;;-1:-1:-1;;23039:75:0;;;;;;;;-1:-1:-1;23039:22:0;:75;;;2:2:-1;;;;27:1;24;17:12;2:2;23039:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23039:75:0;;;;23146:80;23162:6;23170;23178:9;23189:10;23201;23213:2;23217:8;23146:15;:80::i;:::-;23125:101;;;;;;;;22567:667;;;;;;;;;;;;;;;;:::o;16216:31::-;;;;:::o;26224:425::-;26448:21;26429:8;16461:15;16449:8;:27;;16441:61;;;;;-1:-1:-1;;;16441:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26492:50:::1;26518:7;26527:8;26537:4;;26492:50;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26492:25:0::1;::::0;-1:-1:-1;;;26492:50:0:i:1;:::-;26482:60;;26553:88;26608:8;26618:12;26632:4;;26553:88;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26638:2:0;;-1:-1:-1;26553:54:0::1;::::0;-1:-1:-1;;26553:88:0:i:1;27681:812::-:0;27895:21;27867:8;16461:15;16449:8;:27;;16441:61;;;;;-1:-1:-1;;;16441:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27967:4:0::1;27942:29;:4:::0;;27947:15;;;27942:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27942:21:0::1;-1:-1:-1::0;;;;;27942:29:0::1;;27934:68;;;::::0;;-1:-1:-1;;;27934:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28023:50;28048:7;28057:9;28068:4;;28023:50;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28023:24:0::1;::::0;-1:-1:-1;;;28023:50:0:i:1;:::-;28013:60;;28106:11;28092:7;28100:1;28092:10;;;;;;;;;;;;;;:25;;28084:74;;;;-1:-1:-1::0;;;28084:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28169:136;28215:4;;28220:1;28215:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28215:7:0::1;28224:10;28236:46;28256:7;28265:4;;28270:1;28265:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28265:7:0::1;28274:4;;28279:1;28274:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28274:7:0::1;28236:19;:46::i;:::-;28284:7;28292:1;28284:10;;;;;;;;;;;;;;28169:31;:136::i;:::-;28316:35;28322:7;28331:4;;28316:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28345:4:0::1;::::0;-1:-1:-1;28316:5:0::1;::::0;-1:-1:-1;;28316:35:0:i:1;:::-;28368:4;-1:-1:-1::0;;;;;28362:20:0::1;;28383:7;28408:1;28391:7;:14;:18;28383:27;;;;;;;;;;;;;;28362:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28362:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28362:49:0;;;;28422:63;28453:2;28457:7;28482:1;28465:7;:14;:18;28457:27;;;;;;;;;;;;;;28422:30;:63::i;17256:274::-:0;17371:11;;-1:-1:-1;;;;;17371:11:0;17357:10;:25;17349:61;;;;;-1:-1:-1;;;17349:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17425:6;17421:102;17433:23;;;17421:102;;;17508:3;17477:11;:28;17489:12;;17502:1;17489:15;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17489:15:0;17477:28;;-1:-1:-1;17477:28:0;;;;;;;;-1:-1:-1;17477:28:0;:34;;;;;;;;;;;;;-1:-1:-1;17458:3:0;17421:102;;;;17256:274;;;:::o;24684:708::-;25002:14;25029:12;25044:41;25064:7;25073:5;25080:4;25044:19;:41::i;:::-;25029:56;;25096:10;25109;:33;;25133:9;25109:33;;;25127:2;25109:33;25153:75;;;;;;25176:10;25153:75;;;;25196:4;25153:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25096:46;;-1:-1:-1;;;;;;25153:22:0;;;;;:75;;;;;-1:-1:-1;;25153:75:0;;;;;;;;-1:-1:-1;25153:22:0;:75;;;2:2:-1;;;;27:1;24;17:12;2:2;25153:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25153:75:0;;;;25251:133;25313:5;25320:9;25331:14;25347:12;25361:2;25365:8;25251:47;:133::i;:::-;25239:145;24684:708;-1:-1:-1;;;;;;;;;;;;;24684:708:0:o;33066:351::-;33300:8;16461:15;16449:8;:27;;16441:61;;;;;-1:-1:-1;;;16441:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33321:88:::1;33376:8;33386:12;33400:4;;33321:88;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33406:2:0;;-1:-1:-1;33321:54:0::1;::::0;-1:-1:-1;;33321:88:0:i:1;:::-;33066:351:::0;;;;;;;:::o;17725:172::-;17813:11;;-1:-1:-1;;;;;17813:11:0;17799:10;:25;17791:61;;;;;-1:-1:-1;;;17791:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17863:11;:26;17725:172::o;35649:345::-;35880:8;16461:15;16449:8;:27;;16441:61;;;;;-1:-1:-1;;;16441:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35901:85:::1;35953:8;35963:12;35977:4;;35901:85;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;35983:2:0;;-1:-1:-1;35901:51:0::1;::::0;-1:-1:-1;;35901:85:0:i:1;27262:411::-:0;27478:21;27450:8;16461:15;16449:8;:27;;16441:61;;;;;-1:-1:-1;;;16441:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27527:51:::1;27553:7;27562:9;27573:4;;27527:51;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27527:25:0::1;::::0;-1:-1:-1;;;27527:51:0:i:1;:::-;27517:61;;27589:76;27641:12;27656:4;;27589:76;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27662:2:0;;-1:-1:-1;27589:51:0::1;::::0;-1:-1:-1;;27589:76:0:i:1;:::-;27262:411:::0;;;;;;;;:::o;36494:256::-;36647:13;36685:57;36709:9;36720;36731:10;36685:23;:57::i;26657:593::-;26881:21;26862:8;16461:15;16449:8;:27;;16441:61;;;;;-1:-1:-1;;;16441:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26925:50:::1;26950:7;26959:9;26970:4;;26925:50;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26925:24:0::1;::::0;-1:-1:-1;;;26925:50:0:i:1;:::-;26915:60;;27008:11;26994:7;27002:1;26994:10;;;;;;;;;;;;;;:25;;26986:74;;;;-1:-1:-1::0;;;26986:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27071:136;27117:4;;27122:1;27117:7;;;;;;27071:136;27218:24;27224:7;27233:4;;27218:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27239:2:0;;-1:-1:-1;27218:5:0::1;::::0;-1:-1:-1;;27218:24:0:i:1;17076:172::-:0;17164:11;;-1:-1:-1;;;;;17164:11:0;17150:10;:25;17142:61;;;;;-1:-1:-1;;;17142:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17214:11;:26;;;;-1:-1:-1;;;;;17214:26:0;;;;;;;;;;17076:172::o;16302:38::-;;;:::o;36038:183::-;36135:12;36167:46;36185:7;36194:8;36204;36167:17;:46::i;23978:700::-;24244:14;24225:8;16461:15;16449:8;:27;;16441:61;;;;;-1:-1:-1;;;16441:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24287:196:::1;24317:5;24337:4;24356:9;24380:14;24409:12;24444:4;24464:8;24287:15;:196::i;:::-;24533:38;::::0;;;;;24565:4:::1;24533:38;::::0;::::1;::::0;;;24271:212;;-1:-1:-1;24494:78:0::1;::::0;-1:-1:-1;24522:5:0;;24529:2;;-1:-1:-1;;;;;24533:23:0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;:23;:38;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;24533:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24533:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;24533:38:0;24494:27:::1;:78::i;:::-;24589:4;-1:-1:-1::0;;;;;24583:20:0::1;;24604:9;24583:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;24583:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24583:31:0;;;;24625:45;24656:2;24660:9;24625:30;:45::i;34366:321::-:0;34582:8;16461:15;16449:8;:27;;16441:61;;;;;-1:-1:-1;;;16441:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34603:76:::1;34655:12;34670:4;;34603:76;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;34676:2:0;;-1:-1:-1;34603:51:0::1;::::0;-1:-1:-1;;34603:76:0:i:1;:::-;34366:321:::0;;;;;;:::o;21043:839::-;21297:12;21311;21278:8;16461:15;16449:8;:27;;16441:61;;;;;-1:-1:-1;;;16441:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21336:12:::1;21351:44;21371:7;21380:6;21388;21351:19;:44::i;:::-;21406:57;::::0;;;;;21435:10:::1;21406:57;::::0;::::1;::::0;-1:-1:-1;;;;;21406:28:0;::::1;:57:::0;;;;;;;;;;;;;;21336:59;;-1:-1:-1;21406:28:0;;::::1;::::0;:57;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;21406:28:0;:57;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;21406:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;21406:57:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;21531:24:0::1;::::0;;;;;-1:-1:-1;;;;;21531:24:0;;::::1;;::::0;::::1;::::0;;;21501:12:::1;::::0;;;21531:20;;::::1;::::0;::::1;::::0;:24;;;;;;;;;;;21501:12;21531:20;:24;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;21531:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;21531:24:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;21531:24:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;21531:24:0;-1:-1:-1;21567:14:0::1;21586:38;21609:6:::0;21617;21586:22:::1;:38::i;:::-;21566:58;;;21666:6;-1:-1:-1::0;;;;;21656:16:0::1;:6;-1:-1:-1::0;;;;;21656:16:0::1;;:58;;21697:7;21706;21656:58;;;21676:7;21685;21656:58;21635:79:::0;;-1:-1:-1;21635:79:0;-1:-1:-1;21733:21:0;;::::1;;21725:69;;;;-1:-1:-1::0;;;21725:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21824:10;21813:7;:21;;21805:69;;;;-1:-1:-1::0;;;21805:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16513:1;;;;21043:839:::0;;;;;;;;;;;:::o;16254:41::-;;;:::o;36758:248::-;36902:21;36948:50;36974:7;36983:8;36993:4;36948:25;:50::i;16347:43::-;;;;;;;;;;;;;;;:::o;23240:659::-;23529:16;23547:14;23574:12;23589:41;23609:7;23618:5;23625:4;23589:19;:41::i;:::-;23574:56;;23641:10;23654;:33;;23678:9;23654:33;;;23672:2;23654:33;23698:75;;;;;;23721:10;23698:75;;;;23741:4;23698:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23641:46;;-1:-1:-1;;;;;;23698:22:0;;;;;:75;;;;;-1:-1:-1;;23698:75:0;;;;;;;;-1:-1:-1;23698:22:0;:75;;;2:2:-1;;;;27:1;24;17:12;2:2;23698:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23698:75:0;;;;23811:80;23830:5;23837:9;23848:14;23864:12;23878:2;23882:8;23811:18;:80::i;:::-;23784:107;;;;-1:-1:-1;23240:659:0;-1:-1:-1;;;;;;;;;;;;;23240:659:0:o;19302:728::-;19590:12;19604;19618:14;19571:8;16461:15;16449:8;:27;;16441:61;;;;;-1:-1:-1;;;16441:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19666:85:::1;19680:6;19688;19696:14;19712;19728:10;19740;19666:13;:85::i;:::-;19645:106:::0;;-1:-1:-1;19645:106:0;-1:-1:-1;19762:12:0::1;19777:44;19797:7;19806:6:::0;19814;19777:19:::1;:44::i;:::-;19762:59;;19832:66;19864:6;19872:10;19884:4;19890:7;19832:31;:66::i;:::-;19909;19941:6;19949:10;19961:4;19967:7;19909:31;:66::i;:::-;20008:4;-1:-1:-1::0;;;;;19998:20:0::1;;20019:2;19998:24;;;;;;;;;;;;;-1:-1:-1::0;;;;;19998:24:0::1;-1:-1:-1::0;;;;;19998:24:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19998:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19998:24:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19998:24:0;19302:728;;;;-1:-1:-1;19998:24:0;;-1:-1:-1;19302:728:0;;-1:-1:-1;;;;;;;;;19302:728:0:o;17538:179::-;17632:11;;-1:-1:-1;;;;;17632:11:0;17618:10;:25;17610:61;;;;;-1:-1:-1;;;17610:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17682:21:0;;;;;;;;:11;:21;;;;;:27;;;;;;;;;;;;;17538:179::o;20036:964::-;20289:16;20307:14;20323;20270:8;16461:15;16449:8;:27;;16441:61;;;;;-1:-1:-1;;;16441:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20377:176:::1;20405:5;20425:4;20444:18;20477:9;20501:14;20530:12;20377:13;:176::i;:::-;20350:203:::0;;-1:-1:-1;20350:203:0;-1:-1:-1;20564:12:0::1;20579:41;20599:7;20608:5:::0;20615:4:::1;20579:19;:41::i;:::-;20564:56;;20631:69;20663:5;20670:10;20682:4;20688:11;20631:31;:69::i;:::-;20717:4;-1:-1:-1::0;;;;;20711:19:0::1;;20738:9;20711:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;20711:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20711:39:0;;;;;20774:4;-1:-1:-1::0;;;;;20768:20:0::1;;20789:4;20795:9;20768:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;20768:37:0::1;-1:-1:-1::0;;;;;20768:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;20768:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20768:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;20768:37:0;20761:45:::1;;;;20839:4;-1:-1:-1::0;;;;;20829:20:0::1;;20850:2;20829:24;;;;;;;;;;;;;-1:-1:-1::0;;;;;20829:24:0::1;-1:-1:-1::0;;;;;20829:24:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;20829:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20829:24:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;20829:24:0;;-1:-1:-1;20904:9:0::1;:21:::0;-1:-1:-1;20900:92:0::1;;;20927:65;20958:10;20982:9;20970;:21;20927:30;:65::i;:::-;16513:1;20036:964:::0;;;;;;;;;;;:::o;16920:148::-;16996:11;;-1:-1:-1;;;;;16996:11:0;16982:10;:25;16974:61;;;;;-1:-1:-1;;;16974:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17046:5;:14;;;;-1:-1:-1;;;;;17046:14:0;;;;;;;;;;16920:148::o;28926:794::-;29139:21;29111:8;16461:15;16449:8;:27;;16441:61;;;;;-1:-1:-1;;;16441:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29197:4:::1;-1:-1:-1::0;;;;;29186:15:0::1;:4;;29191:1;29186:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29186:7:0::1;-1:-1:-1::0;;;;;29186:15:0::1;;29178:54;;;::::0;;-1:-1:-1;;;29178:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;29253:50;29278:7;29287:9;29298:4;;29253:50;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29253:24:0::1;::::0;-1:-1:-1;;;29253:50:0:i:1;:::-;29243:60;;29336:9;29322:7;29330:1;29322:10;;;;;;;;;;;;;;:23;;29314:72;;;;-1:-1:-1::0;;;29314:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29403:4;-1:-1:-1::0;;;;;29397:19:0::1;;29424:7;29432:1;29424:10;;;;;;;;;;;;;;29397:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;29397:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29397:40:0;;;;;29461:4;-1:-1:-1::0;;;;;29455:20:0::1;;29476:46;29496:7;29505:4;;29510:1;29505:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29505:7:0::1;29514:4;;29519:1;29514:7;;;;;;29476:46;29524:7;29532:1;29524:10;;;;;;;;;;;;;;29455:80;;;;;;;;;;;;;-1:-1:-1::0;;;;;29455:80:0::1;-1:-1:-1::0;;;;;29455:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;29455:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29455:80:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;29455:80:0;29448:88:::1;;;;29547:24;29553:7;29562:4;;29547:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29568:2:0;;-1:-1:-1;29547:5:0::1;::::0;-1:-1:-1;;29547:24:0:i:1;:::-;29634:7;29642:1;29634:10;;;;;;;;;;;;;;29622:9;:22;29618:94;;;29646:66;29677:10;29701:7;29709:1;29701:10;;;;;;;;;;;;;;29689:9;:22;29646:30;:66::i;670:361::-:0;865:45;;;-1:-1:-1;;;;;865:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;865:45:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;865:45:0;179:29:-1;160:49;;854:57:0;;;;819:12;;833:17;;854:10;;;;865:45;854:57;;;25:18:-1;854:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;854:57:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;818:93:0;;;;930:7;:57;;;;-1:-1:-1;942:11:0;;:16;;:44;;;973:4;962:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;962:24:0;942:44;922:101;;;;;-1:-1:-1;;;922:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;670:361;;;;;:::o;1449:195::-;1557:12;;;1519;1557;;;;;;;;;-1:-1:-1;;;;;1536:7:0;;;1550:5;;1536:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1536:34:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1518:52:0;;;1589:7;1581:55;;;;-1:-1:-1;;;1581:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1449:195;;;:::o;12614:509::-;12707:14;12753:1;12742:8;:12;12734:63;;;;-1:-1:-1;;;12734:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12828:1;12816:9;:13;:31;;;;;12846:1;12833:10;:14;12816:31;12808:79;;;;-1:-1:-1;;;12808:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12898:20;12921:18;:8;12934:4;12921:18;:12;:18;:::i;:::-;12898:41;-1:-1:-1;12950:14:0;12967:31;12898:41;12987:10;12967:31;:19;:31;:::i;:::-;12950:48;-1:-1:-1;13009:16:0;13028:41;13053:15;13028:20;:9;13042:5;13028:20;:13;:20;:::i;:::-;:24;:41;:24;:41;:::i;:::-;13009:60;;13104:11;13092:9;:23;;;;;;;12614:509;-1:-1:-1;;;;;;;12614:509:0:o;13790:506::-;13891:21;13948:1;13933:4;:11;:16;;13925:54;;;;;-1:-1:-1;;;13925:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14011:4;:11;14000:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14000:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14000:23:0;;13990:33;;14047:8;14034:7;14042:1;14034:10;;;;;;;;;;;;;:21;;;;;14071:6;14066:223;14097:1;14083:4;:11;:15;14079:1;:19;14066:223;;;14121:14;14137:15;14156:42;14168:7;14177:4;14182:1;14177:7;;;;;;;;;;;;;;14186:4;14191:1;14195;14191:5;14186:11;;;;;;;;;;;;;;14156;:42::i;:::-;14120:78;;;;14230:47;14243:7;14251:1;14243:10;;;;;;;;;;;;;;14255:9;14266:10;14230:12;:47::i;:::-;14213:7;14221:1;14225;14221:5;14213:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;14100:3:0;;14066:223;;;;13790:506;;;;;:::o;34695:946::-;34922:4;-1:-1:-1;;;;;34897:29:0;:4;34916:1;34902:4;:11;:15;34897:21;;;;;;;;;;;;;;-1:-1:-1;;;;;34897:29:0;;34889:68;;;;;-1:-1:-1;;;34889:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34968:134;35014:4;35019:1;35014:7;;;;;;;;;;;;;;35023:10;35035:46;35055:7;35064:4;35069:1;35064:7;;;;;;;;;;;;;;35073:4;35078:1;35073:7;;;;;;;;;;;;;;35035:19;:46::i;:::-;35083:8;34968:31;:134::i;:::-;35113:57;35150:4;35164;35113:34;:57::i;:::-;35198:37;;;;;;35229:4;35198:37;;;;;;35181:14;;-1:-1:-1;;;;;35205:4:0;35198:22;;;;:37;;;;;;;;;;;;;;;:22;:37;;;2:2:-1;;;;27:1;24;17:12;2:2;35198:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35198:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35198:37:0;35246:31;;;;;;;;;;;;;;35198:37;;-1:-1:-1;;;;;;35252:4:0;35246:20;;;;:31;;;;;-1:-1:-1;;35246:31:0;;;;;;;;-1:-1:-1;35246:20:0;:31;;;2:2:-1;;;;27:1;24;17:12;2:2;35246:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;35314:11:0;;35288:8;;-1:-1:-1;35314:15:0;;;;-1:-1:-1;35314:38:0;;-1:-1:-1;35350:1:0;35333:5;-1:-1:-1;;;;;35333:5:0;:19;;35314:38;35311:164;;;35400:5;35386:11;;35374:9;:23;:31;;;;;35452:5;;35374:31;;;;-1:-1:-1;35420:43:0;;-1:-1:-1;;;;;35452:5:0;35374:31;35420:30;:43::i;:::-;35512:12;35505:3;35493:9;:15;:31;;35485:84;;;;-1:-1:-1;;;35485:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35580:51;35611:2;35627:3;35615:9;:15;35580:30;:51::i;14377:527::-;14478:21;14535:1;14520:4;:11;:16;;14512:54;;;;;-1:-1:-1;;;14512:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14598:4;:11;14587:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14587:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14587:23:0;;14577:33;;14651:9;14621:7;14646:1;14629:7;:14;:18;14621:27;;;;;;;;;;;;;;;;;:39;14685:11;;:15;;14671:226;14702:5;;14671:226;;14730:14;14746:15;14765:42;14777:7;14786:4;14795:1;14791;:5;14786:11;;;;;;;;;;;;;;14799:4;14804:1;14799:7;;;;;;;14765:42;14729:78;;;;14839:46;14851:7;14859:1;14851:10;;;;;;;;;;;;;;14863:9;14874:10;14839:11;:46::i;:::-;14822:7;14834:1;14830;:5;14822:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;14709:3:0;;14671:226;;11031:550;11120:12;11146:14;11162;11180:26;11191:6;11199;11180:10;:26::i;:::-;11226:45;;;;;;-1:-1:-1;;;;;11226:45:0;;;;;;;;;;;;;;;;11145:61;;-1:-1:-1;11145:61:0;;-1:-1:-1;11226:29:0;;;;;:45;;;;;;;;;;;;;;;:29;:45;;;2:2:-1;;;;27:1;24;17:12;2:2;11226:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11226:45:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11226:45:0;;11031:550;-1:-1:-1;;;;;;11031:550:0:o;31061:1997::-;31259:8;31278:18;31307:17;31335:4;31307:33;;31456:1;31442:11;;:15;:38;;;;-1:-1:-1;31478:1:0;31461:5;-1:-1:-1;;;;;31461:5:0;:19;;31442:38;:102;;;;;31485:11;:20;31497:4;31502:1;31497:7;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31485:20:0;;;;;;;;;;;-1:-1:-1;31485:20:0;;;;;:58;;;31509:11;:34;31521:4;31540:1;31526:4;:11;:15;31521:21;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31509:34:0;;;;;;;;;;;-1:-1:-1;31509:34:0;;;;31485:58;31439:629;;;31563:11;:20;31575:4;31580:1;31575:7;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31563:20:0;;;;;;;;;;;-1:-1:-1;31563:20:0;;;;31560:452;;;31634:5;31620:11;;31609:8;:22;:30;;;;;;31603:36;;31658:79;31691:4;31696:1;31691:7;;;;;;;;;;;;;;31700:10;31720:4;31728:8;31658:31;:79::i;:::-;31756:48;31784:4;31789:1;31784:7;;;;;;;;;;;;;;;;;;31793:5;;-1:-1:-1;;;;;31793:5:0;31800:3;31756:27;:48::i;:::-;31823:101;31851:4;31856:1;31851:7;;;;;;;;;;;;;;31861:46;31881:7;31890:4;31895:1;31890:7;;;;;;;;;;;;;;31899:4;31904:1;31899:7;;;;;;;31861:46;31920:3;31909:8;:14;31823:27;:101::i;:::-;-1:-1:-1;31959:4:0;;-1:-1:-1;31994:2:0;31560:452;31439:629;;;-1:-1:-1;32054:2:0;31439:629;32082:13;32078:163;;32111:118;32144:4;32149:1;32144:7;;;;;;;;;;;;;;32153:10;32165:46;32185:7;32194:4;32199:1;32194:7;;;;;;;;;;;;;;32203:4;32208:1;32203:7;;;;;;;32165:46;32224:3;32213:8;:14;32111:31;:118::i;:::-;32251:18;32279:4;32298:1;32284:4;:11;:15;32279:21;;;;;;;;;;;;;;-1:-1:-1;;;;;32272:39:0;;32312:2;32272:43;;;;;;;;;;;;;-1:-1:-1;;;;;32272:43:0;-1:-1:-1;;;;;32272:43:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32272:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32272:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32272:43:0;;-1:-1:-1;32326:51:0;32361:4;32367:9;32326:34;:51::i;:::-;32407:1;32393:11;;:15;:39;;;;-1:-1:-1;32430:1:0;32413:5;-1:-1:-1;;;;;32413:5:0;:19;;32393:39;:103;;;;;32437:11;:20;32449:4;32454:1;32449:7;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32437:20:0;;;;;;;;;;;-1:-1:-1;32437:20:0;;;;;:58;;;32461:11;:34;32473:4;32492:1;32478:4;:11;:15;32473:21;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32461:34:0;;;;;;;;;;;-1:-1:-1;32461:34:0;;;;32437:58;32390:482;;;32516:11;:20;32528:4;32533:1;32528:7;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32516:20:0;;;;;;;;;;;-1:-1:-1;32516:20:0;;;;32512:349;;32556:12;32578:4;32597:1;32583:4;:11;:15;32578:21;;;;;;;;;;;;;;-1:-1:-1;;;;;32571:39:0;;32611:9;32571:50;;;;;;;;;;;;;-1:-1:-1;;;;;32571:50:0;-1:-1:-1;;;;;32571:50:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32571:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32571:50:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32571:50:0;32656:11;;32571:50;;-1:-1:-1;32670:5:0;;32646:21;;:29;32640:35;;32694:70;32722:4;32741:1;32727:4;:11;:15;32722:21;;;;;;;;;;;;;;32745:2;32760:3;32750:7;:13;32694:27;:70::i;:::-;32783:62;32811:4;32830:1;32816:4;:11;:15;32811:21;;;;;;;;;;;;;;;;;;32834:5;;-1:-1:-1;;;;;32834:5:0;32841:3;32783:27;:62::i;:::-;32512:349;;32970:12;32904:62;32952:13;32911:4;32930:1;32916:4;:11;:15;32911:21;;;;;;;;;;;;;;-1:-1:-1;;;;;32904:39:0;;32944:2;32904:43;;;;;;;;;;;;;-1:-1:-1;;;;;32904:43:0;-1:-1:-1;;;;;32904:43:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32904:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32904:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32904:43:0;;:62;:47;:62;:::i;:::-;:78;;32882:168;;;;-1:-1:-1;;;32882:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31061:1997;;;;;;;;:::o;1039:402::-;1264:51;;;-1:-1:-1;;;;;1264:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1264:51:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;1264:51:0;179:29:-1;160:49;;1253:63:0;;;;1218:12;;1232:17;;1253:10;;;;1264:51;1253:63;;;25:18:-1;1253:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1253:63:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1217:99:0;;;;1335:7;:57;;;;-1:-1:-1;1347:11:0;;:16;;:44;;;1378:4;1367:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1367:24:0;1347:44;1327:106;;;;-1:-1:-1;;;1327:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25503:715;25610:6;25605:606;25636:1;25622:4;:11;:15;25618:1;:19;25605:606;;;25660:13;25675:14;25694:4;25699:1;25694:7;;;;;;;;;;;;;;25703:4;25708:1;25712;25708:5;25703:11;;;;;;;;;;;;;;25659:56;;;;25731:14;25750:37;25773:5;25780:6;25750:22;:37::i;:::-;25730:57;;;25802:14;25819:7;25827:1;25831;25827:5;25819:14;;;;;;;;;;;;;;25802:31;;25849:15;25866;25894:6;-1:-1:-1;;;;;25885:15:0;:5;-1:-1:-1;;;;;25885:15:0;;:61;;25927:9;25943:1;25885:61;;;25909:1;25913:9;25885:61;25848:98;;;;25961:10;25992:1;25978:4;:11;:15;25974:1;:19;:77;;26048:3;25974:77;;;25996:49;26016:7;26025:6;26033:4;26038:1;26042;26038:5;26033:11;;;;;;;25996:49;25961:90;;26076:43;26096:7;26105:5;26112:6;26076:19;:43::i;:::-;-1:-1:-1;;;;;26066:59:0;;26144:10;26156;26168:2;26182:1;26172:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;26172:12:0;87:42:-1;143:17;;-1:-1;26172:12:0;;26066:133;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26066:133:0;-1:-1:-1;;;;;26066:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;26066:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26066:133:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;25639:3:0;;;;;-1:-1:-1;25605:606:0;;-1:-1:-1;;;;;;;;25605:606:0;33425:933;33614:4;-1:-1:-1;;;;;33603:15:0;:4;33608:1;33603:7;;;;;;;;;;;;;;-1:-1:-1;;;;;33603:15:0;;33595:54;;;;;-1:-1:-1;;;33595:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33722:11;;33676:9;;33660:13;;33722:15;;;;:39;;-1:-1:-1;33759:1:0;33742:5;-1:-1:-1;;;;;33742:5:0;:19;;33722:39;33719:164;;;33808:5;33794:11;;33783:8;:22;:30;;;;;33860:5;;33783:30;;;;-1:-1:-1;33828:43:0;;-1:-1:-1;;;;;33860:5:0;33783:30;33828;:43::i;:::-;33899:4;-1:-1:-1;;;;;33893:19:0;;33931:3;33920:8;:14;33893:44;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33893:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33893:44:0;;;;;33961:4;-1:-1:-1;;;;;33955:20:0;;33976:46;33996:7;34005:4;34010:1;34005:7;;;;;;;;;;;;;;34014:4;34019:1;34014:7;;;;;;;33976:46;34035:3;34024:8;:14;33955:84;;;;;;;;;;;;;-1:-1:-1;;;;;33955:84:0;-1:-1:-1;;;;;33955:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33955:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33955:84:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33955:84:0;33948:92;;;;34051:18;34079:4;34098:1;34084:4;:11;:15;34079:21;;;;;;;;;;;;;;-1:-1:-1;;;;;34072:39:0;;34112:2;34072:43;;;;;;;;;;;;;-1:-1:-1;;;;;34072:43:0;-1:-1:-1;;;;;34072:43:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34072:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34072:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34072:43:0;;-1:-1:-1;34126:45:0;34162:4;34168:2;34126:34;:45::i;:::-;34270:12;34204:62;34252:13;34211:4;34230:1;34216:4;:11;:15;34211:21;;;;;;;;;;;;;;-1:-1:-1;;;;;34204:39:0;;34244:2;34204:43;;;;;;;;;;;;;-1:-1:-1;;;;;34204:43:0;-1:-1:-1;;;;;34204:43:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;34204:62:0;:78;;34182:168;;;;-1:-1:-1;;;34182:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13244:464;13337:13;13383:1;13371:9;:13;13363:65;;;;-1:-1:-1;;;13363:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13459:1;13447:9;:13;:31;;;;;13477:1;13464:10;:14;13447:31;13439:79;;;;-1:-1:-1;;;13439:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13529:14;13546:35;13575:5;13546:24;:9;13560;13546:24;:13;:24;:::i;:::-;:28;:35;:28;:35;:::i;:::-;13529:52;-1:-1:-1;13592:16:0;13611:35;13641:4;13611:25;:10;13626:9;13611:25;:14;:25;:::i;:35::-;13592:54;;13668:32;13698:1;13681:11;13669:9;:23;;;;;;;13668:32;:29;:32;:::i;:::-;13657:43;13244:464;-1:-1:-1;;;;;;13244:464:0:o;12181:311::-;12263:12;12306:1;12296:7;:11;12288:56;;;;;-1:-1:-1;;;12288:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12374:1;12363:8;:12;:28;;;;;12390:1;12379:8;:12;12363:28;12355:76;;;;-1:-1:-1;;;12355:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12476:8;12452:21;:7;12464:8;12452:21;:11;:21;:::i;:::-;:32;;;;;;;12181:311;-1:-1:-1;;;;12181:311:0:o;10600:339::-;10675:14;10691;10736:6;-1:-1:-1;;;;;10726:16:0;:6;-1:-1:-1;;;;;10726:16:0;;;10718:61;;;;;-1:-1:-1;;;10718:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10818:6;-1:-1:-1;;;;;10809:15:0;:6;-1:-1:-1;;;;;10809:15:0;;:53;;10847:6;10855;10809:53;;;10828:6;10836;10809:53;10790:72;;-1:-1:-1;10790:72:0;-1:-1:-1;;;;;;10881:20:0;;10873:58;;;;;-1:-1:-1;;;10873:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10600:339;;;;;:::o;17937:1359::-;18250:45;;;;;;-1:-1:-1;;;;;18250:45:0;;;;;;;;;;;;;;;;18155:12;;;;;;18263:7;18250:29;;;;;;:45;;;;;;;;;;;;;;;:29;:45;;;2:2:-1;;;;27:1;24;17:12;2:2;18250:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18250:45:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;18250:45:0;-1:-1:-1;;;;;18250:59:0;;18246:140;;;18326:48;;;;;;-1:-1:-1;;;;;18326:48:0;;;;;;;;;;;;;;;;18339:7;18326:32;;;;;;:48;;;;;;;;;;;;;;;-1:-1:-1;18326:32:0;:48;;;2:2:-1;;;;27:1;24;17:12;2:2;18326:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18326:48:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;18246:140:0;18397:13;18412;18429:48;18453:7;18462:6;18470;18429:23;:48::i;:::-;18396:81;;;;18492:8;18504:1;18492:13;:30;;;;-1:-1:-1;18509:13:0;;18492:30;18488:801;;;18561:14;;-1:-1:-1;18577:14:0;;-1:-1:-1;18488:801:0;;;18625:19;18647:53;18665:14;18681:8;18691;18647:17;:53::i;:::-;18625:75;;18737:14;18719;:32;18715:563;;18798:10;18780:14;:28;;18772:76;;;;-1:-1:-1;;;18772:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18889:14;;-1:-1:-1;18905:14:0;-1:-1:-1;18905:14:0;18715:563;;;18961:19;18983:53;19001:14;19017:8;19027;18983:17;:53::i;:::-;18961:75;;19080:14;19062;:32;;19055:40;;;;19140:10;19122:14;:28;;19114:76;;;;-1:-1:-1;;;19114:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19231:14;-1:-1:-1;19247:14:0;;-1:-1:-1;18715:563:0;18488:801;;17937:1359;;;;;;;;;;;:::o;7782:142::-;7834:6;7861;;;:30;;-1:-1:-1;;7876:5:0;;;7890:1;7885;7876:5;7885:1;7871:15;;;;;:20;7861:30;7853:63;;;;;-1:-1:-1;;;7853:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;7509:128;7593:5;;;7588:16;;;;7580:49;;;;;-1:-1:-1;;;7580:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;11639:429;11732:13;11747;11774:14;11793:26;11804:6;11812;11793:10;:26::i;:::-;11773:46;;;11830:32;11838:7;11847:6;11855;11830:7;:32::i;:::-;;11874:13;11889;11917:32;11925:7;11934:6;11942;11917:7;:32::i;:::-;-1:-1:-1;;;;;11907:55:0;;:57;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11907:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11907:57:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11907:57:0;;;;;;;11873:91;;;;;-1:-1:-1;11873:91:0;;-1:-1:-1;;;;;;11998:16:0;;;;;;;:62;;12041:8;12051;11998:62;;;12018:8;12028;11998:62;11975:85;;;;-1:-1:-1;11639:429:0;-1:-1:-1;;;;;;;11639:429:0:o;29867:1186::-;29980:6;29975:1071;30006:1;29992:4;:11;:15;29988:1;:19;29975:1071;;;30030:13;30045:14;30064:4;30069:1;30064:7;;;;;;;;;;;;;;30073:4;30078:1;30082;30078:5;30073:11;;;;;;;;;;;;;;30029:56;;;;30101:14;30120:37;30143:5;30150:6;30120:22;:37::i;:::-;30100:57;;;30172:14;30199:43;30219:7;30228:5;30235:6;30199:19;:43::i;:::-;30172:71;;30258:16;30289:17;30377:13;30392;30410:4;-1:-1:-1;;;;;30410:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30410:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30410:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30410:18:0;;;;;;;30376:52;;;;;-1:-1:-1;30376:52:0;;-1:-1:-1;30444:17:0;;-1:-1:-1;;;;;30485:15:0;;;;;;;:61;;30527:8;30537;30485:61;;;30504:8;30514;30485:61;30443:103;;;;30575:56;30618:12;30582:5;-1:-1:-1;;;;;30575:23:0;;30607:4;30575:38;;;;;;;;;;;;;-1:-1:-1;;;;;30575:38:0;-1:-1:-1;;;;;30575:38:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;30575:56:0;30561:70;;30661:66;30686:11;30699:12;30713:13;30661:24;:66::i;:::-;30646:81;;29975:1071;;;;30760:15;30777;30805:6;-1:-1:-1;;;;;30796:15:0;:5;-1:-1:-1;;;;;30796:15:0;;:67;;30841:12;30860:1;30796:67;;;30820:1;30824:12;30796:67;30759:104;;;;30878:10;30909:1;30895:4;:11;:15;30891:1;:19;:77;;30965:3;30891:77;;;30913:49;30933:7;30942:6;30950:4;30955:1;30959;30955:5;30950:11;;;;;;;30913:49;31021:12;;;31031:1;31021:12;;;;;;;;;;30983:51;;;;;;;;;;;;;;;-1:-1:-1;;;;;30983:51:0;;;;;;;;;;;;;;;;;;;;;;30878:90;;-1:-1:-1;30983:9:0;;;;;;30993:10;;31005;;30878:90;;31021:12;;30983:51;;;;;;;;31021:12;;30983:51;;;;31021:12;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30983:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30983:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;30009:3:0;;;;;-1:-1:-1;29975:1071:0;;-1:-1:-1;;;;;;;;;;29975:1071:0;7645:129;7729:5;;;7724:16;;;;7716:50;;;;;-1:-1:-1;;;7716:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://fb8ee90cc71d482d54b2adadadaa6137ba9a683aa02b598085d923ab9128cba0

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.