Token leetswap.finance

DEX  DeFi  
 

Overview [ERC-20]

Price
$29.96 @ 0.009718 Eth (+563.56%)
Fully Diluted Market Cap
Max Total Supply:
1,337,000 LEET

Holders:
4,188 ( 0.024%)

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

LeetSwap is an emerging DEX and DeFi ecosystem built on the leetest blockchains with a focus on retaining a secure, fast, and user-friendly experience, while introducing novel approaches and ideas to the space.

Market

Volume (24H):$52.65
Market Capitalization:$0.00
Circulating Supply:0.00 LEET
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
LeetToken

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
london EvmVersion, GNU AGPLv3 license
File 1 of 12 : LeetToken.sol
// SPDX-License-Identifier: AGPL-3.0-only
//
// LEETSWAP
//
// The #1 DEX for leet degens
//
//
// Website: https://leetswap.finance
// Telegram: https://t.me/LeetSwap
// Twitter: https://twitter.com/LeetSwap
//
pragma solidity =0.8.17;

import "@leetswap/interfaces/ILiquidityManageable.sol";
import "@leetswap/dex/v2/interfaces/ILeetSwapV2Router01.sol";
import "@leetswap/dex/v2/interfaces/ILeetSwapV2Factory.sol";
import "@leetswap/dex/v2/interfaces/ILeetSwapV2Pair.sol";
import "@leetswap/tokens/interfaces/IFeeDiscountOracle.sol";
import {ERC20, IERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";

contract LeetToken is ERC20, Ownable, ILiquidityManageable {
    address public constant DEAD = 0x000000000000000000000000000000000000dEaD;
    uint256 public constant FEE_DENOMINATOR = 1e4;
    uint256 public constant MAX_FEE = 1000;

    uint256 public burnBuyFee;
    uint256 public farmsBuyFee;
    uint256 public stakingBuyFee;
    uint256 public treasuryBuyFee;
    uint256 public totalBuyFee;

    uint256 public burnSellFee;
    uint256 public farmsSellFee;
    uint256 public stakingSellFee;
    uint256 public treasurySellFee;
    uint256 public totalSellFee;

    address public farmsFeeRecipient;
    address public stakingFeeRecipient;
    address public treasuryFeeRecipient;

    bool public tradingEnabled;
    uint256 public tradingEnabledTimestamp = 0; // 0 means trading is not active

    ILeetSwapV2Router01 public swapFeesRouter;
    IFeeDiscountOracle public feeDiscountOracle;
    address public swapPairToken;
    bool public swappingFeesEnabled;
    bool public isSwappingFees;
    uint256 public swapFeesAtAmount;
    uint256 public maxSwapFeesAmount;
    uint256 public maxWalletAmount;

    uint256 public sniperBuyBaseFee = 0;
    uint256 public sniperBuyFeeDecayPeriod = 0;
    uint256 public sniperBuyFeeBurnShare = 2500;
    bool public sniperBuyFeeEnabled = true;

    uint256 public sniperSellBaseFee = 0;
    uint256 public sniperSellFeeDecayPeriod = 0;
    uint256 public sniperSellFeeBurnShare = 2500;
    bool public sniperSellFeeEnabled = true;

    bool public pairAutoDetectionEnabled;
    bool public indirectSwapFeeEnabled;
    bool public maxWalletEnabled;

    mapping(address => bool) public isExcludedFromFee;
    mapping(address => bool) public isLiquidityManager;
    mapping(address => bool) public isWhitelistedFactory;
    mapping(address => bool) public isBot;

    bool internal _isLiquidityManagementPhase;
    uint256 internal _currentCacheVersion;
    mapping(address => bool) internal _isLeetPair;
    mapping(uint256 => mapping(address => bool))
        internal _isCachedAutodetectedLeetPair;
    mapping(address => bool) internal _isExcludedFromMaxWallet;

    event BuyFeeUpdated(uint256 _fee, uint256 _previousFee);
    event SellFeeUpdated(uint256 _fee, uint256 _previousFee);
    event LeetPairAdded(address _pair);
    event LeetPairRemoved(address _pair);
    event AddressExcludedFromFees(address _address);
    event AddressIncludedInFees(address _address);
    event WhitelistedFactoryAdded(address _factory);
    event WhitelistedFactoryRemoved(address _factory);

    error TradingNotEnabled();
    error TradingAlreadyEnabled();
    error SniperBotDetected();
    error MaxWalletReached();
    error TimestampIsInThePast();
    error FeeTooHigh();
    error InvalidFeeRecipient();
    error NotLiquidityManager();
    error TransferFailed();
    error ArrayLengthMismatch();

    constructor(
        address _router,
        address _swapPairToken
    ) ERC20("leetswap.finance", "LEET") {
        ILeetSwapV2Router01 router = ILeetSwapV2Router01(_router);
        ILeetSwapV2Factory factory = ILeetSwapV2Factory(router.factory());
        swapPairToken = _swapPairToken;

        isExcludedFromFee[owner()] = true;
        isExcludedFromFee[address(this)] = true;
        isExcludedFromFee[DEAD] = true;

        _isExcludedFromMaxWallet[owner()] = true;
        _isExcludedFromMaxWallet[address(this)] = true;
        _isExcludedFromMaxWallet[DEAD] = true;

        burnBuyFee = 0;
        farmsBuyFee = 0;
        stakingBuyFee = 0;
        treasuryBuyFee = 0;
        setBuyFees(burnBuyFee, farmsBuyFee, stakingBuyFee, treasuryBuyFee);

        burnSellFee = 0;
        farmsSellFee = 150;
        stakingSellFee = 100;
        treasurySellFee = 50;
        setSellFees(burnSellFee, farmsSellFee, stakingSellFee, treasurySellFee);

        farmsFeeRecipient = owner();
        stakingFeeRecipient = owner();
        treasuryFeeRecipient = owner();

        isLiquidityManager[address(router)] = true;
        isWhitelistedFactory[address(factory)] = true;

        address pair = factory.createPair(address(this), swapPairToken);
        address feesVault = ILeetSwapV2Pair(pair).fees();
        _isExcludedFromMaxWallet[feesVault] = true;
        isExcludedFromFee[feesVault] = true;
        _isLeetPair[pair] = true;
        maxWalletEnabled = true;
        // pairAutoDetectionEnabled = true;

        _mint(owner(), 1337000 * 10 ** decimals());

        swapFeesRouter = router;
        swapFeesAtAmount = (totalSupply() * 3) / 1e5;
        maxSwapFeesAmount = (totalSupply() * 4) / 1e5;
        maxWalletAmount = (totalSupply() * 1) / 1e3; // 1% of the CIRCULATING supply
    }

    modifier onlyLiquidityManager() {
        if (!isLiquidityManager[msg.sender]) {
            revert NotLiquidityManager();
        }
        _;
    }

    /************************************************************************/

    function isLeetPair(address _pair) public returns (bool isPair) {
        if (_isLeetPair[_pair]) {
            return true;
        }

        if (!pairAutoDetectionEnabled) {
            return false;
        }

        if (_isCachedAutodetectedLeetPair[_currentCacheVersion][_pair]) {
            return true;
        }

        if (_pair.code.length == 0) {
            return false;
        }

        (bool success, bytes memory data) = _pair.staticcall(
            abi.encodeWithSignature("factory()")
        );
        if (!success) return false;
        address factory = abi.decode(data, (address));
        if (factory == address(0)) return false;

        bool isVerifiedPair = isWhitelistedFactory[factory] &&
            ILeetSwapV2Factory(factory).isPair(_pair);

        (success, data) = _pair.staticcall(abi.encodeWithSignature("token0()"));
        if (!success) return false;
        address token0 = abi.decode(data, (address));
        if (token0 == address(this)) {
            if (isVerifiedPair) {
                _isCachedAutodetectedLeetPair[_currentCacheVersion][
                    _pair
                ] = true;
            }

            return true;
        }

        (success, data) = _pair.staticcall(abi.encodeWithSignature("token1()"));
        if (!success) return false;
        address token1 = abi.decode(data, (address));
        if (token1 == address(this)) {
            if (isVerifiedPair) {
                _isCachedAutodetectedLeetPair[_currentCacheVersion][
                    _pair
                ] = true;
            }

            return true;
        }

        return false;
    }

    function _shouldTakeTransferTax(
        address sender,
        address recipient
    ) internal returns (bool) {
        if (isExcludedFromFee[sender] || isExcludedFromFee[recipient]) {
            return false;
        }

        return
            !_isLiquidityManagementPhase &&
            (isLeetPair(sender) || isLeetPair(recipient));
    }

    function sniperBuyFee() public view returns (uint256) {
        if (!sniperBuyFeeEnabled) {
            return 0;
        }

        uint256 timeSinceLaunch = block.timestamp - tradingEnabledTimestamp;

        if (timeSinceLaunch >= sniperBuyFeeDecayPeriod) {
            return 0;
        }

        return
            sniperBuyBaseFee -
            (sniperBuyBaseFee * timeSinceLaunch) /
            sniperBuyFeeDecayPeriod;
    }

    function sniperSellFee() public view returns (uint256) {
        if (!sniperSellFeeEnabled) {
            return 0;
        }

        uint256 timeSinceLaunch = block.timestamp - tradingEnabledTimestamp;

        if (timeSinceLaunch >= sniperSellFeeDecayPeriod) {
            return 0;
        }

        return
            sniperSellBaseFee -
            (sniperSellBaseFee * timeSinceLaunch) /
            sniperSellFeeDecayPeriod;
    }

    /************************************************************************/

    function buyFeeDiscountFor(
        address account,
        uint256 totalFeeAmount
    ) public view returns (uint256) {
        if (address(feeDiscountOracle) == address(0)) return 0;
        return feeDiscountOracle.buyFeeDiscountFor(account, totalFeeAmount);
    }

    function sellFeeDiscountFor(
        address account,
        uint256 totalFeeAmount
    ) public view returns (uint256) {
        if (address(feeDiscountOracle) == address(0)) return 0;
        return feeDiscountOracle.sellFeeDiscountFor(account, totalFeeAmount);
    }

    function _takeBuyFee(
        address sender,
        address user,
        uint256 amount
    ) internal returns (uint256) {
        if (totalBuyFee == 0) return 0;

        uint256 totalFeeAmount = (amount * totalBuyFee) / FEE_DENOMINATOR;
        uint256 feeDiscountAmount = buyFeeDiscountFor(user, totalFeeAmount);

        totalFeeAmount -= feeDiscountAmount;
        if (totalFeeAmount == 0) return 0;

        uint256 burnFeeAmount = (totalFeeAmount * burnBuyFee) / totalBuyFee;
        uint256 farmsFeeAmount = (totalFeeAmount * farmsBuyFee) / totalBuyFee;
        uint256 stakingFeeAmount = (totalFeeAmount * stakingBuyFee) /
            totalBuyFee;
        uint256 treasuryFeeAmount = totalFeeAmount -
            burnFeeAmount -
            farmsFeeAmount -
            stakingFeeAmount;

        if (burnFeeAmount > 0) super._transfer(sender, DEAD, burnFeeAmount);

        if (farmsFeeAmount > 0)
            super._transfer(sender, farmsFeeRecipient, farmsFeeAmount);

        if (stakingFeeAmount > 0)
            super._transfer(sender, stakingFeeRecipient, stakingFeeAmount);

        if (treasuryFeeAmount > 0)
            super._transfer(sender, address(this), treasuryFeeAmount);

        return totalFeeAmount;
    }

    function _takeSellFee(
        address sender,
        address user,
        uint256 amount
    ) internal returns (uint256) {
        if (totalSellFee == 0) return 0;

        uint256 totalFeeAmount = (amount * totalSellFee) / FEE_DENOMINATOR;
        uint256 feeDiscountAmount = sellFeeDiscountFor(user, totalFeeAmount);

        totalFeeAmount -= feeDiscountAmount;
        if (totalFeeAmount == 0) return 0;

        uint256 burnFeeAmount = (totalFeeAmount * burnSellFee) / totalSellFee;
        uint256 farmsFeeAmount = (totalFeeAmount * farmsSellFee) / totalSellFee;
        uint256 stakingFeeAmount = (totalFeeAmount * stakingSellFee) /
            totalSellFee;
        uint256 treasuryFeeAmount = totalFeeAmount -
            burnFeeAmount -
            farmsFeeAmount -
            stakingFeeAmount;

        if (burnFeeAmount > 0) super._transfer(sender, DEAD, burnFeeAmount);

        if (farmsFeeAmount > 0)
            super._transfer(sender, farmsFeeRecipient, farmsFeeAmount);

        if (stakingFeeAmount > 0)
            super._transfer(sender, stakingFeeRecipient, stakingFeeAmount);

        if (treasuryFeeAmount > 0)
            super._transfer(sender, address(this), treasuryFeeAmount);

        return totalFeeAmount;
    }

    function _takeSniperBuyFee(
        address sender,
        uint256 amount
    ) internal returns (uint256) {
        uint256 totalFeeAmount = (amount * sniperBuyFee()) / FEE_DENOMINATOR;
        uint256 burnFeeAmount = (totalFeeAmount * sniperBuyFeeBurnShare) /
            FEE_DENOMINATOR;
        uint256 treasuryFeeAmount = totalFeeAmount - burnFeeAmount;

        if (burnFeeAmount > 0) super._transfer(sender, DEAD, burnFeeAmount);

        if (treasuryFeeAmount > 0)
            super._transfer(sender, address(this), treasuryFeeAmount);

        return totalFeeAmount;
    }

    function _takeSniperSellFee(
        address sender,
        uint256 amount
    ) internal returns (uint256) {
        uint256 totalFeeAmount = (amount * sniperSellFee()) / FEE_DENOMINATOR;
        uint256 burnFeeAmount = (totalFeeAmount * sniperSellFeeBurnShare) /
            FEE_DENOMINATOR;
        uint256 treasuryFeeAmount = totalFeeAmount - burnFeeAmount;

        if (burnFeeAmount > 0) super._transfer(sender, DEAD, burnFeeAmount);

        if (treasuryFeeAmount > 0)
            super._transfer(sender, address(this), treasuryFeeAmount);

        return totalFeeAmount;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal override {
        if (
            !(tradingEnabled && tradingEnabledTimestamp <= block.timestamp) &&
            !isExcludedFromFee[sender] &&
            !isExcludedFromFee[recipient]
        ) {
            revert TradingNotEnabled();
        }

        if (isBot[sender] || isBot[recipient]) revert SniperBotDetected();

        if (
            maxWalletEnabled &&
            !isExcludedFromMaxWallet(recipient) &&
            balanceOf(recipient) + amount > maxWalletAmount
        ) revert MaxWalletReached();

        bool takeFee = !isSwappingFees &&
            _shouldTakeTransferTax(sender, recipient);
        bool isBuy = isLeetPair(sender);
        bool isSell = isLeetPair(recipient);
        bool isIndirectSwap = (_isLeetPair[sender] ||
            _isCachedAutodetectedLeetPair[_currentCacheVersion][sender]) &&
            (_isLeetPair[recipient] ||
                _isCachedAutodetectedLeetPair[_currentCacheVersion][recipient]);
        takeFee = takeFee && (indirectSwapFeeEnabled || !isIndirectSwap);

        uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwapFees = contractTokenBalance >= swapFeesAtAmount;
        bool isEOATransfer = sender.code.length == 0 &&
            recipient.code.length == 0;

        if (
            canSwapFees &&
            swappingFeesEnabled &&
            !isSwappingFees &&
            !_isLiquidityManagementPhase &&
            !isIndirectSwap &&
            (isSell || isEOATransfer) &&
            !isExcludedFromFee[sender] &&
            !isExcludedFromFee[recipient]
        ) {
            isSwappingFees = true;
            _swapFees();
            isSwappingFees = false;
        }

        uint256 totalFeeAmount;
        if (takeFee) {
            if (isSell) {
                totalFeeAmount = _takeSellFee(sender, sender, amount);
                totalFeeAmount += _takeSniperSellFee(sender, amount);
            } else if (isBuy) {
                totalFeeAmount = _takeBuyFee(sender, recipient, amount);
                totalFeeAmount += _takeSniperBuyFee(sender, amount);
            }
        }

        super._transfer(sender, recipient, amount - totalFeeAmount);
    }

    /************************************************************************/

    function _swapFees() internal {
        uint256 contractTokenBalance = balanceOf(address(this));
        uint256 amountToSwap = contractTokenBalance > maxSwapFeesAmount
            ? maxSwapFeesAmount
            : contractTokenBalance;

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = swapPairToken;

        _approve(address(this), address(swapFeesRouter), amountToSwap);
        swapFeesRouter.swapExactTokensForTokens(
            amountToSwap,
            0,
            path,
            treasuryFeeRecipient,
            block.timestamp
        );
    }

    /************************************************************************/

    function isLiquidityManagementPhase() external view returns (bool) {
        return _isLiquidityManagementPhase;
    }

    function setLiquidityManagementPhase(
        bool isLiquidityManagementPhase_
    ) external onlyLiquidityManager {
        _isLiquidityManagementPhase = isLiquidityManagementPhase_;
    }

    /************************************************************************/

    function withdrawStuckEth(uint256 amount) public onlyOwner {
        (bool success, ) = address(msg.sender).call{value: amount}("");
        if (!success) revert TransferFailed();
    }

    function withdrawStuckEth() public onlyOwner {
        withdrawStuckEth(address(this).balance);
    }

    function withdrawStuckTokens(
        IERC20 token,
        uint256 amount
    ) public onlyOwner {
        bool success = token.transfer(msg.sender, amount);
        if (!success) revert TransferFailed();
    }

    function withdrawStuckTokens(IERC20 token) public onlyOwner {
        uint256 balance = token.balanceOf(address(this));
        withdrawStuckTokens(token, balance);
    }

    function airdropHolders(
        address[] memory wallets,
        uint256[] memory amounts
    ) external onlyOwner {
        if (wallets.length != amounts.length) {
            revert ArrayLengthMismatch();
        }

        for (uint256 i = 0; i < wallets.length; i++) {
            address wallet = wallets[i];
            uint256 amount = amounts[i];
            _transfer(msg.sender, wallet, amount);
        }
    }

    /************************************************************************/

    function isExcludedFromMaxWallet(
        address account
    ) public view returns (bool) {
        return _isExcludedFromMaxWallet[account] || _isLeetPair[account];
    }

    function excludeFromMaxWallet(address account) external onlyOwner {
        _isExcludedFromMaxWallet[account] = true;
    }

    function includeInMaxWallet(address account) external onlyOwner {
        _isExcludedFromMaxWallet[account] = false;
    }

    function setMaxWalletEnabled(bool enabled) external onlyOwner {
        maxWalletEnabled = enabled;
    }

    function setMaxWalletAmount(uint256 amount) external onlyOwner {
        maxWalletAmount = amount;
    }

    /************************************************************************/

    function addLeetPair(address _pair) external onlyOwner {
        _isLeetPair[_pair] = true;
        emit LeetPairAdded(_pair);
    }

    function removeLeetPair(address _pair) external onlyOwner {
        _isLeetPair[_pair] = false;
        emit LeetPairRemoved(_pair);
    }

    function excludeFromFee(address _account) external onlyOwner {
        isExcludedFromFee[_account] = true;
        emit AddressExcludedFromFees(_account);
    }

    function includeInFee(address _account) external onlyOwner {
        isExcludedFromFee[_account] = false;
        emit AddressIncludedInFees(_account);
    }

    function setFarmsFeeRecipient(address _account) external onlyOwner {
        if (_account == address(0)) {
            revert InvalidFeeRecipient();
        }
        farmsFeeRecipient = _account;
    }

    function setStakingFeeRecipient(address _account) external onlyOwner {
        if (_account == address(0)) {
            revert InvalidFeeRecipient();
        }
        stakingFeeRecipient = _account;
    }

    function setTreasuryFeeRecipient(address _account) external onlyOwner {
        if (_account == address(0)) {
            revert InvalidFeeRecipient();
        }

        treasuryFeeRecipient = _account;
    }

    function setBuyFees(
        uint256 _burnBuyFee,
        uint256 _farmsBuyFee,
        uint256 _stakingBuyFee,
        uint256 _treasuryBuyFee
    ) public onlyOwner {
        if (
            _burnBuyFee + _farmsBuyFee + _stakingBuyFee + _treasuryBuyFee >
            MAX_FEE
        ) {
            revert FeeTooHigh();
        }

        burnBuyFee = _burnBuyFee;
        farmsBuyFee = _farmsBuyFee;
        stakingBuyFee = _stakingBuyFee;
        treasuryBuyFee = _treasuryBuyFee;
        totalBuyFee = burnBuyFee + farmsBuyFee + stakingBuyFee + treasuryBuyFee;
    }

    function setSellFees(
        uint256 _burnSellFee,
        uint256 _farmsSellFee,
        uint256 _stakingSellFee,
        uint256 _treasurySellFee
    ) public onlyOwner {
        if (
            _burnSellFee + _farmsSellFee + _stakingSellFee + _treasurySellFee >
            MAX_FEE
        ) {
            revert FeeTooHigh();
        }

        burnSellFee = _burnSellFee;
        farmsSellFee = _farmsSellFee;
        stakingSellFee = _stakingSellFee;
        treasurySellFee = _treasurySellFee;
        totalSellFee =
            burnSellFee +
            farmsSellFee +
            stakingSellFee +
            treasurySellFee;
    }

    function setLiquidityManager(
        address _liquidityManager,
        bool _isManager
    ) public onlyOwner {
        isLiquidityManager[_liquidityManager] = _isManager;
    }

    function addWhitelistedFactory(address _factory) public onlyOwner {
        isWhitelistedFactory[_factory] = true;
    }

    function removeWhitelistedFactory(address _factory) public onlyOwner {
        isWhitelistedFactory[_factory] = false;
        _currentCacheVersion++;
    }

    function setIndirectSwapFeeEnabled(
        bool _indirectSwapFeeEnabled
    ) public onlyOwner {
        indirectSwapFeeEnabled = _indirectSwapFeeEnabled;
    }

    function enableTrading() public onlyOwner {
        if (tradingEnabled) revert TradingAlreadyEnabled();
        tradingEnabled = true;

        if (tradingEnabledTimestamp < block.timestamp) {
            tradingEnabledTimestamp = block.timestamp;
        }

        swappingFeesEnabled = true;
    }

    function setTradingEnabledTimestamp(uint256 _timestamp) public onlyOwner {
        if (tradingEnabled && tradingEnabledTimestamp <= block.timestamp) {
            revert TradingAlreadyEnabled();
        }

        if (tradingEnabled && _timestamp < block.timestamp) {
            revert TimestampIsInThePast();
        }

        tradingEnabledTimestamp = _timestamp;
    }

    function setPairAutoDetectionEnabled(
        bool _pairAutoDetectionEnabled
    ) public onlyOwner {
        pairAutoDetectionEnabled = _pairAutoDetectionEnabled;
    }

    function setSniperBuyFeeEnabled(
        bool _sniperBuyFeeEnabled
    ) public onlyOwner {
        sniperBuyFeeEnabled = _sniperBuyFeeEnabled;
    }

    function setSniperSellFeeEnabled(
        bool _sniperSellFeeEnabled
    ) public onlyOwner {
        sniperSellFeeEnabled = _sniperSellFeeEnabled;
    }

    function setSwapFeesAtAmount(uint256 _swapFeesAtAmount) public onlyOwner {
        swapFeesAtAmount = _swapFeesAtAmount;
    }

    function setMaxSwapFeesAmount(uint256 _maxSwapFeesAmount) public onlyOwner {
        maxSwapFeesAmount = _maxSwapFeesAmount;
    }

    function setSwappingFeesEnabled(
        bool _swappingFeesEnabled
    ) public onlyOwner {
        swappingFeesEnabled = _swappingFeesEnabled;
    }

    function setSwapFeesRouter(address _swapFeesRouter) public onlyOwner {
        swapFeesRouter = ILeetSwapV2Router01(_swapFeesRouter);
    }

    function setFeeDiscountOracle(IFeeDiscountOracle _oracle) public onlyOwner {
        feeDiscountOracle = _oracle;
    }

    function addBot(address account) public onlyOwner {
        isBot[account] = true;
    }

    function removeBot(address account) public onlyOwner {
        isBot[account] = false;
    }
}

File 2 of 12 : ILiquidityManageable.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

interface ILiquidityManageable {
    function setLiquidityManagementPhase(bool _isManagingLiquidity) external;

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

    function isLiquidityManagementPhase() external returns (bool);
}

File 3 of 12 : ILeetSwapV2Router01.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

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

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

    function WETH() external view returns (address);

    function wcanto() external view returns (IWCANTO);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 4 of 12 : ILeetSwapV2Factory.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

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

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

    function pairCodeHash() external pure returns (bytes32);

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

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

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

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

    function protocolFeesShare() external view returns (uint256);

    function protocolFeesRecipient() external view returns (address);

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

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

File 5 of 12 : ILeetSwapV2Pair.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

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

    function fees() external view returns (address);

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

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

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

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

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

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

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

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

    function token0() external view returns (address);

    function token1() external view returns (address);

    function stable() external view returns (bool);

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

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

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

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

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

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

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

File 6 of 12 : IFeeDiscountOracle.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

interface IFeeDiscountOracle {
    function buyFeeDiscountFor(address account, uint256 totalFeeAmount)
        external
        view
        returns (uint256 discountAmount);

    function sellFeeDiscountFor(address account, uint256 totalFeeAmount)
        external
        view
        returns (uint256 discountAmount);
}

File 7 of 12 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

File 9 of 12 : IWCANTO.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

interface IWCANTO {
    function deposit() external payable;

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

    function withdraw(uint256) external;
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 11 of 12 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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

pragma solidity ^0.8.0;

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_swapPairToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"FeeTooHigh","type":"error"},{"inputs":[],"name":"InvalidFeeRecipient","type":"error"},{"inputs":[],"name":"MaxWalletReached","type":"error"},{"inputs":[],"name":"NotLiquidityManager","type":"error"},{"inputs":[],"name":"SniperBotDetected","type":"error"},{"inputs":[],"name":"TimestampIsInThePast","type":"error"},{"inputs":[],"name":"TradingAlreadyEnabled","type":"error"},{"inputs":[],"name":"TradingNotEnabled","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"}],"name":"AddressExcludedFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"}],"name":"AddressIncludedInFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_previousFee","type":"uint256"}],"name":"BuyFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pair","type":"address"}],"name":"LeetPairAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pair","type":"address"}],"name":"LeetPairRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_previousFee","type":"uint256"}],"name":"SellFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_factory","type":"address"}],"name":"WhitelistedFactoryAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_factory","type":"address"}],"name":"WhitelistedFactoryRemoved","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"addLeetPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"name":"addWhitelistedFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airdropHolders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"totalFeeAmount","type":"uint256"}],"name":"buyFeeDiscountFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"farmsBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"farmsFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"farmsSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeDiscountOracle","outputs":[{"internalType":"contract IFeeDiscountOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"indirectSwapFeeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"isLeetPair","outputs":[{"internalType":"bool","name":"isPair","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isLiquidityManagementPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLiquidityManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSwappingFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelistedFactory","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSwapFeesAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairAutoDetectionEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"removeLeetPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"name":"removeWhitelistedFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"totalFeeAmount","type":"uint256"}],"name":"sellFeeDiscountFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnBuyFee","type":"uint256"},{"internalType":"uint256","name":"_farmsBuyFee","type":"uint256"},{"internalType":"uint256","name":"_stakingBuyFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryBuyFee","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"setFarmsFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IFeeDiscountOracle","name":"_oracle","type":"address"}],"name":"setFeeDiscountOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_indirectSwapFeeEnabled","type":"bool"}],"name":"setIndirectSwapFeeEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isLiquidityManagementPhase_","type":"bool"}],"name":"setLiquidityManagementPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityManager","type":"address"},{"internalType":"bool","name":"_isManager","type":"bool"}],"name":"setLiquidityManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSwapFeesAmount","type":"uint256"}],"name":"setMaxSwapFeesAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setMaxWalletEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_pairAutoDetectionEnabled","type":"bool"}],"name":"setPairAutoDetectionEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnSellFee","type":"uint256"},{"internalType":"uint256","name":"_farmsSellFee","type":"uint256"},{"internalType":"uint256","name":"_stakingSellFee","type":"uint256"},{"internalType":"uint256","name":"_treasurySellFee","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_sniperBuyFeeEnabled","type":"bool"}],"name":"setSniperBuyFeeEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_sniperSellFeeEnabled","type":"bool"}],"name":"setSniperSellFeeEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"setStakingFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapFeesAtAmount","type":"uint256"}],"name":"setSwapFeesAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_swapFeesRouter","type":"address"}],"name":"setSwapFeesRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_swappingFeesEnabled","type":"bool"}],"name":"setSwappingFeesEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setTradingEnabledTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"setTreasuryFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sniperBuyBaseFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sniperBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sniperBuyFeeBurnShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sniperBuyFeeDecayPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sniperBuyFeeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sniperSellBaseFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sniperSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sniperSellFeeBurnShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sniperSellFeeDecayPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sniperSellFeeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapFeesAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapFeesRouter","outputs":[{"internalType":"contract ILeetSwapV2Router01","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapPairToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swappingFeesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabledTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasurySellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawStuckEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawStuckEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260006013819055601a819055601b8190556109c4601c819055601d8054600160ff199182168117909255601e849055601f93909355602091909155602180549092161790553480156200005657600080fd5b5060405162003b6638038062003b66833981016040819052620000799162000865565b6040518060400160405280601081526020016f6c656574737761702e66696e616e636560801b815250604051806040016040528060048152602001631311515560e21b8152508160039081620000d0919062000941565b506004620000df828262000941565b505050620000fc620000f66200057a60201b60201c565b6200057e565b60008290506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000142573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000168919062000a0d565b601680546001600160a01b0319166001600160a01b03861617905590506001602260006200019e6005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526022909252812080548316600190811790915561dead82527fb3dad1d3e53c1132e958712e36d3ff32b0d9b9088698eb172c6b4faa7ff6d22e80549093168117909255602a90620002266005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff19958616179055308152602a909252812080548316600190811790915561dead82527f4cd689f77827cc1daa8af882f386f3bb4a1440969e00e514a7b412fe9507a7a98054909316179091556006819055600781905560088190556009819055620002b990808080620005d0565b6000600b8190556096600c8190556064600d8190556032600e819055620002e39392919062000666565b600554601080546001600160a01b039283166001600160a01b03199182168117909255601180548216831790556012805490911690911790558281166000908152602360209081526040808320805460ff1990811660019081179092558686168086526024808652848720805490931690931790915560165483516364e329cb60e11b815230600482015296169186019190915290519293909263c9c6539692604480840193919291829003018187875af1158015620003a7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003cd919062000a0d565b90506000816001600160a01b0316639af1d35a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000410573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000436919062000a0d565b6001600160a01b038082166000908152602a60209081526040808320805460ff1990811660019081179092556022845282852080548216831790559488168452602890925290912080549092161790556021805463ff000000191663010000001790559050620004d5620004b26005546001600160a01b031690565b620004c06012600a62000b47565b620004cf90621466a862000b58565b620006fc565b601480546001600160a01b0319166001600160a01b038616179055620186a0620004fe60025490565b6200050b90600362000b58565b62000517919062000b72565b601755620186a06200052860025490565b6200053590600462000b58565b62000541919062000b72565b6018556103e86200055160025490565b6200055e90600162000b58565b6200056a919062000b72565b6019555062000bab945050505050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620005da620007e5565b6103e88183620005eb868862000b95565b620005f7919062000b95565b62000603919062000b95565b1115620006235760405163cd4e616760e01b815260040160405180910390fd5b6006849055600783905560088290556009819055808262000645858762000b95565b62000651919062000b95565b6200065d919062000b95565b600a5550505050565b62000670620007e5565b6103e8818362000681868862000b95565b6200068d919062000b95565b62000699919062000b95565b1115620006b95760405163cd4e616760e01b815260040160405180910390fd5b600b849055600c839055600d829055600e8190558082620006db858762000b95565b620006e7919062000b95565b620006f3919062000b95565b600f5550505050565b6001600160a01b038216620007585760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b80600260008282546200076c919062000b95565b90915550506001600160a01b038216600090815260208190526040812080548392906200079b90849062000b95565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b03163314620008415760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200074f565b565b505050565b80516001600160a01b03811681146200086057600080fd5b919050565b600080604083850312156200087957600080fd5b620008848362000848565b9150620008946020840162000848565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620008c857607f821691505b602082108103620008e957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200084357600081815260208120601f850160051c81016020861015620009185750805b601f850160051c820191505b81811015620009395782815560010162000924565b505050505050565b81516001600160401b038111156200095d576200095d6200089d565b62000975816200096e8454620008b3565b84620008ef565b602080601f831160018114620009ad5760008415620009945750858301515b600019600386901b1c1916600185901b17855562000939565b600085815260208120601f198616915b82811015620009de57888601518255948401946001909101908401620009bd565b5085821015620009fd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000a2057600080fd5b62000a2b8262000848565b9392505050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000a8957816000190482111562000a6d5762000a6d62000a32565b8085161562000a7b57918102915b93841c939080029062000a4d565b509250929050565b60008262000aa25750600162000b41565b8162000ab15750600062000b41565b816001811462000aca576002811462000ad55762000af5565b600191505062000b41565b60ff84111562000ae95762000ae962000a32565b50506001821b62000b41565b5060208310610133831016604e8410600b841016171562000b1a575081810a62000b41565b62000b26838362000a48565b806000190482111562000b3d5762000b3d62000a32565b0290505b92915050565b600062000a2b60ff84168362000a91565b808202811582820484141762000b415762000b4162000a32565b60008262000b9057634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562000b415762000b4162000a32565b612fab8062000bbb6000396000f3fe608060405234801561001057600080fd5b506004361061054b5760003560e01c80637ae3ff47116102ca578063bd7d67e91161018d578063e42fbb09116100f4578063f2a36d36116100ad578063f3d1504211610087578063f3d1504214610b8c578063fe0aa5b814610b9f578063fe9fb3fe14610bb2578063ffecf51614610bbb57600080fd5b8063f2a36d3614610b5e578063f2ed5aa314610b66578063f2fde38b14610b7957600080fd5b8063e42fbb0914610b0b578063ea0888b714610b14578063ea2f0b3714610b27578063ec45587f14610b3a578063ed0d213714610b4d578063eed0981014610b5657600080fd5b8063d73792a911610146578063d73792a914610a83578063db2f547914610a8c578063dcb7a3e014610a9f578063dd62ed3e14610ac2578063df89b34414610ad5578063e03325fa14610af857600080fd5b8063bd7d67e914610a16578063bdf2e8c614610a29578063c5d2c7c114610a3c578063cb96372814610a4f578063d045a32914610a62578063d32cd32714610a7657600080fd5b80639d9241ec11610231578063a9853b3a116101ea578063a9853b3a146109b8578063aa4bde28146109cb578063b6f45a5b146109d4578063b7d23e46146109e7578063bc063e1a146109fa578063bd61f0a614610a0357600080fd5b80639d9241ec1461094f578063a415274b14610958578063a457c2d71461096b578063a614ff751461097e578063a85fa81214610991578063a9059cbb146109a557600080fd5b80638bb9c5ea116102835780638bb9c5ea146108f35780638da5cb5b146109065780638e7e70191461091757806395d89b411461092b57806397038051146109335780639c20785b1461094657600080fd5b80637ae3ff47146108b55780637b693d71146108be5780637e761377146108d15780637fa787ba146108da578063896d2ecb146108e25780638a8c523c146108eb57600080fd5b80633bea3976116104125780635dd321c0116103795780636f3cf01e116103325780636f3cf01e1461084257806370a0823114610855578063715018a61461087e578063735492f71461088657806373c4002d1461089957806375ce383d146108a257600080fd5b80635dd321c0146107da5780635fecd926146107ed578063633afd281461080057806369abd8c4146108135780636c5b28551461081c5780636dd3d39f1461082f57600080fd5b80634bd369f4116103cb5780634bd369f41461076a5780635342acb41461077d5780635802e403146107a057806358a66ec4146107b357806359b107b9146107be5780635b700d91146107c757600080fd5b80633bea3976146106fd5780633f33e9091461070a578063437823ec1461071d57806343c5ebb5146107305780634ada218b146107435780634b00d3361461075757600080fd5b80631df30777116104b65780632c10508c1161046f5780632c10508c146106935780632fed1ea31461069c578063313ce567146106af57806332aab6d2146106be57806339509351146106c75780633bbac579146106da57600080fd5b80631df30777146106495780631ff9e7e71461065257806323b872dd1461065b578063245062861461066e57806325b617031461067757806327a14fc21461068057600080fd5b80630c3cfdf6116105085780630c3cfdf6146105ec578063113dac71146105f5578063115e6db614610608578063134148741461061b578063178d9b8e1461062e57806318160ddd1461064157600080fd5b806303fd2a4514610550578063059d3f901461057657806306fdde031461058d578063095ea7b3146105a25780630af20807146105c55780630bcbb28d146105d7575b600080fd5b61055961dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b61057f60085481565b60405190815260200161056d565b610595610bce565b60405161056d91906129df565b6105b56105b0366004612a27565b610c60565b604051901515815260200161056d565b6021546105b590610100900460ff1681565b6105ea6105e5366004612a53565b610c7a565b005b61057f60075481565b6105ea610603366004612a7e565b610ccb565b6021546105b59062010000900460ff1681565b6105ea610629366004612a7e565b610ced565b6105ea61063c366004612a9b565b610d13565b60025461057f565b61057f60185481565b61057f600d5481565b6105b5610669366004612acd565b610d9a565b61057f601f5481565b61057f60135481565b6105ea61068e366004612b0e565b610dc0565b61057f60095481565b601554610559906001600160a01b031681565b6040516012815260200161056d565b61057f601e5481565b6105b56106d5366004612a27565b610dcd565b6105b56106e8366004612a53565b60256020526000908152604090205460ff1681565b601d546105b59060ff1681565b6105ea610718366004612a53565b610def565b6105ea61072b366004612a53565b610e18565b6105ea61073e366004612a7e565b610e7b565b6012546105b590600160a01b900460ff1681565b6105ea610765366004612a53565b610e96565b6105ea610778366004612b0e565b610ee7565b6105b561078b366004612a53565b60226020526000908152604090205460ff1681565b6105ea6107ae366004612b0e565b610ef4565b60265460ff166105b5565b61057f600a5481565b6105ea6107d5366004612a53565b610f70565b6105ea6107e8366004612a53565b610f9c565b6105ea6107fb366004612a53565b610fed565b601654610559906001600160a01b031681565b61057f601b5481565b6105ea61082a366004612a9b565b611016565b6105b561083d366004612a53565b61109d565b601254610559906001600160a01b031681565b61057f610863366004612a53565b6001600160a01b031660009081526020819052604090205490565b6105ea6110de565b6105ea610894366004612a53565b6110f2565b61057f60175481565b601054610559906001600160a01b031681565b61057f60065481565b6105ea6108cc366004612a53565b611130565b61057f600b5481565b6105ea61115a565b61057f60205481565b6105ea61116b565b6105ea610901366004612a7e565b6111d5565b6005546001600160a01b0316610559565b6016546105b590600160a81b900460ff1681565b6105956111f0565b61057f610941366004612a27565b6111ff565b61057f601c5481565b61057f600f5481565b6105ea610966366004612a53565b611290565b6105b5610979366004612a27565b6112ec565b6105ea61098c366004612a7e565b611377565b6016546105b590600160a01b900460ff1681565b6105b56109b3366004612a27565b61139d565b6105ea6109c6366004612b0e565b6113ab565b61057f60195481565b6105b56109e2366004612a53565b611420565b601154610559906001600160a01b031681565b61057f6103e881565b6105ea610a11366004612a27565b61181b565b6105ea610a24366004612a7e565b6118bc565b6105ea610a37366004612b27565b6118ff565b601454610559906001600160a01b031681565b6105ea610a5d366004612a53565b611932565b6021546105b5906301000000900460ff1681565b6021546105b59060ff1681565b61057f61271081565b6105ea610a9a366004612a53565b6119b1565b6105b5610aad366004612a53565b60246020526000908152604090205460ff1681565b61057f610ad0366004612b60565b611a0a565b6105b5610ae3366004612a53565b60236020526000908152604090205460ff1681565b61057f610b06366004612a27565b611a35565b61057f600c5481565b6105ea610b22366004612a53565b611a89565b6105ea610b35366004612a53565b611ab3565b6105ea610b48366004612b0e565b611b0c565b61057f600e5481565b61057f611b19565b61057f611b7d565b6105ea610b74366004612c64565b611bdb565b6105ea610b87366004612a53565b611c6d565b6105ea610b9a366004612a53565b611ce6565b6105ea610bad366004612a7e565b611d12565b61057f601a5481565b6105ea610bc9366004612a53565b611d36565b606060038054610bdd90612d26565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0990612d26565b8015610c565780601f10610c2b57610100808354040283529160200191610c56565b820191906000526020600020905b815481529060010190602001808311610c3957829003601f168201915b5050505050905090565b600033610c6e818585611d62565b60019150505b92915050565b610c82611e86565b6001600160a01b038116610ca957604051630ed1b8b360e31b815260040160405180910390fd5b601180546001600160a01b0319166001600160a01b0392909216919091179055565b610cd3611e86565b602180549115156101000261ff0019909216919091179055565b610cf5611e86565b60168054911515600160a01b0260ff60a01b19909216919091179055565b610d1b611e86565b6103e88183610d2a8688612d76565b610d349190612d76565b610d3e9190612d76565b1115610d5d5760405163cd4e616760e01b815260040160405180910390fd5b60068490556007839055600882905560098190558082610d7d8587612d76565b610d879190612d76565b610d919190612d76565b600a5550505050565b600033610da8858285611ee0565b610db3858585611f5a565b60019150505b9392505050565b610dc8611e86565b601955565b600033610c6e818585610de08383611a0a565b610dea9190612d76565b611d62565b610df7611e86565b6001600160a01b03166000908152602a60205260409020805460ff19169055565b610e20611e86565b6001600160a01b038116600081815260226020908152604091829020805460ff1916600117905590519182527fe3da4d3a13a7d3ac8ea9148c4285574d2bee3f15c474073a168dc868351c180991015b60405180910390a150565b610e83611e86565b601d805460ff1916911515919091179055565b610e9e611e86565b6001600160a01b038116610ec557604051630ed1b8b360e31b815260040160405180910390fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b610eef611e86565b601755565b610efc611e86565b601254600160a01b900460ff168015610f1757504260135411155b15610f3557604051636b91f55d60e11b815260040160405180910390fd5b601254600160a01b900460ff168015610f4d57504281105b15610f6b576040516340ca936160e11b815260040160405180910390fd5b601355565b610f78611e86565b6001600160a01b03166000908152602a60205260409020805460ff19166001179055565b610fa4611e86565b6001600160a01b038116610fcb57604051630ed1b8b360e31b815260040160405180910390fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b610ff5611e86565b6001600160a01b03166000908152602560205260409020805460ff19169055565b61101e611e86565b6103e8818361102d8688612d76565b6110379190612d76565b6110419190612d76565b11156110605760405163cd4e616760e01b815260040160405180910390fd5b600b849055600c839055600d829055600e81905580826110808587612d76565b61108a9190612d76565b6110949190612d76565b600f5550505050565b6001600160a01b0381166000908152602a602052604081205460ff1680610c745750506001600160a01b031660009081526028602052604090205460ff1690565b6110e6611e86565b6110f06000612337565b565b6110fa611e86565b6001600160a01b0381166000908152602460205260408120805460ff19169055602780549161112883612d89565b919050555050565b611138611e86565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b611162611e86565b6110f0476113ab565b611173611e86565b601254600160a01b900460ff161561119e57604051636b91f55d60e11b815260040160405180910390fd5b6012805460ff60a01b1916600160a01b1790556013544211156111c057426013555b6016805460ff60a01b1916600160a01b179055565b6111dd611e86565b6021805460ff1916911515919091179055565b606060048054610bdd90612d26565b6015546000906001600160a01b031661121a57506000610c74565b601554604051639703805160e01b81526001600160a01b03858116600483015260248201859052909116906397038051906044015b602060405180830381865afa15801561126c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db99190612da2565b611298611e86565b6001600160a01b038116600081815260286020908152604091829020805460ff1916600117905590519182527fcf85921c8feeebfed4beb9f6e58085e5056e01e65b727c3dad2da2d3f3bbb8809101610e70565b600033816112fa8286611a0a565b90508381101561135f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b61136c8286868403611d62565b506001949350505050565b61137f611e86565b6021805491151563010000000263ff00000019909216919091179055565b600033610c6e818585611f5a565b6113b3611e86565b604051600090339083908381818185875af1925050503d80600081146113f5576040519150601f19603f3d011682016040523d82523d6000602084013e6113fa565b606091505b505090508061141c576040516312171d8360e31b815260040160405180910390fd5b5050565b6001600160a01b03811660009081526028602052604081205460ff161561144957506001919050565b602154610100900460ff1661146057506000919050565b60275460009081526029602090815260408083206001600160a01b038616845290915290205460ff161561149657506001919050565b816001600160a01b03163b6000036114b057506000919050565b60408051600481526024810182526020810180516001600160e01b031663c45a015560e01b179052905160009182916001600160a01b038616916114f391612dbb565b600060405180830381855afa9150503d806000811461152e576040519150601f19603f3d011682016040523d82523d6000602084013e611533565b606091505b509150915081611547575060009392505050565b60008180602001905181019061155d9190612dd7565b90506001600160a01b03811661157857506000949350505050565b6001600160a01b03811660009081526024602052604081205460ff168015611605575060405163e5e31b1360e01b81526001600160a01b03878116600483015283169063e5e31b1390602401602060405180830381865afa1580156115e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116059190612df4565b60408051600481526024810182526020810180516001600160e01b0316630dfe168160e01b17905290519192506001600160a01b038816916116479190612dbb565b600060405180830381855afa9150503d8060008114611682576040519150601f19603f3d011682016040523d82523d6000602084013e611687565b606091505b5090945092508361169e5750600095945050505050565b6000838060200190518101906116b49190612dd7565b9050306001600160a01b0382160361170a5781156116fd5760275460009081526029602090815260408083206001600160a01b038b1684529091529020805460ff191660011790555b5060019695505050505050565b60408051600481526024810182526020810180516001600160e01b031663d21220a760e01b17905290516001600160a01b0389169161174891612dbb565b600060405180830381855afa9150503d8060008114611783576040519150601f19603f3d011682016040523d82523d6000602084013e611788565b606091505b509095509350846117a0575060009695505050505050565b6000848060200190518101906117b69190612dd7565b9050306001600160a01b0382160361180d5782156117ff5760275460009081526029602090815260408083206001600160a01b038c1684529091529020805460ff191660011790555b506001979650505050505050565b506000979650505050505050565b611823611e86565b60405163a9059cbb60e01b8152336004820152602481018290526000906001600160a01b0384169063a9059cbb906044016020604051808303816000875af1158015611873573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118979190612df4565b9050806118b7576040516312171d8360e31b815260040160405180910390fd5b505050565b3360009081526023602052604090205460ff166118ec5760405163bf4a682160e01b815260040160405180910390fd5b6026805460ff1916911515919091179055565b611907611e86565b6001600160a01b03919091166000908152602360205260409020805460ff1916911515919091179055565b61193a611e86565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a59190612da2565b905061141c828261181b565b6119b9611e86565b6001600160a01b038116600081815260286020908152604091829020805460ff1916905590519182527fd43da13451ec70800119deba6dfa609b6b7d6615f08b03256f9c3047fda4ef179101610e70565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6015546000906001600160a01b0316611a5057506000610c74565b60155460405163701992fd60e11b81526001600160a01b038581166004830152602482018590529091169063e03325fa9060440161124f565b611a91611e86565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b611abb611e86565b6001600160a01b038116600081815260226020908152604091829020805460ff1916905590519182527f575f1ddbfda0dc04fc52273bb61713723c317a04c3f25438c2049dc898144fe29101610e70565b611b14611e86565b601855565b60215460009060ff16611b2c5750600090565b600060135442611b3c9190612e11565b9050601f548110611b4f57600091505090565b601f5481601e54611b609190612e24565b611b6a9190612e3b565b601e54611b779190612e11565b91505090565b601d5460009060ff16611b905750600090565b600060135442611ba09190612e11565b9050601b548110611bb357600091505090565b601b5481601a54611bc49190612e24565b611bce9190612e3b565b601a54611b779190612e11565b611be3611e86565b8051825114611c055760405163512509d360e11b815260040160405180910390fd5b60005b82518110156118b7576000838281518110611c2557611c25612e5d565b602002602001015190506000838381518110611c4357611c43612e5d565b60200260200101519050611c58338383611f5a565b50508080611c6590612d89565b915050611c08565b611c75611e86565b6001600160a01b038116611cda5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611356565b611ce381612337565b50565b611cee611e86565b6001600160a01b03166000908152602460205260409020805460ff19166001179055565b611d1a611e86565b60218054911515620100000262ff000019909216919091179055565b611d3e611e86565b6001600160a01b03166000908152602560205260409020805460ff19166001179055565b6001600160a01b038316611dc45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611356565b6001600160a01b038216611e255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611356565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b031633146110f05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611356565b6000611eec8484611a0a565b90506000198114611f545781811015611f475760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401611356565b611f548484848403611d62565b50505050565b601254600160a01b900460ff168015611f7557504260135411155b158015611f9b57506001600160a01b03831660009081526022602052604090205460ff16155b8015611fc057506001600160a01b03821660009081526022602052604090205460ff16155b15611fde576040516312f1f92360e01b815260040160405180910390fd5b6001600160a01b03831660009081526025602052604090205460ff168061201d57506001600160a01b03821660009081526025602052604090205460ff165b1561203b5760405163bfbf60b360e01b815260040160405180910390fd5b6021546301000000900460ff16801561205a57506120588261109d565b155b8015612090575060195481612084846001600160a01b031660009081526020819052604090205490565b61208e9190612d76565b115b156120ae57604051633ce8c2bd60e11b815260040160405180910390fd5b601654600090600160a81b900460ff161580156120d057506120d08484612389565b905060006120dd85611420565b905060006120ea85611420565b6001600160a01b0387166000908152602860205260408120549192509060ff168061213a575060275460009081526029602090815260408083206001600160a01b038b16845290915290205460ff165b801561218d57506001600160a01b03861660009081526028602052604090205460ff168061218d575060275460009081526029602090815260408083206001600160a01b038a16845290915290205460ff165b90508380156121ac575060215462010000900460ff16806121ac575080155b3060009081526020819052604081205460175492965091821015906001600160a01b038a163b1580156121e757506001600160a01b0389163b155b90508180156121ff5750601654600160a01b900460ff165b80156122155750601654600160a81b900460ff16155b8015612224575060265460ff16155b801561222e575083155b801561223e5750848061223e5750805b801561226357506001600160a01b038a1660009081526022602052604090205460ff16155b801561228857506001600160a01b03891660009081526022602052604090205460ff16155b156122b6576016805460ff60a81b1916600160a81b1790556122a86123fb565b6016805460ff60a81b191690555b600087156123165785156122ec576122cf8b8c8b612537565b90506122db8b8a612686565b6122e59082612d76565b9050612316565b8615612316576122fd8b8b8b612705565b90506123098b8a6127b6565b6123139082612d76565b90505b61232a8b8b612325848d612e11565b6127ed565b5050505050505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821660009081526022602052604081205460ff16806123c857506001600160a01b03821660009081526022602052604090205460ff165b156123d557506000610c74565b60265460ff16158015610db957506123ec83611420565b80610db95750610db982611420565b3060009081526020819052604081205490506000601854821161241e5781612422565b6018545b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061245c5761245c612e5d565b6001600160a01b03928316602091820292909201015260165482519116908290600190811061248d5761248d612e5d565b6001600160a01b0392831660209182029290920101526014546124b39130911684611d62565b6014546012546040516338ed173960e01b81526001600160a01b03928316926338ed1739926124f092879260009288929116904290600401612e73565b6000604051808303816000875af115801561250f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f549190810190612ee4565b6000600f5460000361254b57506000610db9565b6000612710600f548461255e9190612e24565b6125689190612e3b565b9050600061257685836111ff565b90506125828183612e11565b91508160000361259757600092505050610db9565b6000600f54600b54846125aa9190612e24565b6125b49190612e3b565b90506000600f54600c54856125c99190612e24565b6125d39190612e3b565b90506000600f54600d54866125e89190612e24565b6125f29190612e3b565b9050600081836126028689612e11565b61260c9190612e11565b6126169190612e11565b9050831561262b5761262b8a61dead866127ed565b821561264957601054612649908b906001600160a01b0316856127ed565b811561266757601154612667908b906001600160a01b0316846127ed565b8015612678576126788a30836127ed565b509398975050505050505050565b600080612710612694611b19565b61269e9085612e24565b6126a89190612e3b565b90506000612710602054836126bd9190612e24565b6126c79190612e3b565b905060006126d58284612e11565b905081156126ea576126ea8661dead846127ed565b80156126fb576126fb8630836127ed565b5090949350505050565b6000600a5460000361271957506000610db9565b6000612710600a548461272c9190612e24565b6127369190612e3b565b905060006127448583611a35565b90506127508183612e11565b91508160000361276557600092505050610db9565b6000600a54600654846127789190612e24565b6127829190612e3b565b90506000600a54600754856127979190612e24565b6127a19190612e3b565b90506000600a54600854866125e89190612e24565b6000806127106127c4611b7d565b6127ce9085612e24565b6127d89190612e3b565b90506000612710601c54836126bd9190612e24565b6001600160a01b0383166128515760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401611356565b6001600160a01b0382166128b35760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401611356565b6001600160a01b0383166000908152602081905260409020548181101561292b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401611356565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612962908490612d76565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129ae91815260200190565b60405180910390a3611f54565b60005b838110156129d65781810151838201526020016129be565b50506000910152565b60208152600082518060208401526129fe8160408501602087016129bb565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611ce357600080fd5b60008060408385031215612a3a57600080fd5b8235612a4581612a12565b946020939093013593505050565b600060208284031215612a6557600080fd5b8135610db981612a12565b8015158114611ce357600080fd5b600060208284031215612a9057600080fd5b8135610db981612a70565b60008060008060808587031215612ab157600080fd5b5050823594602084013594506040840135936060013592509050565b600080600060608486031215612ae257600080fd5b8335612aed81612a12565b92506020840135612afd81612a12565b929592945050506040919091013590565b600060208284031215612b2057600080fd5b5035919050565b60008060408385031215612b3a57600080fd5b8235612b4581612a12565b91506020830135612b5581612a70565b809150509250929050565b60008060408385031215612b7357600080fd5b8235612b7e81612a12565b91506020830135612b5581612a12565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612bcd57612bcd612b8e565b604052919050565b600067ffffffffffffffff821115612bef57612bef612b8e565b5060051b60200190565b600082601f830112612c0a57600080fd5b81356020612c1f612c1a83612bd5565b612ba4565b82815260059290921b84018101918181019086841115612c3e57600080fd5b8286015b84811015612c595780358352918301918301612c42565b509695505050505050565b60008060408385031215612c7757600080fd5b823567ffffffffffffffff80821115612c8f57600080fd5b818501915085601f830112612ca357600080fd5b81356020612cb3612c1a83612bd5565b82815260059290921b84018101918181019089841115612cd257600080fd5b948201945b83861015612cf9578535612cea81612a12565b82529482019490820190612cd7565b96505086013592505080821115612d0f57600080fd5b50612d1c85828601612bf9565b9150509250929050565b600181811c90821680612d3a57607f821691505b602082108103612d5a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c7457610c74612d60565b600060018201612d9b57612d9b612d60565b5060010190565b600060208284031215612db457600080fd5b5051919050565b60008251612dcd8184602087016129bb565b9190910192915050565b600060208284031215612de957600080fd5b8151610db981612a12565b600060208284031215612e0657600080fd5b8151610db981612a70565b81810381811115610c7457610c74612d60565b8082028115828204841417610c7457610c74612d60565b600082612e5857634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612ec35784516001600160a01b031683529383019391830191600101612e9e565b50506001600160a01b03969096166060850152505050608001529392505050565b60006020808385031215612ef757600080fd5b825167ffffffffffffffff811115612f0e57600080fd5b8301601f81018513612f1f57600080fd5b8051612f2d612c1a82612bd5565b81815260059190911b82018301908381019087831115612f4c57600080fd5b928401925b82841015612f6a57835182529284019290840190612f51565b97965050505050505056fea26469706673582212203e8f85159371c08761bdc0209831e7a92a276a93b57d08d39e53a2e5a7ab62ea64736f6c63430008110033000000000000000000000000fcd3842f85ed87ba2889b4d35893403796e67ff10000000000000000000000004200000000000000000000000000000000000006

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061054b5760003560e01c80637ae3ff47116102ca578063bd7d67e91161018d578063e42fbb09116100f4578063f2a36d36116100ad578063f3d1504211610087578063f3d1504214610b8c578063fe0aa5b814610b9f578063fe9fb3fe14610bb2578063ffecf51614610bbb57600080fd5b8063f2a36d3614610b5e578063f2ed5aa314610b66578063f2fde38b14610b7957600080fd5b8063e42fbb0914610b0b578063ea0888b714610b14578063ea2f0b3714610b27578063ec45587f14610b3a578063ed0d213714610b4d578063eed0981014610b5657600080fd5b8063d73792a911610146578063d73792a914610a83578063db2f547914610a8c578063dcb7a3e014610a9f578063dd62ed3e14610ac2578063df89b34414610ad5578063e03325fa14610af857600080fd5b8063bd7d67e914610a16578063bdf2e8c614610a29578063c5d2c7c114610a3c578063cb96372814610a4f578063d045a32914610a62578063d32cd32714610a7657600080fd5b80639d9241ec11610231578063a9853b3a116101ea578063a9853b3a146109b8578063aa4bde28146109cb578063b6f45a5b146109d4578063b7d23e46146109e7578063bc063e1a146109fa578063bd61f0a614610a0357600080fd5b80639d9241ec1461094f578063a415274b14610958578063a457c2d71461096b578063a614ff751461097e578063a85fa81214610991578063a9059cbb146109a557600080fd5b80638bb9c5ea116102835780638bb9c5ea146108f35780638da5cb5b146109065780638e7e70191461091757806395d89b411461092b57806397038051146109335780639c20785b1461094657600080fd5b80637ae3ff47146108b55780637b693d71146108be5780637e761377146108d15780637fa787ba146108da578063896d2ecb146108e25780638a8c523c146108eb57600080fd5b80633bea3976116104125780635dd321c0116103795780636f3cf01e116103325780636f3cf01e1461084257806370a0823114610855578063715018a61461087e578063735492f71461088657806373c4002d1461089957806375ce383d146108a257600080fd5b80635dd321c0146107da5780635fecd926146107ed578063633afd281461080057806369abd8c4146108135780636c5b28551461081c5780636dd3d39f1461082f57600080fd5b80634bd369f4116103cb5780634bd369f41461076a5780635342acb41461077d5780635802e403146107a057806358a66ec4146107b357806359b107b9146107be5780635b700d91146107c757600080fd5b80633bea3976146106fd5780633f33e9091461070a578063437823ec1461071d57806343c5ebb5146107305780634ada218b146107435780634b00d3361461075757600080fd5b80631df30777116104b65780632c10508c1161046f5780632c10508c146106935780632fed1ea31461069c578063313ce567146106af57806332aab6d2146106be57806339509351146106c75780633bbac579146106da57600080fd5b80631df30777146106495780631ff9e7e71461065257806323b872dd1461065b578063245062861461066e57806325b617031461067757806327a14fc21461068057600080fd5b80630c3cfdf6116105085780630c3cfdf6146105ec578063113dac71146105f5578063115e6db614610608578063134148741461061b578063178d9b8e1461062e57806318160ddd1461064157600080fd5b806303fd2a4514610550578063059d3f901461057657806306fdde031461058d578063095ea7b3146105a25780630af20807146105c55780630bcbb28d146105d7575b600080fd5b61055961dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b61057f60085481565b60405190815260200161056d565b610595610bce565b60405161056d91906129df565b6105b56105b0366004612a27565b610c60565b604051901515815260200161056d565b6021546105b590610100900460ff1681565b6105ea6105e5366004612a53565b610c7a565b005b61057f60075481565b6105ea610603366004612a7e565b610ccb565b6021546105b59062010000900460ff1681565b6105ea610629366004612a7e565b610ced565b6105ea61063c366004612a9b565b610d13565b60025461057f565b61057f60185481565b61057f600d5481565b6105b5610669366004612acd565b610d9a565b61057f601f5481565b61057f60135481565b6105ea61068e366004612b0e565b610dc0565b61057f60095481565b601554610559906001600160a01b031681565b6040516012815260200161056d565b61057f601e5481565b6105b56106d5366004612a27565b610dcd565b6105b56106e8366004612a53565b60256020526000908152604090205460ff1681565b601d546105b59060ff1681565b6105ea610718366004612a53565b610def565b6105ea61072b366004612a53565b610e18565b6105ea61073e366004612a7e565b610e7b565b6012546105b590600160a01b900460ff1681565b6105ea610765366004612a53565b610e96565b6105ea610778366004612b0e565b610ee7565b6105b561078b366004612a53565b60226020526000908152604090205460ff1681565b6105ea6107ae366004612b0e565b610ef4565b60265460ff166105b5565b61057f600a5481565b6105ea6107d5366004612a53565b610f70565b6105ea6107e8366004612a53565b610f9c565b6105ea6107fb366004612a53565b610fed565b601654610559906001600160a01b031681565b61057f601b5481565b6105ea61082a366004612a9b565b611016565b6105b561083d366004612a53565b61109d565b601254610559906001600160a01b031681565b61057f610863366004612a53565b6001600160a01b031660009081526020819052604090205490565b6105ea6110de565b6105ea610894366004612a53565b6110f2565b61057f60175481565b601054610559906001600160a01b031681565b61057f60065481565b6105ea6108cc366004612a53565b611130565b61057f600b5481565b6105ea61115a565b61057f60205481565b6105ea61116b565b6105ea610901366004612a7e565b6111d5565b6005546001600160a01b0316610559565b6016546105b590600160a81b900460ff1681565b6105956111f0565b61057f610941366004612a27565b6111ff565b61057f601c5481565b61057f600f5481565b6105ea610966366004612a53565b611290565b6105b5610979366004612a27565b6112ec565b6105ea61098c366004612a7e565b611377565b6016546105b590600160a01b900460ff1681565b6105b56109b3366004612a27565b61139d565b6105ea6109c6366004612b0e565b6113ab565b61057f60195481565b6105b56109e2366004612a53565b611420565b601154610559906001600160a01b031681565b61057f6103e881565b6105ea610a11366004612a27565b61181b565b6105ea610a24366004612a7e565b6118bc565b6105ea610a37366004612b27565b6118ff565b601454610559906001600160a01b031681565b6105ea610a5d366004612a53565b611932565b6021546105b5906301000000900460ff1681565b6021546105b59060ff1681565b61057f61271081565b6105ea610a9a366004612a53565b6119b1565b6105b5610aad366004612a53565b60246020526000908152604090205460ff1681565b61057f610ad0366004612b60565b611a0a565b6105b5610ae3366004612a53565b60236020526000908152604090205460ff1681565b61057f610b06366004612a27565b611a35565b61057f600c5481565b6105ea610b22366004612a53565b611a89565b6105ea610b35366004612a53565b611ab3565b6105ea610b48366004612b0e565b611b0c565b61057f600e5481565b61057f611b19565b61057f611b7d565b6105ea610b74366004612c64565b611bdb565b6105ea610b87366004612a53565b611c6d565b6105ea610b9a366004612a53565b611ce6565b6105ea610bad366004612a7e565b611d12565b61057f601a5481565b6105ea610bc9366004612a53565b611d36565b606060038054610bdd90612d26565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0990612d26565b8015610c565780601f10610c2b57610100808354040283529160200191610c56565b820191906000526020600020905b815481529060010190602001808311610c3957829003601f168201915b5050505050905090565b600033610c6e818585611d62565b60019150505b92915050565b610c82611e86565b6001600160a01b038116610ca957604051630ed1b8b360e31b815260040160405180910390fd5b601180546001600160a01b0319166001600160a01b0392909216919091179055565b610cd3611e86565b602180549115156101000261ff0019909216919091179055565b610cf5611e86565b60168054911515600160a01b0260ff60a01b19909216919091179055565b610d1b611e86565b6103e88183610d2a8688612d76565b610d349190612d76565b610d3e9190612d76565b1115610d5d5760405163cd4e616760e01b815260040160405180910390fd5b60068490556007839055600882905560098190558082610d7d8587612d76565b610d879190612d76565b610d919190612d76565b600a5550505050565b600033610da8858285611ee0565b610db3858585611f5a565b60019150505b9392505050565b610dc8611e86565b601955565b600033610c6e818585610de08383611a0a565b610dea9190612d76565b611d62565b610df7611e86565b6001600160a01b03166000908152602a60205260409020805460ff19169055565b610e20611e86565b6001600160a01b038116600081815260226020908152604091829020805460ff1916600117905590519182527fe3da4d3a13a7d3ac8ea9148c4285574d2bee3f15c474073a168dc868351c180991015b60405180910390a150565b610e83611e86565b601d805460ff1916911515919091179055565b610e9e611e86565b6001600160a01b038116610ec557604051630ed1b8b360e31b815260040160405180910390fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b610eef611e86565b601755565b610efc611e86565b601254600160a01b900460ff168015610f1757504260135411155b15610f3557604051636b91f55d60e11b815260040160405180910390fd5b601254600160a01b900460ff168015610f4d57504281105b15610f6b576040516340ca936160e11b815260040160405180910390fd5b601355565b610f78611e86565b6001600160a01b03166000908152602a60205260409020805460ff19166001179055565b610fa4611e86565b6001600160a01b038116610fcb57604051630ed1b8b360e31b815260040160405180910390fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b610ff5611e86565b6001600160a01b03166000908152602560205260409020805460ff19169055565b61101e611e86565b6103e8818361102d8688612d76565b6110379190612d76565b6110419190612d76565b11156110605760405163cd4e616760e01b815260040160405180910390fd5b600b849055600c839055600d829055600e81905580826110808587612d76565b61108a9190612d76565b6110949190612d76565b600f5550505050565b6001600160a01b0381166000908152602a602052604081205460ff1680610c745750506001600160a01b031660009081526028602052604090205460ff1690565b6110e6611e86565b6110f06000612337565b565b6110fa611e86565b6001600160a01b0381166000908152602460205260408120805460ff19169055602780549161112883612d89565b919050555050565b611138611e86565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b611162611e86565b6110f0476113ab565b611173611e86565b601254600160a01b900460ff161561119e57604051636b91f55d60e11b815260040160405180910390fd5b6012805460ff60a01b1916600160a01b1790556013544211156111c057426013555b6016805460ff60a01b1916600160a01b179055565b6111dd611e86565b6021805460ff1916911515919091179055565b606060048054610bdd90612d26565b6015546000906001600160a01b031661121a57506000610c74565b601554604051639703805160e01b81526001600160a01b03858116600483015260248201859052909116906397038051906044015b602060405180830381865afa15801561126c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db99190612da2565b611298611e86565b6001600160a01b038116600081815260286020908152604091829020805460ff1916600117905590519182527fcf85921c8feeebfed4beb9f6e58085e5056e01e65b727c3dad2da2d3f3bbb8809101610e70565b600033816112fa8286611a0a565b90508381101561135f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b61136c8286868403611d62565b506001949350505050565b61137f611e86565b6021805491151563010000000263ff00000019909216919091179055565b600033610c6e818585611f5a565b6113b3611e86565b604051600090339083908381818185875af1925050503d80600081146113f5576040519150601f19603f3d011682016040523d82523d6000602084013e6113fa565b606091505b505090508061141c576040516312171d8360e31b815260040160405180910390fd5b5050565b6001600160a01b03811660009081526028602052604081205460ff161561144957506001919050565b602154610100900460ff1661146057506000919050565b60275460009081526029602090815260408083206001600160a01b038616845290915290205460ff161561149657506001919050565b816001600160a01b03163b6000036114b057506000919050565b60408051600481526024810182526020810180516001600160e01b031663c45a015560e01b179052905160009182916001600160a01b038616916114f391612dbb565b600060405180830381855afa9150503d806000811461152e576040519150601f19603f3d011682016040523d82523d6000602084013e611533565b606091505b509150915081611547575060009392505050565b60008180602001905181019061155d9190612dd7565b90506001600160a01b03811661157857506000949350505050565b6001600160a01b03811660009081526024602052604081205460ff168015611605575060405163e5e31b1360e01b81526001600160a01b03878116600483015283169063e5e31b1390602401602060405180830381865afa1580156115e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116059190612df4565b60408051600481526024810182526020810180516001600160e01b0316630dfe168160e01b17905290519192506001600160a01b038816916116479190612dbb565b600060405180830381855afa9150503d8060008114611682576040519150601f19603f3d011682016040523d82523d6000602084013e611687565b606091505b5090945092508361169e5750600095945050505050565b6000838060200190518101906116b49190612dd7565b9050306001600160a01b0382160361170a5781156116fd5760275460009081526029602090815260408083206001600160a01b038b1684529091529020805460ff191660011790555b5060019695505050505050565b60408051600481526024810182526020810180516001600160e01b031663d21220a760e01b17905290516001600160a01b0389169161174891612dbb565b600060405180830381855afa9150503d8060008114611783576040519150601f19603f3d011682016040523d82523d6000602084013e611788565b606091505b509095509350846117a0575060009695505050505050565b6000848060200190518101906117b69190612dd7565b9050306001600160a01b0382160361180d5782156117ff5760275460009081526029602090815260408083206001600160a01b038c1684529091529020805460ff191660011790555b506001979650505050505050565b506000979650505050505050565b611823611e86565b60405163a9059cbb60e01b8152336004820152602481018290526000906001600160a01b0384169063a9059cbb906044016020604051808303816000875af1158015611873573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118979190612df4565b9050806118b7576040516312171d8360e31b815260040160405180910390fd5b505050565b3360009081526023602052604090205460ff166118ec5760405163bf4a682160e01b815260040160405180910390fd5b6026805460ff1916911515919091179055565b611907611e86565b6001600160a01b03919091166000908152602360205260409020805460ff1916911515919091179055565b61193a611e86565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a59190612da2565b905061141c828261181b565b6119b9611e86565b6001600160a01b038116600081815260286020908152604091829020805460ff1916905590519182527fd43da13451ec70800119deba6dfa609b6b7d6615f08b03256f9c3047fda4ef179101610e70565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6015546000906001600160a01b0316611a5057506000610c74565b60155460405163701992fd60e11b81526001600160a01b038581166004830152602482018590529091169063e03325fa9060440161124f565b611a91611e86565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b611abb611e86565b6001600160a01b038116600081815260226020908152604091829020805460ff1916905590519182527f575f1ddbfda0dc04fc52273bb61713723c317a04c3f25438c2049dc898144fe29101610e70565b611b14611e86565b601855565b60215460009060ff16611b2c5750600090565b600060135442611b3c9190612e11565b9050601f548110611b4f57600091505090565b601f5481601e54611b609190612e24565b611b6a9190612e3b565b601e54611b779190612e11565b91505090565b601d5460009060ff16611b905750600090565b600060135442611ba09190612e11565b9050601b548110611bb357600091505090565b601b5481601a54611bc49190612e24565b611bce9190612e3b565b601a54611b779190612e11565b611be3611e86565b8051825114611c055760405163512509d360e11b815260040160405180910390fd5b60005b82518110156118b7576000838281518110611c2557611c25612e5d565b602002602001015190506000838381518110611c4357611c43612e5d565b60200260200101519050611c58338383611f5a565b50508080611c6590612d89565b915050611c08565b611c75611e86565b6001600160a01b038116611cda5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611356565b611ce381612337565b50565b611cee611e86565b6001600160a01b03166000908152602460205260409020805460ff19166001179055565b611d1a611e86565b60218054911515620100000262ff000019909216919091179055565b611d3e611e86565b6001600160a01b03166000908152602560205260409020805460ff19166001179055565b6001600160a01b038316611dc45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611356565b6001600160a01b038216611e255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611356565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b031633146110f05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611356565b6000611eec8484611a0a565b90506000198114611f545781811015611f475760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401611356565b611f548484848403611d62565b50505050565b601254600160a01b900460ff168015611f7557504260135411155b158015611f9b57506001600160a01b03831660009081526022602052604090205460ff16155b8015611fc057506001600160a01b03821660009081526022602052604090205460ff16155b15611fde576040516312f1f92360e01b815260040160405180910390fd5b6001600160a01b03831660009081526025602052604090205460ff168061201d57506001600160a01b03821660009081526025602052604090205460ff165b1561203b5760405163bfbf60b360e01b815260040160405180910390fd5b6021546301000000900460ff16801561205a57506120588261109d565b155b8015612090575060195481612084846001600160a01b031660009081526020819052604090205490565b61208e9190612d76565b115b156120ae57604051633ce8c2bd60e11b815260040160405180910390fd5b601654600090600160a81b900460ff161580156120d057506120d08484612389565b905060006120dd85611420565b905060006120ea85611420565b6001600160a01b0387166000908152602860205260408120549192509060ff168061213a575060275460009081526029602090815260408083206001600160a01b038b16845290915290205460ff165b801561218d57506001600160a01b03861660009081526028602052604090205460ff168061218d575060275460009081526029602090815260408083206001600160a01b038a16845290915290205460ff165b90508380156121ac575060215462010000900460ff16806121ac575080155b3060009081526020819052604081205460175492965091821015906001600160a01b038a163b1580156121e757506001600160a01b0389163b155b90508180156121ff5750601654600160a01b900460ff165b80156122155750601654600160a81b900460ff16155b8015612224575060265460ff16155b801561222e575083155b801561223e5750848061223e5750805b801561226357506001600160a01b038a1660009081526022602052604090205460ff16155b801561228857506001600160a01b03891660009081526022602052604090205460ff16155b156122b6576016805460ff60a81b1916600160a81b1790556122a86123fb565b6016805460ff60a81b191690555b600087156123165785156122ec576122cf8b8c8b612537565b90506122db8b8a612686565b6122e59082612d76565b9050612316565b8615612316576122fd8b8b8b612705565b90506123098b8a6127b6565b6123139082612d76565b90505b61232a8b8b612325848d612e11565b6127ed565b5050505050505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821660009081526022602052604081205460ff16806123c857506001600160a01b03821660009081526022602052604090205460ff165b156123d557506000610c74565b60265460ff16158015610db957506123ec83611420565b80610db95750610db982611420565b3060009081526020819052604081205490506000601854821161241e5781612422565b6018545b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061245c5761245c612e5d565b6001600160a01b03928316602091820292909201015260165482519116908290600190811061248d5761248d612e5d565b6001600160a01b0392831660209182029290920101526014546124b39130911684611d62565b6014546012546040516338ed173960e01b81526001600160a01b03928316926338ed1739926124f092879260009288929116904290600401612e73565b6000604051808303816000875af115801561250f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f549190810190612ee4565b6000600f5460000361254b57506000610db9565b6000612710600f548461255e9190612e24565b6125689190612e3b565b9050600061257685836111ff565b90506125828183612e11565b91508160000361259757600092505050610db9565b6000600f54600b54846125aa9190612e24565b6125b49190612e3b565b90506000600f54600c54856125c99190612e24565b6125d39190612e3b565b90506000600f54600d54866125e89190612e24565b6125f29190612e3b565b9050600081836126028689612e11565b61260c9190612e11565b6126169190612e11565b9050831561262b5761262b8a61dead866127ed565b821561264957601054612649908b906001600160a01b0316856127ed565b811561266757601154612667908b906001600160a01b0316846127ed565b8015612678576126788a30836127ed565b509398975050505050505050565b600080612710612694611b19565b61269e9085612e24565b6126a89190612e3b565b90506000612710602054836126bd9190612e24565b6126c79190612e3b565b905060006126d58284612e11565b905081156126ea576126ea8661dead846127ed565b80156126fb576126fb8630836127ed565b5090949350505050565b6000600a5460000361271957506000610db9565b6000612710600a548461272c9190612e24565b6127369190612e3b565b905060006127448583611a35565b90506127508183612e11565b91508160000361276557600092505050610db9565b6000600a54600654846127789190612e24565b6127829190612e3b565b90506000600a54600754856127979190612e24565b6127a19190612e3b565b90506000600a54600854866125e89190612e24565b6000806127106127c4611b7d565b6127ce9085612e24565b6127d89190612e3b565b90506000612710601c54836126bd9190612e24565b6001600160a01b0383166128515760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401611356565b6001600160a01b0382166128b35760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401611356565b6001600160a01b0383166000908152602081905260409020548181101561292b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401611356565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612962908490612d76565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129ae91815260200190565b60405180910390a3611f54565b60005b838110156129d65781810151838201526020016129be565b50506000910152565b60208152600082518060208401526129fe8160408501602087016129bb565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611ce357600080fd5b60008060408385031215612a3a57600080fd5b8235612a4581612a12565b946020939093013593505050565b600060208284031215612a6557600080fd5b8135610db981612a12565b8015158114611ce357600080fd5b600060208284031215612a9057600080fd5b8135610db981612a70565b60008060008060808587031215612ab157600080fd5b5050823594602084013594506040840135936060013592509050565b600080600060608486031215612ae257600080fd5b8335612aed81612a12565b92506020840135612afd81612a12565b929592945050506040919091013590565b600060208284031215612b2057600080fd5b5035919050565b60008060408385031215612b3a57600080fd5b8235612b4581612a12565b91506020830135612b5581612a70565b809150509250929050565b60008060408385031215612b7357600080fd5b8235612b7e81612a12565b91506020830135612b5581612a12565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612bcd57612bcd612b8e565b604052919050565b600067ffffffffffffffff821115612bef57612bef612b8e565b5060051b60200190565b600082601f830112612c0a57600080fd5b81356020612c1f612c1a83612bd5565b612ba4565b82815260059290921b84018101918181019086841115612c3e57600080fd5b8286015b84811015612c595780358352918301918301612c42565b509695505050505050565b60008060408385031215612c7757600080fd5b823567ffffffffffffffff80821115612c8f57600080fd5b818501915085601f830112612ca357600080fd5b81356020612cb3612c1a83612bd5565b82815260059290921b84018101918181019089841115612cd257600080fd5b948201945b83861015612cf9578535612cea81612a12565b82529482019490820190612cd7565b96505086013592505080821115612d0f57600080fd5b50612d1c85828601612bf9565b9150509250929050565b600181811c90821680612d3a57607f821691505b602082108103612d5a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c7457610c74612d60565b600060018201612d9b57612d9b612d60565b5060010190565b600060208284031215612db457600080fd5b5051919050565b60008251612dcd8184602087016129bb565b9190910192915050565b600060208284031215612de957600080fd5b8151610db981612a12565b600060208284031215612e0657600080fd5b8151610db981612a70565b81810381811115610c7457610c74612d60565b8082028115828204841417610c7457610c74612d60565b600082612e5857634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612ec35784516001600160a01b031683529383019391830191600101612e9e565b50506001600160a01b03969096166060850152505050608001529392505050565b60006020808385031215612ef757600080fd5b825167ffffffffffffffff811115612f0e57600080fd5b8301601f81018513612f1f57600080fd5b8051612f2d612c1a82612bd5565b81815260059190911b82018301908381019087831115612f4c57600080fd5b928401925b82841015612f6a57835182529284019290840190612f51565b97965050505050505056fea26469706673582212203e8f85159371c08761bdc0209831e7a92a276a93b57d08d39e53a2e5a7ab62ea64736f6c63430008110033

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

000000000000000000000000fcd3842f85ed87ba2889b4d35893403796e67ff10000000000000000000000004200000000000000000000000000000000000006

-----Decoded View---------------
Arg [0] : _router (address): 0xfCD3842f85ed87ba2889b4D35893403796e67FF1
Arg [1] : _swapPairToken (address): 0x4200000000000000000000000000000000000006

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000fcd3842f85ed87ba2889b4d35893403796e67ff1
Arg [1] : 0000000000000000000000004200000000000000000000000000000000000006


Deployed ByteCode Sourcemap

682:22668:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;747:73;;778:42;747:73;;;;;-1:-1:-1;;;;;178:32:12;;;160:51;;148:2;133:18;747:73:10;;;;;;;;985:28;;;;;;;;;368:25:12;;;356:2;341:18;985:28:10;222:177:12;2156:98:1;;;:::i;:::-;;;;;;;:::i;4433:197::-;;;;;;:::i;:::-;;:::i;:::-;;;1681:14:12;;1674:22;1656:41;;1644:2;1629:18;4433:197:1;1516:187:12;2172:36:10;;;;;;;;;;;;19002:206;;;;;;:::i;:::-;;:::i;:::-;;953:26;;;;;;21980:169;;;;;;:::i;:::-;;:::i;2214:34::-;;;;;;;;;;;;22737:149;;;;;;:::i;:::-;;:::i;19429:572::-;;;;;;:::i;:::-;;:::i;3244:106:1:-;3331:12;;3244:106;;1727:32:10;;;;;;1152:29;;;;;;5192:286:1;;;;;;:::i;:::-;;:::i;2027:43:10:-;;;;;;1409:42;;;;;;17993:104;;;;;;:::i;:::-;;:::i;1019:29::-;;;;;;1538:43;;;;;-1:-1:-1;;;;;1538:43:10;;;3093:91:1;;;3175:2;3742:36:12;;3730:2;3715:18;3093:91:1;3600:184:12;1985:36:10;;;;;;5873:234:1;;;;;;:::i;:::-;;:::i;2458:37:10:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1940:38;;;;;;;;;17754:122;;;;;;:::i;:::-;;:::i;18465:160::-;;;;;;:::i;:::-;;:::i;22155:149::-;;;;;;:::i;:::-;;:::i;1377:26::-;;;;;-1:-1:-1;;;1377:26:10;;;;;;19214:209;;;;;;:::i;:::-;;:::i;22469:126::-;;;;;;:::i;:::-;;:::i;2289:49::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;21601:373;;;;;;:::i;:::-;;:::i;15848:118::-;15932:27;;;;15848:118;;1054:26;;;;;;17625:123;;;;;;:::i;:::-;;:::i;18794:202::-;;;;;;:::i;:::-;;:::i;23256:92::-;;;;;;:::i;:::-;;:::i;1587:28::-;;;;;-1:-1:-1;;;;;1587:28:10;;;1843:42;;;;;;20007:642;;;;;;:::i;:::-;;:::i;17447:172::-;;;;;;:::i;:::-;;:::i;1335:35::-;;;;;-1:-1:-1;;;;;1335:35:10;;;3408:125:1;;;;;;:::i;:::-;-1:-1:-1;;;;;3508:18:1;3482:7;3508:18;;;;;;;;;;;;3408:125;1831:101:0;;;:::i;20966:156:10:-;;;;;;:::i;:::-;;:::i;1690:31::-;;;;;;1257:32;;;;;-1:-1:-1;;;;;1257:32:10;;;922:25;;;;;;22892:139;;;;;;:::i;:::-;;:::i;1087:26::-;;;;;;16438:101;;;:::i;2076:44::-;;;;;;21295:300;;;:::i;22310:153::-;;;;;;:::i;:::-;;:::i;1201:85:0:-;1273:6;;-1:-1:-1;;;;;1273:6:0;1201:85;;1658:26:10;;;;;-1:-1:-1;;;1658:26:10;;;;;;2367:102:1;;;:::i;8822:270:10:-;;;;;;:::i;:::-;;:::i;1891:43::-;;;;;;1223:27;;;;;;18183:132;;;;;;:::i;:::-;;:::i;6594:427:1:-;;;;;;:::i;:::-;;:::i;17882:105:10:-;;;;;;:::i;:::-;;:::i;1621:31::-;;;;;-1:-1:-1;;;1621:31:10;;;;;;3729:189:1;;;;;;:::i;:::-;;:::i;16247:185:10:-;;;;;;:::i;:::-;;:::i;1765:30::-;;;;;;5584:1640;;;;;;:::i;:::-;;:::i;1295:34::-;;;;;-1:-1:-1;;;;;1295:34:10;;;877:38;;911:4;877:38;;16545:211;;;;;;:::i;:::-;;:::i;15972:189::-;;;;;;:::i;:::-;;:::i;20655:179::-;;;;;;:::i;:::-;;:::i;1491:41::-;;;;;-1:-1:-1;;;;;1491:41:10;;;16762:170;;;;;;:::i;:::-;;:::i;2254:28::-;;;;;;;;;;;;2126:39;;;;;;;;;826:45;;868:3;826:45;;18321:138;;;;;;:::i;:::-;;:::i;2400:52::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3976:149:1;;;;;;:::i;:::-;;:::i;2344:50:10:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;8548:268;;;;;;:::i;:::-;;:::i;1119:27::-;;;;;;23037:119;;;;;;:::i;:::-;;:::i;18631:157::-;;;;;;:::i;:::-;;:::i;22601:130::-;;;;;;:::i;:::-;;:::i;1187:30::-;;;;;;8023:439;;;:::i;7584:433::-;;;:::i;16938:423::-;;;;;;:::i;:::-;;:::i;2081:198:0:-;;;;;;:::i;:::-;;:::i;20840:120:10:-;;;;;;:::i;:::-;;:::i;21128:161::-;;;;;;:::i;:::-;;:::i;1802:35::-;;;;;;23162:88;;;;;;:::i;:::-;;:::i;2156:98:1:-;2210:13;2242:5;2235:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2156:98;:::o;4433:197::-;4516:4;719:10:4;4570:32:1;719:10:4;4586:7:1;4595:6;4570:8;:32::i;:::-;4619:4;4612:11;;;4433:197;;;;;:::o;19002:206:10:-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;19085:22:10;::::1;19081:81;;19130:21;;-1:-1:-1::0;;;19130:21:10::1;;;;;;;;;;;19081:81;19171:19;:30:::0;;-1:-1:-1;;;;;;19171:30:10::1;-1:-1:-1::0;;;;;19171:30:10;;;::::1;::::0;;;::::1;::::0;;19002:206::o;21980:169::-;1094:13:0;:11;:13::i;:::-;22090:24:10::1;:52:::0;;;::::1;;;;-1:-1:-1::0;;22090:52:10;;::::1;::::0;;;::::1;::::0;;21980:169::o;22737:149::-;1094:13:0;:11;:13::i;:::-;22837:19:10::1;:42:::0;;;::::1;;-1:-1:-1::0;;;22837:42:10::1;-1:-1:-1::0;;;;22837:42:10;;::::1;::::0;;;::::1;::::0;;22737:149::o;19429:572::-;1094:13:0;:11;:13::i;:::-;911:4:10::1;19669:15:::0;19652:14;19623:26:::1;19637:12:::0;19623:11;:26:::1;:::i;:::-;:43;;;;:::i;:::-;:61;;;;:::i;:::-;:83;19606:155;;;19738:12;;-1:-1:-1::0;;;19738:12:10::1;;;;;;;;;;;19606:155;19771:10;:24:::0;;;19805:11:::1;:26:::0;;;19841:13:::1;:30:::0;;;19881:14:::1;:32:::0;;;19898:15;19857:14;19937:24:::1;19819:12:::0;19784:11;19937:24:::1;:::i;:::-;:40;;;;:::i;:::-;:57;;;;:::i;:::-;19923:11;:71:::0;-1:-1:-1;;;;19429:572:10:o;5192:286:1:-;5319:4;719:10:4;5375:38:1;5391:4;719:10:4;5406:6:1;5375:15;:38::i;:::-;5423:27;5433:4;5439:2;5443:6;5423:9;:27::i;:::-;5467:4;5460:11;;;5192:286;;;;;;:::o;17993:104:10:-;1094:13:0;:11;:13::i;:::-;18066:15:10::1;:24:::0;17993:104::o;5873:234:1:-;5961:4;719:10:4;6015:64:1;719:10:4;6031:7:1;6068:10;6040:25;719:10:4;6031:7:1;6040:9;:25::i;:::-;:38;;;;:::i;:::-;6015:8;:64::i;17754:122:10:-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;17828:33:10::1;17864:5;17828:33:::0;;;:24:::1;:33;::::0;;;;:41;;-1:-1:-1;;17828:41:10::1;::::0;;17754:122::o;18465:160::-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;18536:27:10;::::1;;::::0;;;:17:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;18536:34:10::1;18566:4;18536:34;::::0;;18585:33;;160:51:12;;;18585:33:10::1;::::0;133:18:12;18585:33:10::1;;;;;;;;18465:160:::0;:::o;22155:149::-;1094:13:0;:11;:13::i;:::-;22255:19:10::1;:42:::0;;-1:-1:-1;;22255:42:10::1;::::0;::::1;;::::0;;;::::1;::::0;;22155:149::o;19214:209::-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;19298:22:10;::::1;19294:81;;19343:21;;-1:-1:-1::0;;;19343:21:10::1;;;;;;;;;;;19294:81;19385:20;:31:::0;;-1:-1:-1;;;;;;19385:31:10::1;-1:-1:-1::0;;;;;19385:31:10;;;::::1;::::0;;;::::1;::::0;;19214:209::o;22469:126::-;1094:13:0;:11;:13::i;:::-;22552:16:10::1;:36:::0;22469:126::o;21601:373::-;1094:13:0;:11;:13::i;:::-;21688:14:10::1;::::0;-1:-1:-1;;;21688:14:10;::::1;;;:60:::0;::::1;;;;21733:15;21706:23;;:42;;21688:60;21684:121;;;21771:23;;-1:-1:-1::0;;;21771:23:10::1;;;;;;;;;;;21684:121;21819:14;::::0;-1:-1:-1;;;21819:14:10;::::1;;;:46:::0;::::1;;;;21850:15;21837:10;:28;21819:46;21815:106;;;21888:22;;-1:-1:-1::0;;;21888:22:10::1;;;;;;;;;;;21815:106;21931:23;:36:::0;21601:373::o;17625:123::-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;17701:33:10::1;;::::0;;;:24:::1;:33;::::0;;;;:40;;-1:-1:-1;;17701:40:10::1;17737:4;17701:40;::::0;;17625:123::o;18794:202::-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;18875:22:10;::::1;18871:81;;18920:21;;-1:-1:-1::0;;;18920:21:10::1;;;;;;;;;;;18871:81;18961:17;:28:::0;;-1:-1:-1;;;;;;18961:28:10::1;-1:-1:-1::0;;;;;18961:28:10;;;::::1;::::0;;;::::1;::::0;;18794:202::o;23256:92::-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;23319:14:10::1;23336:5;23319:14:::0;;;:5:::1;:14;::::0;;;;:22;;-1:-1:-1;;23319:22:10::1;::::0;;23256:92::o;20007:642::-;1094:13:0;:11;:13::i;:::-;911:4:10::1;20255:16:::0;20237:15;20206:28:::1;20221:13:::0;20206:12;:28:::1;:::i;:::-;:46;;;;:::i;:::-;:65;;;;:::i;:::-;:87;20189:159;;;20325:12;;-1:-1:-1::0;;;20325:12:10::1;;;;;;;;;;;20189:159;20358:11;:26:::0;;;20394:12:::1;:28:::0;;;20432:14:::1;:32:::0;;;20474:15:::1;:34:::0;;;20492:16;20449:15;20545:38:::1;20409:13:::0;20372:12;20545:38:::1;:::i;:::-;:67;;;;:::i;:::-;:97;;;;:::i;:::-;20518:12;:124:::0;-1:-1:-1;;;;20007:642:10:o;17447:172::-;-1:-1:-1;;;;;17555:33:10;;17532:4;17555:33;;;:24;:33;;;;;;;;;:57;;-1:-1:-1;;;;;;;17592:20:10;;;;;:11;:20;;;;;;;;;17447:172::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;20966:156:10:-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;21045:30:10;::::1;21078:5;21045:30:::0;;;:20:::1;:30;::::0;;;;:38;;-1:-1:-1;;21045:38:10::1;::::0;;21093:20:::1;:22:::0;;;::::1;::::0;::::1;:::i;:::-;;;;;;20966:156:::0;:::o;22892:139::-;1094:13:0;:11;:13::i;:::-;22971:14:10::1;:53:::0;;-1:-1:-1;;;;;;22971:53:10::1;-1:-1:-1::0;;;;;22971:53:10;;;::::1;::::0;;;::::1;::::0;;22892:139::o;16438:101::-;1094:13:0;:11;:13::i;:::-;16493:39:10::1;16510:21;16493:16;:39::i;21295:300::-:0;1094:13:0;:11;:13::i;:::-;21351:14:10::1;::::0;-1:-1:-1;;;21351:14:10;::::1;;;21347:50;;;21374:23;;-1:-1:-1::0;;;21374:23:10::1;;;;;;;;;;;21347:50;21407:14;:21:::0;;-1:-1:-1;;;;21407:21:10::1;-1:-1:-1::0;;;21407:21:10::1;::::0;;21443:23:::1;::::0;21469:15:::1;-1:-1:-1::0;21439:113:10::1;;;21526:15;21500:23;:41:::0;21439:113:::1;21562:19;:26:::0;;-1:-1:-1;;;;21562:26:10::1;-1:-1:-1::0;;;21562:26:10::1;::::0;;21295:300::o;22310:153::-;1094:13:0;:11;:13::i;:::-;22412:20:10::1;:44:::0;;-1:-1:-1;;22412:44:10::1;::::0;::::1;;::::0;;;::::1;::::0;;22310:153::o;2367:102:1:-;2423:13;2455:7;2448:14;;;;;:::i;8822:270:10:-;8965:17;;8934:7;;-1:-1:-1;;;;;8965:17:10;8953:54;;-1:-1:-1;9006:1:10;8999:8;;8953:54;9024:17;;:61;;-1:-1:-1;;;9024:61:10;;-1:-1:-1;;;;;9150:32:12;;;9024:61:10;;;9132:51:12;9199:18;;;9192:34;;;9024:17:10;;;;:36;;9105:18:12;;9024:61:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18183:132::-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;18248:18:10;::::1;;::::0;;;:11:::1;:18;::::0;;;;;;;;:25;;-1:-1:-1;;18248:25:10::1;18269:4;18248:25;::::0;;18288:20;;160:51:12;;;18288:20:10::1;::::0;133:18:12;18288:20:10::1;14:203:12::0;6594:427:1;6687:4;719:10:4;6687:4:1;6768:25;719:10:4;6785:7:1;6768:9;:25::i;:::-;6741:52;;6831:15;6811:16;:35;;6803:85;;;;-1:-1:-1;;;6803:85:1;;9628:2:12;6803:85:1;;;9610:21:12;9667:2;9647:18;;;9640:30;9706:34;9686:18;;;9679:62;-1:-1:-1;;;9757:18:12;;;9750:35;9802:19;;6803:85:1;;;;;;;;;6922:60;6931:5;6938:7;6966:15;6947:16;:34;6922:8;:60::i;:::-;-1:-1:-1;7010:4:1;;6594:427;-1:-1:-1;;;;6594:427:1:o;17882:105:10:-;1094:13:0;:11;:13::i;:::-;17954:16:10::1;:26:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;17954:26:10;;::::1;::::0;;;::::1;::::0;;17882:105::o;3729:189:1:-;3808:4;719:10:4;3862:28:1;719:10:4;3879:2:1;3883:6;3862:9;:28::i;16247:185:10:-;1094:13:0;:11;:13::i;:::-;16335:43:10::1;::::0;16317:12:::1;::::0;16343:10:::1;::::0;16367:6;;16317:12;16335:43;16317:12;16335:43;16367:6;16343:10;16335:43:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16316:62;;;16393:7;16388:37;;16409:16;;-1:-1:-1::0;;;16409:16:10::1;;;;;;;;;;;16388:37;16306:126;16247:185:::0;:::o;5584:1640::-;-1:-1:-1;;;;;5662:18:10;;5635:11;5662:18;;;:11;:18;;;;;;;;5658:60;;;-1:-1:-1;5703:4:10;;5584:1640;-1:-1:-1;5584:1640:10:o;5658:60::-;5733:24;;;;;;;5728:68;;-1:-1:-1;5780:5:10;;5584:1640;-1:-1:-1;5584:1640:10:o;5728:68::-;5840:20;;5810:51;;;;:29;:51;;;;;;;;-1:-1:-1;;;;;5810:58:10;;;;;;;;;;;;5806:100;;;-1:-1:-1;5891:4:10;;5584:1640;-1:-1:-1;5584:1640:10:o;5806:100::-;5920:5;-1:-1:-1;;;;;5920:17:10;;5941:1;5920:22;5916:65;;-1:-1:-1;5965:5:10;;5584:1640;-1:-1:-1;5584:1640:10:o;5916:65::-;6057:36;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6057:36:10;-1:-1:-1;;;6057:36:10;;;6027:76;;5992:12;;;;-1:-1:-1;;;;;6027:16:10;;;:76;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5991:112;;;;6118:7;6113:26;;-1:-1:-1;6134:5:10;;5584:1640;-1:-1:-1;;;5584:1640:10:o;6113:26::-;6149:15;6178:4;6167:27;;;;;;;;;;;;:::i;:::-;6149:45;-1:-1:-1;;;;;;6208:21:10;;6204:39;;-1:-1:-1;6238:5:10;;5584:1640;-1:-1:-1;;;;5584:1640:10:o;6204:39::-;-1:-1:-1;;;;;6276:29:10;;6254:19;6276:29;;;:20;:29;;;;;;;;:86;;;;-1:-1:-1;6321:41:10;;-1:-1:-1;;;6321:41:10;;-1:-1:-1;;;;;178:32:12;;;6321:41:10;;;160:51:12;6321:34:10;;;;;133:18:12;;6321:41:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6408:35;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6408:35:10;-1:-1:-1;;;6408:35:10;;;6391:53;;6254:108;;-1:-1:-1;;;;;;6391:16:10;;;:53;;6408:35;6391:53;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6373:71:10;;-1:-1:-1;6373:71:10;-1:-1:-1;6373:71:10;6454:26;;-1:-1:-1;6475:5:10;;5584:1640;-1:-1:-1;;;;;5584:1640:10:o;6454:26::-;6490:14;6518:4;6507:27;;;;;;;;;;;;:::i;:::-;6490:44;-1:-1:-1;6566:4:10;-1:-1:-1;;;;;6548:23:10;;;6544:235;;6591:14;6587:156;;;6655:20;;6625:51;;;;:29;:51;;;;;;;;-1:-1:-1;;;;;6625:96:10;;;;;;;;;:103;;-1:-1:-1;;6625:103:10;6724:4;6625:103;;;6587:156;-1:-1:-1;6764:4:10;;5584:1640;-1:-1:-1;;;;;;5584:1640:10:o;6544:235::-;6824:35;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6824:35:10;-1:-1:-1;;;6824:35:10;;;6807:53;;-1:-1:-1;;;;;6807:16:10;;;:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6789:71:10;;-1:-1:-1;6789:71:10;-1:-1:-1;6789:71:10;6870:26;;-1:-1:-1;6891:5:10;;5584:1640;-1:-1:-1;;;;;;5584:1640:10:o;6870:26::-;6906:14;6934:4;6923:27;;;;;;;;;;;;:::i;:::-;6906:44;-1:-1:-1;6982:4:10;-1:-1:-1;;;;;6964:23:10;;;6960:235;;7007:14;7003:156;;;7071:20;;7041:51;;;;:29;:51;;;;;;;;-1:-1:-1;;;;;7041:96:10;;;;;;;;;:103;;-1:-1:-1;;7041:103:10;7140:4;7041:103;;;7003:156;-1:-1:-1;7180:4:10;;5584:1640;-1:-1:-1;;;;;;;5584:1640:10:o;6960:235::-;-1:-1:-1;7212:5:10;;5584:1640;-1:-1:-1;;;;;;;5584:1640:10:o;16545:211::-;1094:13:0;:11;:13::i;:::-;16668:34:10::1;::::0;-1:-1:-1;;;16668:34:10;;16683:10:::1;16668:34;::::0;::::1;9132:51:12::0;9199:18;;;9192:34;;;16653:12:10::1;::::0;-1:-1:-1;;;;;16668:14:10;::::1;::::0;::::1;::::0;9105:18:12;;16668:34:10::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16653:49;;16717:7;16712:37;;16733:16;;-1:-1:-1::0;;;16733:16:10::1;;;;;;;;;;;16712:37;16643:113;16545:211:::0;;:::o;15972:189::-;5415:10;5396:30;;;;:18;:30;;;;;;;;5391:90;;5449:21;;-1:-1:-1;;;5449:21:10;;;;;;;;;;;5391:90;16097:27:::1;:57:::0;;-1:-1:-1;;16097:57:10::1;::::0;::::1;;::::0;;;::::1;::::0;;15972:189::o;20655:179::-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;20777:37:10;;;::::1;;::::0;;;:18:::1;:37;::::0;;;;:50;;-1:-1:-1;;20777:50:10::1;::::0;::::1;;::::0;;;::::1;::::0;;20655:179::o;16762:170::-;1094:13:0;:11;:13::i;:::-;16850:30:10::1;::::0;-1:-1:-1;;;16850:30:10;;16874:4:::1;16850:30;::::0;::::1;160:51:12::0;16832:15:10::1;::::0;-1:-1:-1;;;;;16850:15:10;::::1;::::0;::::1;::::0;133:18:12;;16850:30:10::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16832:48;;16890:35;16910:5;16917:7;16890:19;:35::i;18321:138::-:0;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;18389:18:10;::::1;18410:5;18389:18:::0;;;:11:::1;:18;::::0;;;;;;;;:26;;-1:-1:-1;;18389:26:10::1;::::0;;18430:22;;160:51:12;;;18430:22:10::1;::::0;133:18:12;18430:22:10::1;14:203:12::0;3976:149:1;-1:-1:-1;;;;;4091:18:1;;;4065:7;4091:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3976:149::o;8548:268:10:-;8690:17;;8659:7;;-1:-1:-1;;;;;8690:17:10;8678:54;;-1:-1:-1;8731:1:10;8724:8;;8678:54;8749:17;;:60;;-1:-1:-1;;;8749:60:10;;-1:-1:-1;;;;;9150:32:12;;;8749:60:10;;;9132:51:12;9199:18;;;9192:34;;;8749:17:10;;;;:35;;9105:18:12;;8749:60:10;8958:274:12;23037:119:10;1094:13:0;:11;:13::i;:::-;23122:17:10::1;:27:::0;;-1:-1:-1;;;;;;23122:27:10::1;-1:-1:-1::0;;;;;23122:27:10;;;::::1;::::0;;;::::1;::::0;;23037:119::o;18631:157::-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;18700:27:10;::::1;18730:5;18700:27:::0;;;:17:::1;:27;::::0;;;;;;;;:35;;-1:-1:-1;;18700:35:10::1;::::0;;18750:31;;160:51:12;;;18750:31:10::1;::::0;133:18:12;18750:31:10::1;14:203:12::0;22601:130:10;1094:13:0;:11;:13::i;:::-;22686:17:10::1;:38:::0;22601:130::o;8023:439::-;8093:20;;8069:7;;8093:20;;8088:60;;-1:-1:-1;8136:1:10;;8023:439::o;8088:60::-;8158:23;8202;;8184:15;:41;;;;:::i;:::-;8158:67;;8259:24;;8240:15;:43;8236:82;;8306:1;8299:8;;;8023:439;:::o;8236:82::-;8431:24;;8400:15;8380:17;;:35;;;;:::i;:::-;8379:76;;;;:::i;:::-;8347:17;;:108;;;;:::i;:::-;8328:127;;;8023:439;:::o;7584:433::-;7653:19;;7629:7;;7653:19;;7648:59;;-1:-1:-1;7695:1:10;;7584:433::o;7648:59::-;7717:23;7761;;7743:15;:41;;;;:::i;:::-;7717:67;;7818:23;;7799:15;:42;7795:81;;7864:1;7857:8;;;7584:433;:::o;7795:81::-;7987:23;;7956:15;7937:16;;:34;;;;:::i;:::-;7936:74;;;;:::i;:::-;7905:16;;:105;;;;:::i;16938:423::-;1094:13:0;:11;:13::i;:::-;17087:7:10::1;:14;17069:7;:14;:32;17065:91;;17124:21;;-1:-1:-1::0;;;17124:21:10::1;;;;;;;;;;;17065:91;17171:9;17166:189;17190:7;:14;17186:1;:18;17166:189;;;17225:14;17242:7;17250:1;17242:10;;;;;;;;:::i;:::-;;;;;;;17225:27;;17266:14;17283:7;17291:1;17283:10;;;;;;;;:::i;:::-;;;;;;;17266:27;;17307:37;17317:10;17329:6;17337;17307:9;:37::i;:::-;17211:144;;17206:3;;;;;:::i;:::-;;;;17166:189;;2081:198:0::0;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:0;;11710:2:12;2161:73:0::1;::::0;::::1;11692:21:12::0;11749:2;11729:18;;;11722:30;11788:34;11768:18;;;11761:62;-1:-1:-1;;;11839:18:12;;;11832:36;11885:19;;2161:73:0::1;11508:402:12::0;2161:73:0::1;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;20840:120:10:-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;20916:30:10::1;;::::0;;;:20:::1;:30;::::0;;;;:37;;-1:-1:-1;;20916:37:10::1;20949:4;20916:37;::::0;;20840:120::o;21128:161::-;1094:13:0;:11;:13::i;:::-;21234:22:10::1;:48:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;21234:48:10;;::::1;::::0;;;::::1;::::0;;21128:161::o;23162:88::-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;23222:14:10::1;;::::0;;;:5:::1;:14;::::0;;;;:21;;-1:-1:-1;;23222:21:10::1;23239:4;23222:21;::::0;;23162:88::o;10110:370:1:-;-1:-1:-1;;;;;10241:19:1;;10233:68;;;;-1:-1:-1;;;10233:68:1;;12117:2:12;10233:68:1;;;12099:21:12;12156:2;12136:18;;;12129:30;12195:34;12175:18;;;12168:62;-1:-1:-1;;;12246:18:12;;;12239:34;12290:19;;10233:68:1;11915:400:12;10233:68:1;-1:-1:-1;;;;;10319:21:1;;10311:68;;;;-1:-1:-1;;;10311:68:1;;12522:2:12;10311:68:1;;;12504:21:12;12561:2;12541:18;;;12534:30;12600:34;12580:18;;;12573:62;-1:-1:-1;;;12651:18:12;;;12644:32;12693:19;;10311:68:1;12320:398:12;10311:68:1;-1:-1:-1;;;;;10390:18:1;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10441:32;;368:25:12;;;10441:32:1;;341:18:12;10441:32:1;;;;;;;10110:370;;;:::o;1359:130:0:-;1273:6;;-1:-1:-1;;;;;1273:6:0;719:10:4;1422:23:0;1414:68;;;;-1:-1:-1;;;1414:68:0;;12925:2:12;1414:68:0;;;12907:21:12;;;12944:18;;;12937:30;13003:34;12983:18;;;12976:62;13055:18;;1414:68:0;12723:356:12;10761:441:1;10891:24;10918:25;10928:5;10935:7;10918:9;:25::i;:::-;10891:52;;-1:-1:-1;;10957:16:1;:37;10953:243;;11038:6;11018:16;:26;;11010:68;;;;-1:-1:-1;;;11010:68:1;;13286:2:12;11010:68:1;;;13268:21:12;13325:2;13305:18;;;13298:30;13364:31;13344:18;;;13337:59;13413:18;;11010:68:1;13084:353:12;11010:68:1;11120:51;11129:5;11136:7;11164:6;11145:16;:25;11120:8;:51::i;:::-;10881:321;10761:441;;;:::o;12775:2288:10:-;12922:14;;-1:-1:-1;;;12922:14:10;;;;:60;;;;;12967:15;12940:23;;:42;;12922:60;12920:63;:105;;;;-1:-1:-1;;;;;;13000:25:10;;;;;;:17;:25;;;;;;;;12999:26;12920:105;:150;;;;-1:-1:-1;;;;;;13042:28:10;;;;;;:17;:28;;;;;;;;13041:29;12920:150;12903:229;;;13102:19;;-1:-1:-1;;;13102:19:10;;;;;;;;;;;12903:229;-1:-1:-1;;;;;13146:13:10;;;;;;:5;:13;;;;;;;;;:33;;-1:-1:-1;;;;;;13163:16:10;;;;;;:5;:16;;;;;;;;13146:33;13142:65;;;13188:19;;-1:-1:-1;;;13188:19:10;;;;;;;;;;;13142:65;13235:16;;;;;;;:67;;;;;13268:34;13292:9;13268:23;:34::i;:::-;13267:35;13235:67;:130;;;;;13350:15;;13341:6;13318:20;13328:9;-1:-1:-1;;;;;3508:18:1;3482:7;3508:18;;;;;;;;;;;;3408:125;13318:20:10;:29;;;;:::i;:::-;:47;13235:130;13218:183;;;13383:18;;-1:-1:-1;;;13383:18:10;;;;;;;;;;;13218:183;13428:14;;13412:12;;-1:-1:-1;;;13428:14:10;;;;13427:15;:72;;;;;13458:41;13481:6;13489:9;13458:22;:41::i;:::-;13412:87;;13509:10;13522:18;13533:6;13522:10;:18::i;:::-;13509:31;;13550:11;13564:21;13575:9;13564:10;:21::i;:::-;-1:-1:-1;;;;;13618:19:10;;13595;13618;;;:11;:19;;;;;;13550:35;;-1:-1:-1;13595:19:10;13618;;;:94;;-1:-1:-1;13683:20:10;;13653:51;;;;:29;:51;;;;;;;;-1:-1:-1;;;;;13653:59:10;;;;;;;;;;;;13618:94;13617:218;;;;-1:-1:-1;;;;;;13730:22:10;;;;;;:11;:22;;;;;;;;;:104;;-1:-1:-1;13802:20:10;;13772:51;;;;:29;:51;;;;;;;;-1:-1:-1;;;;;13772:62:10;;;;;;;;;;;;13730:104;13595:240;;13855:7;:54;;;;-1:-1:-1;13867:22:10;;;;;;;;:41;;;13894:14;13893:15;13867:41;13969:4;13920:28;3508:18:1;;;;;;;;;;;14028:16:10;;13845:64;;-1:-1:-1;3508:18:1;14004:40:10;;;;-1:-1:-1;;;;;14075:18:10;;;:23;:65;;;;-1:-1:-1;;;;;;14114:21:10;;;:26;14075:65;14054:86;;14168:11;:46;;;;-1:-1:-1;14195:19:10;;-1:-1:-1;;;14195:19:10;;;;14168:46;:77;;;;-1:-1:-1;14231:14:10;;-1:-1:-1;;;14231:14:10;;;;14230:15;14168:77;:121;;;;-1:-1:-1;14262:27:10;;;;14261:28;14168:121;:152;;;;;14306:14;14305:15;14168:152;:193;;;;;14337:6;:23;;;;14347:13;14337:23;14168:235;;;;-1:-1:-1;;;;;;14378:25:10;;;;;;:17;:25;;;;;;;;14377:26;14168:235;:280;;;;-1:-1:-1;;;;;;14420:28:10;;;;;;:17;:28;;;;;;;;14419:29;14168:280;14151:415;;;14473:14;:21;;-1:-1:-1;;;;14473:21:10;-1:-1:-1;;;14473:21:10;;;14508:11;:9;:11::i;:::-;14533:14;:22;;-1:-1:-1;;;;14533:22:10;;;14151:415;14576:22;14612:7;14608:379;;;14639:6;14635:342;;;14682:36;14695:6;14703;14711;14682:12;:36::i;:::-;14665:53;;14754:34;14773:6;14781;14754:18;:34::i;:::-;14736:52;;;;:::i;:::-;;;14635:342;;;14813:5;14809:168;;;14855:38;14867:6;14875:9;14886:6;14855:11;:38::i;:::-;14838:55;;14929:33;14947:6;14955;14929:17;:33::i;:::-;14911:51;;;;:::i;:::-;;;14809:168;14997:59;15013:6;15021:9;15032:23;15041:14;15032:6;:23;:::i;:::-;14997:15;:59::i;:::-;12893:2170;;;;;;;;12775:2288;;;:::o;2433:187:0:-;2525:6;;;-1:-1:-1;;;;;2541:17:0;;;-1:-1:-1;;;;;;2541:17:0;;;;;;;2573:40;;2525:6;;;2541:17;2525:6;;2573:40;;2506:16;;2573:40;2496:124;2433:187;:::o;7230:348:10:-;-1:-1:-1;;;;;7357:25:10;;7337:4;7357:25;;;:17;:25;;;;;;;;;:57;;-1:-1:-1;;;;;;7386:28:10;;;;;;:17;:28;;;;;;;;7357:57;7353:100;;;-1:-1:-1;7437:5:10;7430:12;;7353:100;7483:27;;;;7482:28;:89;;;;;7527:18;7538:6;7527:10;:18::i;:::-;:43;;;;7549:21;7560:9;7549:10;:21::i;15149:613::-;15238:4;15189:28;3508:18:1;;;;;;;;;;;15189:55:10;;15254:20;15300:17;;15277:20;:40;:107;;15364:20;15277:107;;;15332:17;;15277:107;15419:16;;;15433:1;15419:16;;;;;;;;15254:130;;-1:-1:-1;15395:21:10;;15419:16;;;;;;;;;;;;-1:-1:-1;15419:16:10;15395:40;;15463:4;15445;15450:1;15445:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;15445:23:10;;;:7;;;;;;;;;:23;15488:13;;15478:7;;15488:13;;;15478:4;;15488:13;;15478:7;;;;;;:::i;:::-;-1:-1:-1;;;;;15478:23:10;;;:7;;;;;;;;;:23;15544:14;;15512:62;;15529:4;;15544:14;15561:12;15512:8;:62::i;:::-;15584:14;;15696:20;;15584:171;;-1:-1:-1;;;15584:171:10;;-1:-1:-1;;;;;15584:14:10;;;;:39;;:171;;15637:12;;15584:14;;15678:4;;15696:20;;;15730:15;;15584:171;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15584:171:10;;;;;;;;;;;;:::i;10342:1248::-;10458:7;10481:12;;10497:1;10481:17;10477:31;;-1:-1:-1;10507:1:10;10500:8;;10477:31;10519:22;868:3;10554:12;;10545:6;:21;;;;:::i;:::-;10544:41;;;;:::i;:::-;10519:66;;10595:25;10623:40;10642:4;10648:14;10623:18;:40::i;:::-;10595:68;-1:-1:-1;10674:35:10;10595:68;10674:35;;:::i;:::-;;;10723:14;10741:1;10723:19;10719:33;;10751:1;10744:8;;;;;;10719:33;10763:21;10820:12;;10805:11;;10788:14;:28;;;;:::i;:::-;10787:45;;;;:::i;:::-;10763:69;;10842:22;10901:12;;10885;;10868:14;:29;;;;:::i;:::-;10867:46;;;;:::i;:::-;10842:71;;10923:24;10998:12;;10968:14;;10951;:31;;;;:::i;:::-;10950:60;;;;:::i;:::-;10923:87;-1:-1:-1;11020:25:10;10923:87;11105:14;11048:42;11077:13;11048:14;:42;:::i;:::-;:71;;;;:::i;:::-;:102;;;;:::i;:::-;11020:130;-1:-1:-1;11165:17:10;;11161:67;;11184:44;11200:6;778:42;11214:13;11184:15;:44::i;:::-;11243:18;;11239:94;;11299:17;;11275:58;;11291:6;;-1:-1:-1;;;;;11299:17:10;11318:14;11275:15;:58::i;:::-;11348:20;;11344:100;;11406:19;;11382:62;;11398:6;;-1:-1:-1;;;;;11406:19:10;11427:16;11382:15;:62::i;:::-;11459:21;;11455:96;;11494:57;11510:6;11526:4;11533:17;11494:15;:57::i;:::-;-1:-1:-1;11569:14:10;;10342:1248;-1:-1:-1;;;;;;;;10342:1248:10:o;12184:585::-;12284:7;12303:22;868:3;12338:15;:13;:15::i;:::-;12329:24;;:6;:24;:::i;:::-;12328:44;;;;:::i;:::-;12303:69;;12382:21;868:3;12424:22;;12407:14;:39;;;;:::i;:::-;12406:71;;;;:::i;:::-;12382:95;-1:-1:-1;12487:25:10;12515:30;12382:95;12515:14;:30;:::i;:::-;12487:58;-1:-1:-1;12560:17:10;;12556:67;;12579:44;12595:6;778:42;12609:13;12579:15;:44::i;:::-;12638:21;;12634:96;;12673:57;12689:6;12705:4;12712:17;12673:15;:57::i;:::-;-1:-1:-1;12748:14:10;;12184:585;-1:-1:-1;;;;12184:585:10:o;9098:1238::-;9213:7;9236:11;;9251:1;9236:16;9232:30;;-1:-1:-1;9261:1:10;9254:8;;9232:30;9273:22;868:3;9308:11;;9299:6;:20;;;;:::i;:::-;9298:40;;;;:::i;:::-;9273:65;;9348:25;9376:39;9394:4;9400:14;9376:17;:39::i;:::-;9348:67;-1:-1:-1;9426:35:10;9348:67;9426:35;;:::i;:::-;;;9475:14;9493:1;9475:19;9471:33;;9503:1;9496:8;;;;;;9471:33;9515:21;9571:11;;9557:10;;9540:14;:27;;;;:::i;:::-;9539:43;;;;:::i;:::-;9515:67;;9592:22;9650:11;;9635;;9618:14;:28;;;;:::i;:::-;9617:44;;;;:::i;:::-;9592:69;;9671:24;9745:11;;9716:13;;9699:14;:30;;;;:::i;11596:582::-;11695:7;11714:22;868:3;11749:14;:12;:14::i;:::-;11740:23;;:6;:23;:::i;:::-;11739:43;;;;:::i;:::-;11714:68;;11792:21;868:3;11834:21;;11817:14;:38;;;;:::i;7475:651:1:-;-1:-1:-1;;;;;7601:18:1;;7593:68;;;;-1:-1:-1;;;7593:68:1;;15515:2:12;7593:68:1;;;15497:21:12;15554:2;15534:18;;;15527:30;15593:34;15573:18;;;15566:62;-1:-1:-1;;;15644:18:12;;;15637:35;15689:19;;7593:68:1;15313:401:12;7593:68:1;-1:-1:-1;;;;;7679:16:1;;7671:64;;;;-1:-1:-1;;;7671:64:1;;15921:2:12;7671:64:1;;;15903:21:12;15960:2;15940:18;;;15933:30;15999:34;15979:18;;;15972:62;-1:-1:-1;;;16050:18:12;;;16043:33;16093:19;;7671:64:1;15719:399:12;7671:64:1;-1:-1:-1;;;;;7817:15:1;;7795:19;7817:15;;;;;;;;;;;7850:21;;;;7842:72;;;;-1:-1:-1;;;7842:72:1;;16325:2:12;7842:72:1;;;16307:21:12;16364:2;16344:18;;;16337:30;16403:34;16383:18;;;16376:62;-1:-1:-1;;;16454:18:12;;;16447:36;16500:19;;7842:72:1;16123:402:12;7842:72:1;-1:-1:-1;;;;;7948:15:1;;;:9;:15;;;;;;;;;;;7966:20;;;7948:38;;8006:13;;;;;;;;:23;;7980:6;;7948:9;8006:23;;7980:6;;8006:23;:::i;:::-;;;;;;;;8060:2;-1:-1:-1;;;;;8045:26:1;8054:4;-1:-1:-1;;;;;8045:26:1;;8064:6;8045:26;;;;368:25:12;;356:2;341:18;;222:177;8045:26:1;;;;;;;;8082:37;16545:211:10;404:250:12;489:1;499:113;513:6;510:1;507:13;499:113;;;589:11;;;583:18;570:11;;;563:39;535:2;528:10;499:113;;;-1:-1:-1;;646:1:12;628:16;;621:27;404:250::o;659:396::-;808:2;797:9;790:21;771:4;840:6;834:13;883:6;878:2;867:9;863:18;856:34;899:79;971:6;966:2;955:9;951:18;946:2;938:6;934:15;899:79;:::i;:::-;1039:2;1018:15;-1:-1:-1;;1014:29:12;999:45;;;;1046:2;995:54;;659:396;-1:-1:-1;;659:396:12:o;1060:131::-;-1:-1:-1;;;;;1135:31:12;;1125:42;;1115:70;;1181:1;1178;1171:12;1196:315;1264:6;1272;1325:2;1313:9;1304:7;1300:23;1296:32;1293:52;;;1341:1;1338;1331:12;1293:52;1380:9;1367:23;1399:31;1424:5;1399:31;:::i;:::-;1449:5;1501:2;1486:18;;;;1473:32;;-1:-1:-1;;;1196:315:12:o;1708:247::-;1767:6;1820:2;1808:9;1799:7;1795:23;1791:32;1788:52;;;1836:1;1833;1826:12;1788:52;1875:9;1862:23;1894:31;1919:5;1894:31;:::i;1960:118::-;2046:5;2039:13;2032:21;2025:5;2022:32;2012:60;;2068:1;2065;2058:12;2083:241;2139:6;2192:2;2180:9;2171:7;2167:23;2163:32;2160:52;;;2208:1;2205;2198:12;2160:52;2247:9;2234:23;2266:28;2288:5;2266:28;:::i;2329:385::-;2415:6;2423;2431;2439;2492:3;2480:9;2471:7;2467:23;2463:33;2460:53;;;2509:1;2506;2499:12;2460:53;-1:-1:-1;;2532:23:12;;;2602:2;2587:18;;2574:32;;-1:-1:-1;2653:2:12;2638:18;;2625:32;;2704:2;2689:18;2676:32;;-1:-1:-1;2329:385:12;-1:-1:-1;2329:385:12:o;2719:456::-;2796:6;2804;2812;2865:2;2853:9;2844:7;2840:23;2836:32;2833:52;;;2881:1;2878;2871:12;2833:52;2920:9;2907:23;2939:31;2964:5;2939:31;:::i;:::-;2989:5;-1:-1:-1;3046:2:12;3031:18;;3018:32;3059:33;3018:32;3059:33;:::i;:::-;2719:456;;3111:7;;-1:-1:-1;;;3165:2:12;3150:18;;;;3137:32;;2719:456::o;3180:180::-;3239:6;3292:2;3280:9;3271:7;3267:23;3263:32;3260:52;;;3308:1;3305;3298:12;3260:52;-1:-1:-1;3331:23:12;;3180:180;-1:-1:-1;3180:180:12:o;4123:382::-;4188:6;4196;4249:2;4237:9;4228:7;4224:23;4220:32;4217:52;;;4265:1;4262;4255:12;4217:52;4304:9;4291:23;4323:31;4348:5;4323:31;:::i;:::-;4373:5;-1:-1:-1;4430:2:12;4415:18;;4402:32;4443:30;4402:32;4443:30;:::i;:::-;4492:7;4482:17;;;4123:382;;;;;:::o;5012:388::-;5080:6;5088;5141:2;5129:9;5120:7;5116:23;5112:32;5109:52;;;5157:1;5154;5147:12;5109:52;5196:9;5183:23;5215:31;5240:5;5215:31;:::i;:::-;5265:5;-1:-1:-1;5322:2:12;5307:18;;5294:32;5335:33;5294:32;5335:33;:::i;5684:127::-;5745:10;5740:3;5736:20;5733:1;5726:31;5776:4;5773:1;5766:15;5800:4;5797:1;5790:15;5816:275;5887:2;5881:9;5952:2;5933:13;;-1:-1:-1;;5929:27:12;5917:40;;5987:18;5972:34;;6008:22;;;5969:62;5966:88;;;6034:18;;:::i;:::-;6070:2;6063:22;5816:275;;-1:-1:-1;5816:275:12:o;6096:183::-;6156:4;6189:18;6181:6;6178:30;6175:56;;;6211:18;;:::i;:::-;-1:-1:-1;6256:1:12;6252:14;6268:4;6248:25;;6096:183::o;6284:662::-;6338:5;6391:3;6384:4;6376:6;6372:17;6368:27;6358:55;;6409:1;6406;6399:12;6358:55;6445:6;6432:20;6471:4;6495:60;6511:43;6551:2;6511:43;:::i;:::-;6495:60;:::i;:::-;6589:15;;;6675:1;6671:10;;;;6659:23;;6655:32;;;6620:12;;;;6699:15;;;6696:35;;;6727:1;6724;6717:12;6696:35;6763:2;6755:6;6751:15;6775:142;6791:6;6786:3;6783:15;6775:142;;;6857:17;;6845:30;;6895:12;;;;6808;;6775:142;;;-1:-1:-1;6935:5:12;6284:662;-1:-1:-1;;;;;;6284:662:12:o;6951:1215::-;7069:6;7077;7130:2;7118:9;7109:7;7105:23;7101:32;7098:52;;;7146:1;7143;7136:12;7098:52;7186:9;7173:23;7215:18;7256:2;7248:6;7245:14;7242:34;;;7272:1;7269;7262:12;7242:34;7310:6;7299:9;7295:22;7285:32;;7355:7;7348:4;7344:2;7340:13;7336:27;7326:55;;7377:1;7374;7367:12;7326:55;7413:2;7400:16;7435:4;7459:60;7475:43;7515:2;7475:43;:::i;7459:60::-;7553:15;;;7635:1;7631:10;;;;7623:19;;7619:28;;;7584:12;;;;7659:19;;;7656:39;;;7691:1;7688;7681:12;7656:39;7715:11;;;;7735:217;7751:6;7746:3;7743:15;7735:217;;;7831:3;7818:17;7848:31;7873:5;7848:31;:::i;:::-;7892:18;;7768:12;;;;7930;;;;7735:217;;;7971:5;-1:-1:-1;;8014:18:12;;8001:32;;-1:-1:-1;;8045:16:12;;;8042:36;;;8074:1;8071;8064:12;8042:36;;8097:63;8152:7;8141:8;8130:9;8126:24;8097:63;:::i;:::-;8087:73;;;6951:1215;;;;;:::o;8171:380::-;8250:1;8246:12;;;;8293;;;8314:61;;8368:4;8360:6;8356:17;8346:27;;8314:61;8421:2;8413:6;8410:14;8390:18;8387:38;8384:161;;8467:10;8462:3;8458:20;8455:1;8448:31;8502:4;8499:1;8492:15;8530:4;8527:1;8520:15;8384:161;;8171:380;;;:::o;8556:127::-;8617:10;8612:3;8608:20;8605:1;8598:31;8648:4;8645:1;8638:15;8672:4;8669:1;8662:15;8688:125;8753:9;;;8774:10;;;8771:36;;;8787:18;;:::i;8818:135::-;8857:3;8878:17;;;8875:43;;8898:18;;:::i;:::-;-1:-1:-1;8945:1:12;8934:13;;8818:135::o;9237:184::-;9307:6;9360:2;9348:9;9339:7;9335:23;9331:32;9328:52;;;9376:1;9373;9366:12;9328:52;-1:-1:-1;9399:16:12;;9237:184;-1:-1:-1;9237:184:12:o;10042:287::-;10171:3;10209:6;10203:13;10225:66;10284:6;10279:3;10272:4;10264:6;10260:17;10225:66;:::i;:::-;10307:16;;;;;10042:287;-1:-1:-1;;10042:287:12:o;10334:259::-;10412:6;10465:2;10453:9;10444:7;10440:23;10436:32;10433:52;;;10481:1;10478;10471:12;10433:52;10513:9;10507:16;10532:31;10557:5;10532:31;:::i;10598:245::-;10665:6;10718:2;10706:9;10697:7;10693:23;10689:32;10686:52;;;10734:1;10731;10724:12;10686:52;10766:9;10760:16;10785:28;10807:5;10785:28;:::i;10848:128::-;10915:9;;;10936:11;;;10933:37;;;10950:18;;:::i;10981:168::-;11054:9;;;11085;;11102:15;;;11096:22;;11082:37;11072:71;;11123:18;;:::i;11154:217::-;11194:1;11220;11210:132;;11264:10;11259:3;11255:20;11252:1;11245:31;11299:4;11296:1;11289:15;11327:4;11324:1;11317:15;11210:132;-1:-1:-1;11356:9:12;;11154:217::o;11376:127::-;11437:10;11432:3;11428:20;11425:1;11418:31;11468:4;11465:1;11458:15;11492:4;11489:1;11482:15;13442:980;13704:4;13752:3;13741:9;13737:19;13783:6;13772:9;13765:25;13809:2;13847:6;13842:2;13831:9;13827:18;13820:34;13890:3;13885:2;13874:9;13870:18;13863:31;13914:6;13949;13943:13;13980:6;13972;13965:22;14018:3;14007:9;14003:19;13996:26;;14057:2;14049:6;14045:15;14031:29;;14078:1;14088:195;14102:6;14099:1;14096:13;14088:195;;;14167:13;;-1:-1:-1;;;;;14163:39:12;14151:52;;14258:15;;;;14223:12;;;;14199:1;14117:9;14088:195;;;-1:-1:-1;;;;;;;14339:32:12;;;;14334:2;14319:18;;14312:60;-1:-1:-1;;;14403:3:12;14388:19;14381:35;14300:3;13442:980;-1:-1:-1;;;13442:980:12:o;14427:881::-;14522:6;14553:2;14596;14584:9;14575:7;14571:23;14567:32;14564:52;;;14612:1;14609;14602:12;14564:52;14645:9;14639:16;14678:18;14670:6;14667:30;14664:50;;;14710:1;14707;14700:12;14664:50;14733:22;;14786:4;14778:13;;14774:27;-1:-1:-1;14764:55:12;;14815:1;14812;14805:12;14764:55;14844:2;14838:9;14867:60;14883:43;14923:2;14883:43;:::i;14867:60::-;14961:15;;;15043:1;15039:10;;;;15031:19;;15027:28;;;14992:12;;;;15067:19;;;15064:39;;;15099:1;15096;15089:12;15064:39;15123:11;;;;15143:135;15159:6;15154:3;15151:15;15143:135;;;15225:10;;15213:23;;15176:12;;;;15256;;;;15143:135;;;15297:5;14427:881;-1:-1:-1;;;;;;;14427:881:12:o

Swarm Source

ipfs://3e8f85159371c08761bdc0209831e7a92a276a93b57d08d39e53a2e5a7ab62ea
Loading