ETH Price: $3,399.94 (+1.96%)

Token

Ring of Pyro ($RING)
 

Overview

Max Total Supply

99,916.666666667 $RING

Holders

255

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
151 $RING

Value
$0.00
0xd115af8778f983c72f3c1d08ab6f95025f9e149c
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
RingOfPyro

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 5000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-30
*/

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.9.0;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function getOwner() external view returns (address);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address _owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IFactoryV2 {
    event PairCreated(address indexed token0, address indexed token1, address lpPair, uint);
    function getPair(address tokenA, address tokenB) external view returns (address lpPair);
    function createPair(address tokenA, address tokenB) external returns (address lpPair);
}

interface IV2Pair {
    function factory() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function sync() external;
}

interface IRouter01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function swapExactETHForTokens(
        uint amountOutMin, 
        address[] calldata path, 
        address to, uint deadline
    ) external payable returns (uint[] memory amounts);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IRouter02 is IRouter01 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
}

interface AntiSnipe {
    function checkUser(address from, address to, uint256 amt) external returns (bool);
    function setLaunch(address _initialLpPair, uint32 _liqAddBlock, uint64 _liqAddStamp, uint8 dec) external;
    function setLpPair(address pair, bool enabled) external;
    function setProtections(bool _as, bool _ab) external;
    function removeSniper(address account) external;
    function isBlacklisted(address account) external view returns (bool);
    function setBlacklistEnabled(address account, bool enabled) external;
    function setBlacklistEnabledMultiple(address[] memory accounts, bool enabled) external;
}

contract RingOfPyro is IERC20 {
    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => bool) lpPairs;
    uint256 private timeSinceLastPair = 0;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) private _liquidityHolders;
    mapping (address => bool) private _isExcludedFromProtection;
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) private _isExcludedFromLimits;
   
    uint256 constant private startingSupply = 100_000;
    string constant private _name = "Ring of Pyro";
    string constant private _symbol = "$RING";
    uint8 constant private _decimals = 9;

    uint256 private _tTotal = startingSupply * 10**_decimals;

    struct Fees {
        uint16 buyFee;
        uint16 sellFee;
        uint16 transferFee;
    }

    struct Ratios {
        uint16 liquidity;
        uint16 marketing;
        uint16 development;
        uint16 burn;
        uint16 contractX;
        uint16 pyro;
        uint16 totalSwap;
    }

    Fees public _taxRates = Fees({
        buyFee: 500,
        sellFee: 2500,
        transferFee: 800
    });

    Ratios public _ratios = Ratios({
        liquidity: 100,
        marketing: 1200,
        development: 1200,
        burn: 100,
        contractX: 200,
        pyro: 200,
        totalSwap: 2900
    });

    uint256 constant public maxBuyTaxes = 2000;
    uint256 constant public maxSellTaxes = 2000;
    uint256 constant public maxTransferTaxes = 2000;
    uint256 constant public maxRoundtripTax = 3000;
    uint256 constant masterTaxDivisor = 10000;

    bool public taxesAreLocked;
    IRouter02 public dexRouter;
    address public lpPair;
    address constant public DEAD = 0x000000000000000000000000000000000000dEaD;

    struct TaxWallets {
        address payable marketing;
        address payable development;
        address payable liquidity;
        address payable contractX;
        address payable pyro;
    }

    TaxWallets public _taxWallets = TaxWallets({
        marketing: payable(0x9C3543BF2d6f46bFdd3a0789628bba6a2B5DA7de), 
        development: payable(0x858Ff8811Bf1355047f817D09f3e0D800E7054aa),
        liquidity: payable(0x858Ff8811Bf1355047f817D09f3e0D800E7054aa),
        contractX: payable(DEAD),
        pyro: payable(0x858Ff8811Bf1355047f817D09f3e0D800E7054aa)
    });
    
    bool inSwap;
    bool public contractSwapEnabled = false;
    uint256 public swapThreshold;
    uint256 public swapAmount;
    bool public piContractSwapsEnabled;
    uint256 public piSwapPercent = 10;
    
    uint256 private _maxTxAmount = (_tTotal * 2) / 100;
    uint256 private _maxWalletSize = (_tTotal * 2) / 100;

    bool public tradingEnabled = false;
    bool public _hasLiqBeenAdded = false;
    AntiSnipe antiSnipe;

    address public contractX;
    address public contractPyro;

    uint256 public contractXBurned;
    uint256 public contractPyroBurned;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event RingOwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event ContractSwapEnabledUpdated(bool enabled);
    event AutoLiquify(uint256 amountCurrency, uint256 amountTokens);
    
    modifier inSwapFlag {
        inSwap = true;
        _;
        inSwap = false;
    }

    modifier onlyOwner() {
        require(_owner == msg.sender, "Caller =/= owner.");
        _;
    }

    constructor () payable {
        _tOwned[msg.sender] = _tTotal;
        emit Transfer(address(0), msg.sender, _tTotal);

        // Set the owner.
        _owner = _taxWallets.development;

        if (block.chainid == 56) {
            dexRouter = IRouter02(0x10ED43C718714eb63d5aA57B78B54704E256024E);
        } else if (block.chainid == 97) {
            dexRouter = IRouter02(0xD99D1c33F9fC3444f8101754aBC46c52416550D1);
            _owner = msg.sender;
        } else if (block.chainid == 1 || block.chainid == 4 || block.chainid == 3) {
            dexRouter = IRouter02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
            //Ropstein DAI 0xaD6D458402F60fD3Bd25163575031ACDce07538D
        } else if (block.chainid == 43114) {
            dexRouter = IRouter02(0x60aE616a2155Ee3d9A68541Ba4544862310933d4);
        } else if (block.chainid == 250) {
            dexRouter = IRouter02(0xF491e7B69E4244ad4002BC14e878a34207E38c29);
        } else {
            revert();
        }

        lpPair = IFactoryV2(dexRouter.factory()).createPair(dexRouter.WETH(), address(this));
        lpPairs[lpPair] = true;

        _approve(_owner, address(dexRouter), type(uint256).max);
        _approve(address(this), address(dexRouter), type(uint256).max);

        _isExcludedFromFees[_owner] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[DEAD] = true;
        _liquidityHolders[_owner] = true;
    }

    receive() external payable {}

//===============================================================================================================
//===============================================================================================================
//===============================================================================================================
    // Ownable removed as a lib and added here to allow for custom transfers and renouncements.
    // This allows for removal of ownership privileges from the owner once renounced or transferred.
    address private _owner;

    function transferOwner(address newOwner) external onlyOwner {
        require(newOwner != address(0), "Call renounceOwnership to transfer owner to the zero address.");
        require(newOwner != DEAD, "Call renounceOwnership to transfer owner to the zero address.");
        setExcludedFromFees(_owner, false);
        setExcludedFromFees(newOwner, true);
        
        if (balanceOf(_owner) > 0) {
            finalizeTransfer(_owner, newOwner, balanceOf(_owner), false, false, true);
        }
        
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
        
    }

    function renounceOwnership() external onlyOwner {
        setExcludedFromFees(_owner, false);
        address oldOwner = _owner;
        _owner = address(0);
        emit OwnershipTransferred(oldOwner, address(0));
    }

//===============================================================================================================
//===============================================================================================================
//===============================================================================================================

    function totalSupply() external view override returns (uint256) { return _tTotal; }
    function decimals() external pure override returns (uint8) { return _decimals; }
    function symbol() external pure override returns (string memory) { return _symbol; }
    function name() external pure override returns (string memory) { return _name; }
    function getOwner() external view override returns (address) { return _owner; }
    function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; }
    function balanceOf(address account) public view override returns (uint256) {
        return _tOwned[account];
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function _approve(address sender, address spender, uint256 amount) internal {
        require(sender != address(0), "ERC20: Zero Address");
        require(spender != address(0), "ERC20: Zero Address");

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

    function approveContractContingency() external onlyOwner returns (bool) {
        _approve(address(this), address(dexRouter), type(uint256).max);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if (_allowances[sender][msg.sender] != type(uint256).max) {
            _allowances[sender][msg.sender] -= amount;
        }

        return _transfer(sender, recipient, amount);
    }

    function setNewRouter(address newRouter) external onlyOwner {
        require(!_hasLiqBeenAdded, "Cannot change after liquidity.");
        IRouter02 _newRouter = IRouter02(newRouter);
        address get_pair = IFactoryV2(_newRouter.factory()).getPair(address(this), _newRouter.WETH());
        if (get_pair == address(0)) {
            lpPair = IFactoryV2(_newRouter.factory()).createPair(address(this), _newRouter.WETH());
        }
        else {
            lpPair = get_pair;
        }
        dexRouter = _newRouter;
        _approve(address(this), address(dexRouter), type(uint256).max);
    }

    function setLpPair(address pair, bool enabled) external onlyOwner {
        if (!enabled) {
            lpPairs[pair] = false;
            antiSnipe.setLpPair(pair, false);
        } else {
            if (timeSinceLastPair != 0) {
                require(block.timestamp - timeSinceLastPair > 3 days, "3 Day cooldown.!");
            }
            lpPairs[pair] = true;
            timeSinceLastPair = block.timestamp;
            antiSnipe.setLpPair(pair, true);
        }
    }

    function setInitializer(address initializer) external onlyOwner {
        require(!tradingEnabled);
        require(initializer != address(this), "Can't be self.");
        antiSnipe = AntiSnipe(initializer);
    }

    function isExcludedFromLimits(address account) external view returns (bool) {
        return _isExcludedFromLimits[account];
    }

    function isExcludedFromFees(address account) external view returns(bool) {
        return _isExcludedFromFees[account];
    }

    function isExcludedFromProtection(address account) external view returns (bool) {
        return _isExcludedFromProtection[account];
    }

    function setExcludedFromLimits(address account, bool enabled) external onlyOwner {
        _isExcludedFromLimits[account] = enabled;
    }

    function setExcludedFromFees(address account, bool enabled) public onlyOwner {
        _isExcludedFromFees[account] = enabled;
    }

    function setExcludedFromProtection(address account, bool enabled) external onlyOwner {
        _isExcludedFromProtection[account] = enabled;
    }

    function getCirculatingSupply() public view returns (uint256) {
        return (_tTotal - (balanceOf(DEAD) + balanceOf(address(0))));
    }

//================================================ BLACKLIST

    function setBlacklistEnabled(address account, bool enabled) external onlyOwner {
        antiSnipe.setBlacklistEnabled(account, enabled);
    }

    function setBlacklistEnabledMultiple(address[] memory accounts, bool enabled) external onlyOwner {
        antiSnipe.setBlacklistEnabledMultiple(accounts, enabled);
    }

    function isBlacklisted(address account) external view returns (bool) {
        return antiSnipe.isBlacklisted(account);
    }

//================================================ BLACKLIST

    function removeSniper(address account) external onlyOwner {
        antiSnipe.removeSniper(account);
    }

    function setProtectionSettings(bool _antiSnipe, bool _antiBlock) external onlyOwner {
        antiSnipe.setProtections(_antiSnipe, _antiBlock);
    }

    function lockTaxes() external onlyOwner {
        // This will lock taxes at their current value forever, do not call this unless you're sure.
        taxesAreLocked = true;
    }

    function setTaxes(uint16 buyFee, uint16 sellFee, uint16 transferFee) external onlyOwner {
        require(!taxesAreLocked, "Taxes are locked.");
        require(buyFee <= maxBuyTaxes
                && sellFee <= maxSellTaxes
                && transferFee <= maxTransferTaxes,
                "Cannot exceed maximums.");
        require(buyFee + sellFee <= maxRoundtripTax, "Cannot exceed roundtrip maximum.");
        _taxRates.buyFee = buyFee;
        _taxRates.sellFee = sellFee;
        _taxRates.transferFee = transferFee;
    }

    function setRatios(uint16 liquidity, uint16 marketing, uint16 development, uint16 burn, uint16 xContract, uint16 pyro) external onlyOwner {
        _ratios.liquidity = liquidity;
        _ratios.marketing = marketing;
        _ratios.development = development;
        _ratios.burn = burn;
        _ratios.contractX = xContract;
        _ratios.pyro = pyro;
        _ratios.totalSwap = liquidity + marketing + development + xContract + pyro;
        uint256 total = _taxRates.buyFee + _taxRates.sellFee;
        require(_ratios.totalSwap + _ratios.burn <= total, "Cannot exceed sum of buy and sell fees.");
    }

    function setWallets(address payable marketing, address payable development, address payable liquidity) external onlyOwner {
        _taxWallets.marketing = payable(marketing);
        _taxWallets.development = payable(development);
        _taxWallets.liquidity = payable(liquidity);
    }

    function setPurchaseDestinations(address payable xContract, address payable pyro) external onlyOwner {
        _taxWallets.contractX = payable(xContract);
        _taxWallets.pyro = payable(pyro);
    }

    function setMaxTxPercent(uint256 percent, uint256 divisor) external onlyOwner {
        require((_tTotal * percent) / divisor >= (_tTotal * 5 / 1000), "Max Transaction amt must be above 0.5% of total supply.");
        _maxTxAmount = (_tTotal * percent) / divisor;
    }

    function setMaxWalletSize(uint256 percent, uint256 divisor) external onlyOwner {
        require((_tTotal * percent) / divisor >= (_tTotal / 100), "Max Wallet amt must be above 1% of total supply.");
        _maxWalletSize = (_tTotal * percent) / divisor;
    }

    function getMaxTX() external view returns (uint256) {
        return _maxTxAmount / (10**_decimals);
    }

    function getMaxWallet() external view returns (uint256) {
        return _maxWalletSize / (10**_decimals);
    }

    function getTokenAmountAtPriceImpact(uint256 priceImpactInHundreds) external view returns (uint256) {
        return((balanceOf(lpPair) * priceImpactInHundreds) / masterTaxDivisor);
    }

    function setSwapSettings(uint256 thresholdPercent, uint256 thresholdDivisor, uint256 amountPercent, uint256 amountDivisor) external onlyOwner {
        swapThreshold = (_tTotal * thresholdPercent) / thresholdDivisor;
        swapAmount = (_tTotal * amountPercent) / amountDivisor;
        require(swapThreshold <= swapAmount, "Threshold cannot be above amount.");
        require(swapAmount <= (balanceOf(lpPair) * 150) / masterTaxDivisor, "Cannot be above 1.5% of current PI.");
        require(swapAmount >= _tTotal / 1_000_000, "Cannot be lower than 0.00001% of total supply.");
        require(swapThreshold >= _tTotal / 1_000_000, "Cannot be lower than 0.00001% of total supply.");
    }

    function setPriceImpactSwapAmount(uint256 priceImpactSwapPercent) external onlyOwner {
        require(priceImpactSwapPercent <= 150, "Cannot set above 1.5%.");
        piSwapPercent = priceImpactSwapPercent;
    }

    function setContractSwapEnabled(bool swapEnabled, bool priceImpactSwapEnabled) external onlyOwner {
        contractSwapEnabled = swapEnabled;
        piContractSwapsEnabled = priceImpactSwapEnabled;
        emit ContractSwapEnabledUpdated(swapEnabled);
    }

    function setContractX(address _contractX) external onlyOwner {
        contractX = _contractX;
    }

    function setContractPyro(address pyro) external onlyOwner {
        contractPyro = pyro;
    }

    function getTotalBurned() external view returns (uint256 contractXTotalBurned, uint256 pyroTotalBurned) {
        contractXTotalBurned = contractXBurned;
        pyroTotalBurned = contractPyroBurned;
    }

    function _hasLimits(address from, address to) internal view returns (bool) {
        return from != _owner
            && to != _owner
            && tx.origin != _owner
            && !_liquidityHolders[to]
            && !_liquidityHolders[from]
            && to != DEAD
            && to != address(0)
            && from != address(this)
            && from != address(antiSnipe)
            && to != address(antiSnipe);
    }

    function _transfer(address from, address to, uint256 amount) internal returns (bool) {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        bool buy = false;
        bool sell = false;
        bool other = false;
        if (lpPairs[from]) {
            buy = true;
        } else if (lpPairs[to]) {
            sell = true;
        } else {
            other = true;
        }
        if (_hasLimits(from, to)) {
            if(!tradingEnabled) {
                revert("Trading not yet enabled!");
            }
            if (buy || sell){
                if (!_isExcludedFromLimits[from] && !_isExcludedFromLimits[to]) {
                    require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
                }
            }
            if (to != address(dexRouter) && !sell) {
                if (!_isExcludedFromLimits[to]) {
                    require(balanceOf(to) + amount <= _maxWalletSize, "Transfer amount exceeds the maxWalletSize.");
                }
            }
        }

        if (sell) {
            if (!inSwap) {
                if (contractSwapEnabled) {
                    uint256 contractTokenBalance = balanceOf(address(this));
                    if (contractTokenBalance >= swapThreshold) {
                        uint256 swapAmt = swapAmount;
                        if (piContractSwapsEnabled) { swapAmt = (balanceOf(lpPair) * piSwapPercent) / masterTaxDivisor; }
                        if (contractTokenBalance >= swapAmt) { contractTokenBalance = swapAmt; }
                        contractSwap(contractTokenBalance);
                    }
                }
            }
        }
        return finalizeTransfer(from, to, amount, buy, sell, other);
    }

    function contractSwap(uint256 contractTokenBalance) internal inSwapFlag {
        Ratios memory ratios = _ratios;
        if (ratios.totalSwap == 0) {
            return;
        }

        if (_allowances[address(this)][address(dexRouter)] != type(uint256).max) {
            _allowances[address(this)][address(dexRouter)] = type(uint256).max;
        }

        uint256 toLiquify = ((contractTokenBalance * ratios.liquidity) / ratios.totalSwap) / 2;
        uint256 swapAmt = contractTokenBalance - toLiquify;
        
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dexRouter.WETH();

        try dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            swapAmt,
            0,
            path,
            address(this),
            block.timestamp
        ) {} catch {
            return;
        }

        uint256 amtBalance = address(this).balance;
        uint256 liquidityBalance = (amtBalance * toLiquify) / swapAmt;

        if (toLiquify > 0) {
            try dexRouter.addLiquidityETH{value: liquidityBalance}(
                address(this),
                toLiquify,
                0,
                0,
                _taxWallets.liquidity,
                block.timestamp
            ) {
                emit AutoLiquify(liquidityBalance, toLiquify);
            } catch {
                return;
            }
        }

        amtBalance -= liquidityBalance;
        ratios.totalSwap -= ratios.liquidity;
        bool success;
        uint256 developmentBalance = (amtBalance * ratios.development) / ratios.totalSwap;
        uint256 contractXBalance = (contractX != address(0)) ? (amtBalance * ratios.contractX) / ratios.totalSwap : 0;
        uint256 contractPyroBalance = (contractPyro != address(0)) ? (amtBalance * ratios.pyro) / ratios.totalSwap : 0;
        uint256 marketingBalance = amtBalance - (developmentBalance + contractXBalance + contractPyroBalance);
        if (marketingBalance > 0) {
            (success,) = _taxWallets.marketing.call{value: marketingBalance, gas: 35000}("");
        }
        if (developmentBalance > 0) {
            (success,) = _taxWallets.development.call{value: developmentBalance, gas: 35000}("");
        }
        if (contractXBalance > 0) {
            path[0] = dexRouter.WETH();
            path[1] = contractX;
            buyTokens(path, contractXBalance, _taxWallets.contractX);
        }
        if (contractPyroBalance > 0) {
            path[0] = dexRouter.WETH();
            path[1] = contractPyro;
            buyTokens(path, contractPyroBalance, _taxWallets.pyro);
        }
    }

    function buyTokens(address[] memory path, uint256 amount, address payable destination) internal {
        try dexRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}
        (
            0,
            path,
            address(this),
            block.timestamp
        ) {
            IERC20 token = IERC20(path[1]);
            token.transfer(destination, token.balanceOf(address(this)));
            if (path[1] ==  contractX) {
                contractXBurned += amount;
            } else if (path[1] == contractPyro) {
                contractPyroBurned += amount;
            }
        } catch {
            return;
        }
    }

    function _checkLiquidityAdd(address from, address to) internal {
        require(!_hasLiqBeenAdded, "Liquidity already added and marked.");
        if (!_hasLimits(from, to) && to == lpPair) {
            _liquidityHolders[from] = true;
            _isExcludedFromFees[from] = true;
            _hasLiqBeenAdded = true;
            if (address(antiSnipe) == address(0)){
                antiSnipe = AntiSnipe(address(this));
            }
            contractSwapEnabled = true;
            emit ContractSwapEnabledUpdated(true);
        }
    }

    function enableTrading() public onlyOwner {
        require(!tradingEnabled, "Trading already enabled!");
        require(_hasLiqBeenAdded, "Liquidity must be added.");
        if (address(antiSnipe) == address(0)){
            antiSnipe = AntiSnipe(address(this));
        }
        try antiSnipe.setLaunch(lpPair, uint32(block.number), uint64(block.timestamp), _decimals) {} catch {}
        tradingEnabled = true;
        swapThreshold = (balanceOf(lpPair) * 10) / 10000;
        swapAmount = (balanceOf(lpPair) * 30) / 10000;
    }

    function sweepContingency() external onlyOwner {
        require(!_hasLiqBeenAdded, "Cannot call after liquidity.");
        payable(_owner).transfer(address(this).balance);
    }

    function multiSendTokens(address[] memory accounts, uint256[] memory amounts) external onlyOwner {
        require(accounts.length == amounts.length, "Lengths do not match.");
        for (uint16 i = 0; i < accounts.length; i++) {
            require(balanceOf(msg.sender) >= amounts[i]*10**_decimals);
            finalizeTransfer(msg.sender, accounts[i], amounts[i]*10**_decimals, false, false, true);
        }
    }

    function finalizeTransfer(address from, address to, uint256 amount, bool buy, bool sell, bool other) internal returns (bool) {
        if (!_hasLiqBeenAdded) {
            _checkLiquidityAdd(from, to);
            if (!_hasLiqBeenAdded && _hasLimits(from, to) && !_isExcludedFromProtection[from] && !_isExcludedFromProtection[to] && !other) {
                revert("Pre-liquidity transfer protection.");
            }
        }

        if (_hasLimits(from, to)) { bool checked;
            try antiSnipe.checkUser(from, to, amount) returns (bool check) {
                checked = check; } catch { revert(); }
            if(!checked) { revert(); }
        }

        bool takeFee = true;
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]){
            takeFee = false;
        }

        _tOwned[from] -= amount;
        uint256 amountReceived = (takeFee) ? takeTaxes(from, buy, sell, amount) : amount;
        _tOwned[to] += amountReceived;

        emit Transfer(from, to, amountReceived);
        return true;
    }

    function takeTaxes(address from, bool buy, bool sell, uint256 amount) internal returns (uint256) {
        Ratios memory ratios = _ratios;
        uint256 currentFee;
        if (buy) {
            currentFee = _taxRates.buyFee;
        } else if (sell) {
            currentFee = _taxRates.sellFee;
        } else {
            currentFee = _taxRates.transferFee;
        }
        if (address(antiSnipe) == address(this)
            && (block.chainid == 1
            || block.chainid == 56)) { currentFee = 4500; }
        uint256 feeAmount = amount * currentFee / masterTaxDivisor;
        uint256 burnAmount = (feeAmount * ratios.burn) / (ratios.burn + ratios.totalSwap);
        uint256 swapAmt = feeAmount - burnAmount;
        if (swapAmt > 0) {
            _tOwned[address(this)] += swapAmt;
            emit Transfer(from, address(this), swapAmt);
        }
        if (burnAmount > 0) {
            _tTotal -= burnAmount;
            emit Transfer(from, address(0), burnAmount);
        }

        return amount - feeAmount;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"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":"amountCurrency","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"AutoLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"ContractSwapEnabledUpdated","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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"RingOwnershipTransferred","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"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_hasLiqBeenAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ratios","outputs":[{"internalType":"uint16","name":"liquidity","type":"uint16"},{"internalType":"uint16","name":"marketing","type":"uint16"},{"internalType":"uint16","name":"development","type":"uint16"},{"internalType":"uint16","name":"burn","type":"uint16"},{"internalType":"uint16","name":"contractX","type":"uint16"},{"internalType":"uint16","name":"pyro","type":"uint16"},{"internalType":"uint16","name":"totalSwap","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxRates","outputs":[{"internalType":"uint16","name":"buyFee","type":"uint16"},{"internalType":"uint16","name":"sellFee","type":"uint16"},{"internalType":"uint16","name":"transferFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxWallets","outputs":[{"internalType":"address payable","name":"marketing","type":"address"},{"internalType":"address payable","name":"development","type":"address"},{"internalType":"address payable","name":"liquidity","type":"address"},{"internalType":"address payable","name":"contractX","type":"address"},{"internalType":"address payable","name":"pyro","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","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":[],"name":"approveContractContingency","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":"contractPyro","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractPyroBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractSwapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractX","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractXBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxTX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"priceImpactInHundreds","type":"uint256"}],"name":"getTokenAmountAtPriceImpact","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalBurned","outputs":[{"internalType":"uint256","name":"contractXTotalBurned","type":"uint256"},{"internalType":"uint256","name":"pyroTotalBurned","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromProtection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyTaxes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxRoundtripTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTaxes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransferTaxes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"multiSendTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"piContractSwapsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"piSwapPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setBlacklistEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setBlacklistEnabledMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pyro","type":"address"}],"name":"setContractPyro","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"swapEnabled","type":"bool"},{"internalType":"bool","name":"priceImpactSwapEnabled","type":"bool"}],"name":"setContractSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractX","type":"address"}],"name":"setContractX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"initializer","type":"address"}],"name":"setInitializer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setLpPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setMaxWalletSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setNewRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"priceImpactSwapPercent","type":"uint256"}],"name":"setPriceImpactSwapAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_antiSnipe","type":"bool"},{"internalType":"bool","name":"_antiBlock","type":"bool"}],"name":"setProtectionSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"xContract","type":"address"},{"internalType":"address payable","name":"pyro","type":"address"}],"name":"setPurchaseDestinations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"liquidity","type":"uint16"},{"internalType":"uint16","name":"marketing","type":"uint16"},{"internalType":"uint16","name":"development","type":"uint16"},{"internalType":"uint16","name":"burn","type":"uint16"},{"internalType":"uint16","name":"xContract","type":"uint16"},{"internalType":"uint16","name":"pyro","type":"uint16"}],"name":"setRatios","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"thresholdPercent","type":"uint256"},{"internalType":"uint256","name":"thresholdDivisor","type":"uint256"},{"internalType":"uint256","name":"amountPercent","type":"uint256"},{"internalType":"uint256","name":"amountDivisor","type":"uint256"}],"name":"setSwapSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"buyFee","type":"uint16"},{"internalType":"uint16","name":"sellFee","type":"uint16"},{"internalType":"uint16","name":"transferFee","type":"uint16"}],"name":"setTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"marketing","type":"address"},{"internalType":"address payable","name":"development","type":"address"},{"internalType":"address payable","name":"liquidity","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sweepContingency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"taxesAreLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","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":"transferOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600355620000176009600a620007e8565b6200002690620186a062000800565b600981905560408051606080820183526101f482526109c460208084019190915261032092840192909252600a805465ffffffffffff191665032009c401f4178155835160e08101855260648082526104b08286018190528287015281840181905260c8608080840182905260a080850192909252610b5460c090940193909352600b80546001600160701b0319166d0b5400c800c8006404b004b0006417905586519081018752739c3543bf2d6f46bfdd3a0789628bba6a2b5da7de80825273858ff8811bf1355047f817d09f3e0d800e7054aa96820187905296810186905261dead948101859052909101849052600e80546001600160a01b03199081169096179055600f805486168517905560108054861685179055601180548616909317909255601280549094169092179092556013805461ff0019169055601755906200017490600262000800565b62000180919062000822565b6018556064600954600262000196919062000800565b620001a2919062000822565b601955601a805461ffff1916905560095433600081815260016020908152604080832085905551938452919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3600f54601f80546001600160a01b0319166001600160a01b03909216919091179055466038036200025457600c8054610100600160a81b0319167410ed43c718714eb63d5aa57b78b54704e256024e0017905562000363565b466061036200029f57600c805474d99d1c33f9fc3444f8101754abc46c52416550d100610100600160a81b0319909116179055601f80546001600160a01b0319163317905562000363565b4660011480620002af5750466004145b80620002bb5750466003145b15620002ef57600c8054610100600160a81b031916747a250d5630b4cf539739df2c5dacb4c659f2488d0017905562000363565b4661a86a036200032757600c8054610100600160a81b0319167460ae616a2155ee3d9a68541ba4544862310933d40017905562000363565b4660fa036200035e57600c8054610100600160a81b03191674f491e7b69e4244ad4002bc14e878a34207e38c290017905562000363565b600080fd5b600c60019054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003b7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003dd919062000845565b6001600160a01b031663c9c65396600c60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200043f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000465919062000845565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303816000875af1158015620004b2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004d8919062000845565b600d80546001600160a01b0319166001600160a01b039283169081179091556000908152600260205260409020805460ff19166001179055601f54600c546200052f929182169161010090910416600019620005d2565b600c546200055090309061010090046001600160a01b0316600019620005d2565b601f80546001600160a01b0390811660009081526007602090815260408083208054600160ff19918216811790925530855282852080548216831790557fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d80548216831790559554909416835260059091529020805490921617905562000870565b6001600160a01b038316620006245760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f204164647265737360681b60448201526064015b60405180910390fd5b6001600160a01b038216620006725760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f204164647265737360681b60448201526064016200061b565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200072a5781600019048211156200070e576200070e620006d3565b808516156200071c57918102915b93841c9390800290620006ee565b509250929050565b6000826200074357506001620007e2565b816200075257506000620007e2565b81600181146200076b5760028114620007765762000796565b6001915050620007e2565b60ff8411156200078a576200078a620006d3565b50506001821b620007e2565b5060208310610133831016604e8410600b8410161715620007bb575081810a620007e2565b620007c78383620006e9565b8060001904821115620007de57620007de620006d3565b0290505b92915050565b6000620007f960ff84168362000732565b9392505050565b60008160001904831182151516156200081d576200081d620006d3565b500290565b6000826200084057634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156200085857600080fd5b81516001600160a01b0381168114620007f957600080fd5b6150a180620008806000396000f3fe60806040526004361061044e5760003560e01c806350a8e01611610243578063b1b08f7111610143578063eafb5a3c116100bb578063f94aa1b41161008a578063fdb78c0e1161006f578063fdb78c0e14610dd2578063fe575a8714610df1578063feadde9c14610e1157600080fd5b8063f94aa1b414610d3f578063fb78680d14610db257600080fd5b8063eafb5a3c14610cca578063ee5d9c2d14610cea578063eec2744e14610cff578063f0c68ca314610d1f57600080fd5b8063bfc2fc3511610112578063cf847706116100f7578063cf84770614610baf578063d69153c914610c64578063dd62ed3e14610c8457600080fd5b8063bfc2fc3514610b79578063c31d9e9214610b9957600080fd5b8063b1b08f7114610735578063b3d514fb14610735578063b55cd04b14610b37578063b7df8b3614610b5f57600080fd5b806375cb1bd1116101d65780638a63bd9b116101a557806391ac5ea61161018a57806391ac5ea614610ab157806395d89b4114610ad1578063a9059cbb14610b1757600080fd5b80638a63bd9b14610a875780638a8c523c14610a9c57600080fd5b806375cb1bd114610a1457806378648edf14610a3457806380c581d114610a49578063893d20e814610a6957600080fd5b80635cce86cd116102125780635cce86cd1461097b5780636ebd0078146109b457806370a08231146109c9578063715018a6146109ff57600080fd5b806350a8e016146108fc578063581e5a361461091b578063590ffdce1461093b5780635c24b0741461095b57600080fd5b8063285777511161034e57806336fddb04116102e15780634ada218b116102b05780634e718e48116102955780634e718e48146108835780634fb2e45d146108a35780634fbee193146108c357600080fd5b80634ada218b146108495780634bbb93eb1461086357600080fd5b806336fddb04146107d35780633f3cf56c146107f3578063452ed4f11461081357806346ea7ac81461083357600080fd5b8063313ce5671161031d578063313ce5671461076157806332cde6641461077d57806333251a0b1461079d57806333d43771146107bd57600080fd5b8063285777511461070a5780632b112e49146107205780632b28fc7a146107355780632e8fa8211461074b57600080fd5b8063095ea7b3116103e15780631303cbc6116103b057806323b872dd1161039557806323b872dd146106aa57806326003957146106ca5780632610eaca146106ea57600080fd5b80631303cbc61461067557806318160ddd1461069557600080fd5b8063095ea7b3146105e75780630dcbcf1c146106075780630fa604e41461064057806310f9f9c51461065557600080fd5b8063069d955f1161041d578063069d955f146104f357806306fdde03146105495780630758d9241461059857806307dd79e0146105bd57600080fd5b806303fd2a451461045a5780630445b6671461048d578063044df726146104b157806305bbedb6146104d357600080fd5b3661045557005b600080fd5b34801561046657600080fd5b5061047061dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561049957600080fd5b506104a360145481565b604051908152602001610484565b3480156104bd57600080fd5b506104d16104cc3660046147f0565b610e31565b005b3480156104df57600080fd5b506104d16104ee366004614936565b610f0e565b3480156104ff57600080fd5b50600a546105249061ffff808216916201000081048216916401000000009091041683565b6040805161ffff94851681529284166020840152921691810191909152606001610484565b34801561055557600080fd5b5060408051808201909152600c81527f52696e67206f66205079726f000000000000000000000000000000000000000060208201525b604051610484919061497d565b3480156105a457600080fd5b50600c546104709061010090046001600160a01b031681565b3480156105c957600080fd5b50600c546105d79060ff1681565b6040519015158152602001610484565b3480156105f357600080fd5b506105d76106023660046149cb565b610fac565b34801561061357600080fd5b506105d76106223660046149f7565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561064c57600080fd5b506104a3610fc3565b34801561066157600080fd5b50601b54610470906001600160a01b031681565b34801561068157600080fd5b506104d16106903660046149f7565b610fe3565b3480156106a157600080fd5b506009546104a3565b3480156106b657600080fd5b506105d76106c5366004614a14565b611060565b3480156106d657600080fd5b506104d16106e5366004614a55565b6110d8565b3480156106f657600080fd5b506104d1610705366004614a77565b6111e2565b34801561071657600080fd5b506104a360175481565b34801561072c57600080fd5b506104a361135a565b34801561074157600080fd5b506104a36107d081565b34801561075757600080fd5b506104a360155481565b34801561076d57600080fd5b5060405160098152602001610484565b34801561078957600080fd5b506104d1610798366004614b49565b6113c3565b3480156107a957600080fd5b506104d16107b83660046149f7565b6115b0565b3480156107c957600080fd5b506104a3601e5481565b3480156107df57600080fd5b506104d16107ee366004614b8c565b611680565b3480156107ff57600080fd5b506104d161080e366004614a55565b6116f9565b34801561081f57600080fd5b50600d54610470906001600160a01b031681565b34801561083f57600080fd5b506104a3610bb881565b34801561085557600080fd5b50601a546105d79060ff1681565b34801561086f57600080fd5b506104a361087e366004614baa565b611810565b34801561088f57600080fd5b506104d161089e366004614baa565b611844565b3480156108af57600080fd5b506104d16108be3660046149f7565b6118e8565b3480156108cf57600080fd5b506105d76108de3660046149f7565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561090857600080fd5b50601a546105d790610100900460ff1681565b34801561092757600080fd5b506104d16109363660046149f7565b611b1a565b34801561094757600080fd5b506104d1610956366004614b8c565b611b97565b34801561096757600080fd5b506104d16109763660046149f7565b611c10565b34801561098757600080fd5b506105d76109963660046149f7565b6001600160a01b031660009081526008602052604090205460ff1690565b3480156109c057600080fd5b506104a3611d06565b3480156109d557600080fd5b506104a36109e43660046149f7565b6001600160a01b031660009081526001602052604090205490565b348015610a0b57600080fd5b506104d1611d21565b348015610a2057600080fd5b506104d1610a2f366004614bc3565b611de1565b348015610a4057600080fd5b506104d1611e7b565b348015610a5557600080fd5b506104d1610a64366004614b8c565b611ed8565b348015610a7557600080fd5b50601f546001600160a01b0316610470565b348015610a9357600080fd5b506105d7612082565b348015610aa857600080fd5b506104d16120f8565b348015610abd57600080fd5b506104d1610acc366004614c0e565b612360565b348015610add57600080fd5b5060408051808201909152600581527f2452494e47000000000000000000000000000000000000000000000000000000602082015261058b565b348015610b2357600080fd5b506105d7610b323660046149cb565b6123e9565b348015610b4357600080fd5b50601d54601e5460408051928352602083019190915201610484565b348015610b6b57600080fd5b506016546105d79060ff1681565b348015610b8557600080fd5b506104d1610b943660046147f0565b612400565b348015610ba557600080fd5b506104a3601d5481565b348015610bbb57600080fd5b50600b54610c209061ffff808216916201000081048216916401000000008204811691660100000000000081048216916801000000000000000082048116916a010000000000000000000081048216916c010000000000000000000000009091041687565b6040805161ffff9889168152968816602088015294871694860194909452918516606085015284166080840152831660a083015290911660c082015260e001610484565b348015610c7057600080fd5b506104d1610c7f366004614c3c565b6124ad565b348015610c9057600080fd5b506104a3610c9f366004614c0e565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b348015610cd657600080fd5b506104d1610ce53660046149f7565b612733565b348015610cf657600080fd5b506104d1612b51565b348015610d0b57600080fd5b506104d1610d1a366004614b8c565b612c33565b348015610d2b57600080fd5b50601c54610470906001600160a01b031681565b348015610d4b57600080fd5b50600e54600f54601054601154601254610d78946001600160a01b03908116948116938116928116911685565b604080516001600160a01b03968716815294861660208601529285169284019290925283166060830152909116608082015260a001610484565b348015610dbe57600080fd5b506104d1610dcd366004614cb0565b612cdb565b348015610dde57600080fd5b506013546105d790610100900460ff1681565b348015610dfd57600080fd5b506105d7610e0c3660046149f7565b612f9c565b348015610e1d57600080fd5b506104d1610e2c366004614b8c565b61302a565b601f546001600160a01b03163314610e845760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b60448201526064015b60405180910390fd5b601a546040517fefbdbabd00000000000000000000000000000000000000000000000000000000815283151560048201528215156024820152620100009091046001600160a01b03169063efbdbabd906044015b600060405180830381600087803b158015610ef257600080fd5b505af1158015610f06573d6000803e3d6000fd5b505050505050565b601f546001600160a01b03163314610f5c5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601a546040517f05bbedb6000000000000000000000000000000000000000000000000000000008152620100009091046001600160a01b0316906305bbedb690610ed89085908590600401614d26565b6000610fb93384846130a3565b5060015b92915050565b6000610fd16009600a614e5d565b601954610fde9190614e6c565b905090565b601f546001600160a01b031633146110315760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601c805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b0383166000908152600460209081526040808320338452909152812054600019146110c5576001600160a01b0384166000908152600460209081526040808320338452909152812080548492906110bf908490614ea7565b90915550505b6110d08484846131b0565b949350505050565b601f546001600160a01b031633146111265760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b60646009546111359190614e6c565b81836009546111449190614eba565b61114e9190614e6c565b10156111c25760405162461bcd60e51b815260206004820152603060248201527f4d61782057616c6c657420616d74206d7573742062652061626f76652031252060448201527f6f6620746f74616c20737570706c792e000000000000000000000000000000006064820152608401610e7b565b80826009546111d19190614eba565b6111db9190614e6c565b6019555050565b601f546001600160a01b031633146112305760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b80518251146112815760405162461bcd60e51b815260206004820152601560248201527f4c656e6774687320646f206e6f74206d617463682e00000000000000000000006044820152606401610e7b565b60005b82518161ffff1610156113555761129d6009600a614e5d565b828261ffff16815181106112b3576112b3614ed9565b60200260200101516112c59190614eba565b3360009081526001602052604090205410156112e057600080fd5b61134233848361ffff16815181106112fa576112fa614ed9565b60200260200101516009600a6113109190614e5d565b858561ffff168151811061132657611326614ed9565b60200260200101516113389190614eba565b6000806001613641565b508061134d81614f08565b915050611284565b505050565b60016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb495461dead60009081527fb34209a263f6c38fe55f099e9e70f9d67e93982480ff3234a5e0108028ad164d5490916113b691614f29565b600954610fde9190614ea7565b601f546001600160a01b031633146114115760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b600c5460ff16156114645760405162461bcd60e51b815260206004820152601160248201527f546178657320617265206c6f636b65642e0000000000000000000000000000006044820152606401610e7b565b6107d08361ffff161115801561148057506107d08261ffff1611155b801561149257506107d08161ffff1611155b6114de5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420657863656564206d6178696d756d732e0000000000000000006044820152606401610e7b565b610bb86114eb8385614f3c565b61ffff16111561153d5760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742065786365656420726f756e6474726970206d6178696d756d2e6044820152606401610e7b565b600a805461ffff9485167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909116176201000093851693909302929092177fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff166401000000009190931602919091179055565b601f546001600160a01b031633146115fe5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601a546040517f33251a0b0000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015262010000909204909116906333251a0b90602401600060405180830381600087803b15801561166557600080fd5b505af1158015611679573d6000803e3d6000fd5b5050505050565b601f546001600160a01b031633146116ce5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b601f546001600160a01b031633146117475760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b6103e860095460056117599190614eba565b6117639190614e6c565b81836009546117729190614eba565b61177c9190614e6c565b10156117f05760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3525206f6620746f74616c20737570706c792e0000000000000000006064820152608401610e7b565b80826009546117ff9190614eba565b6118099190614e6c565b6018555050565b600d546001600160a01b03166000908152600160205260408120546127109061183a908490614eba565b610fbd9190614e6c565b601f546001600160a01b031633146118925760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b60968111156118e35760405162461bcd60e51b815260206004820152601660248201527f43616e6e6f74207365742061626f766520312e35252e000000000000000000006044820152606401610e7b565b601755565b601f546001600160a01b031633146119365760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b6001600160a01b0381166119b25760405162461bcd60e51b815260206004820152603d60248201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660448201527f6572206f776e657220746f20746865207a65726f20616464726573732e0000006064820152608401610e7b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21536001600160a01b03821601611a505760405162461bcd60e51b815260206004820152603d60248201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660448201527f6572206f776e657220746f20746865207a65726f20616464726573732e0000006064820152608401610e7b565b601f54611a67906001600160a01b03166000611b97565b611a72816001611b97565b601f546001600160a01b031660009081526001602052604090205415611abb57601f546001600160a01b0316600081815260016020526040902054611ab991908390611338565b505b601f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601f546001600160a01b03163314611b685760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601b805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b601f546001600160a01b03163314611be55760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b601f546001600160a01b03163314611c5e5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601a5460ff1615611c6e57600080fd5b306001600160a01b03821603611cc65760405162461bcd60e51b815260206004820152600e60248201527f43616e27742062652073656c662e0000000000000000000000000000000000006044820152606401610e7b565b601a80546001600160a01b0390921662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff909216919091179055565b6000611d146009600a614e5d565b601854610fde9190614e6c565b601f546001600160a01b03163314611d6f5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601f54611d86906001600160a01b03166000611b97565b601f805473ffffffffffffffffffffffffffffffffffffffff1981169091556040516001600160a01b039091169060009082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a350565b601f546001600160a01b03163314611e2f5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b600e80546001600160a01b0394851673ffffffffffffffffffffffffffffffffffffffff1991821617909155600f80549385169382169390931790925560108054919093169116179055565b601f546001600160a01b03163314611ec95760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b600c805460ff19166001179055565b601f546001600160a01b03163314611f265760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b80611f9d576001600160a01b03828116600081815260026020526040808220805460ff19169055601a5490517f80c581d100000000000000000000000000000000000000000000000000000000815260048101939093526024830191909152620100009004909116906380c581d190604401610ed8565b60035415612004576203f48060035442611fb79190614ea7565b116120045760405162461bcd60e51b815260206004820152601060248201527f332044617920636f6f6c646f776e2e21000000000000000000000000000000006044820152606401610e7b565b6001600160a01b0382811660008181526002602052604090819020805460ff1916600190811790915542600355601a5491517f80c581d100000000000000000000000000000000000000000000000000000000815260048101939093526024830152620100009004909116906380c581d190604401610ed8565b5050565b601f546000906001600160a01b031633146120d35760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b600c546120f290309061010090046001600160a01b03166000196130a3565b50600190565b601f546001600160a01b031633146121465760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601a5460ff16156121995760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642100000000000000006044820152606401610e7b565b601a54610100900460ff166121f05760405162461bcd60e51b815260206004820152601860248201527f4c6971756964697479206d7573742062652061646465642e00000000000000006044820152606401610e7b565b601a546201000090046001600160a01b031661223657601a80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff163062010000021790555b601a54600d546040517f6c115c340000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015263ffffffff4316602482015267ffffffffffffffff4216604482015260096064820152620100009092041690636c115c3490608401600060405180830381600087803b1580156122c157600080fd5b505af19250505080156122d2575060015b50601a805460ff19166001179055600d546127109061230f906001600160a01b03166001600160a01b031660009081526001602052604090205490565b61231a90600a614eba565b6123249190614e6c565b601455600d546001600160a01b03166000908152600160205260409020546127109061235190601e614eba565b61235b9190614e6c565b601555565b601f546001600160a01b031633146123ae5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601180546001600160a01b0393841673ffffffffffffffffffffffffffffffffffffffff199182161790915560128054929093169116179055565b60006123f63384846131b0565b5060019392505050565b601f546001600160a01b0316331461244e5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b6013805461ff001916610100841515908102919091179091556016805460ff19168315151790556040519081527f7b0a47d3b0234280b6c9213c5bbff44c8b6001bea7770b3950280f9141053257906020015b60405180910390a15050565b601f546001600160a01b031633146124fb5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b600b805461ffff8881167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909216919091176201000088831602177fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff16640100000000878316027fffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffff1617660100000000000086831602177fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff1668010000000000000000858316027fffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffff16176a010000000000000000000091841691909102179055808285612608888a614f3c565b6126129190614f3c565b61261c9190614f3c565b6126269190614f3c565b600b80547fffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffff166c0100000000000000000000000061ffff93841602179055600a5460009161267d9162010000810482169116614f3c565b600b5461ffff918216925082916126b291660100000000000081048216916c0100000000000000000000000090910416614f3c565b61ffff16111561272a5760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f74206578636565642073756d206f662062757920616e642073656c60448201527f6c20666565732e000000000000000000000000000000000000000000000000006064820152608401610e7b565b50505050505050565b601f546001600160a01b031633146127815760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601a54610100900460ff16156127d95760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206368616e6765206166746572206c69717569646974792e00006044820152606401610e7b565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561281e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128429190614f5e565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561288f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128b39190614f5e565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015612916573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293a9190614f5e565b90506001600160a01b038116612ad857816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ac9190614f5e565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129f9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1d9190614f5e565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015612a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa69190614f5e565b600d805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055612b01565b600d805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383161790555b600c80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0385811682029290921792839055611355923092919004166000196130a3565b601f546001600160a01b03163314612b9f5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601a54610100900460ff1615612bf75760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742063616c6c206166746572206c69717569646974792e000000006044820152606401610e7b565b601f546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015612c30573d6000803e3d6000fd5b50565b601f546001600160a01b03163314612c815760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601a546040517feec2744e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528315156024830152620100009092049091169063eec2744e90604401610ed8565b601f546001600160a01b03163314612d295760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b8284600954612d389190614eba565b612d429190614e6c565b6014556009548190612d55908490614eba565b612d5f9190614e6c565b60158190556014541115612ddb5760405162461bcd60e51b815260206004820152602160248201527f5468726573686f6c642063616e6e6f742062652061626f766520616d6f756e7460448201527f2e000000000000000000000000000000000000000000000000000000000000006064820152608401610e7b565b600d546001600160a01b031660009081526001602052604090205461271090612e05906096614eba565b612e0f9190614e6c565b6015541115612e865760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f742062652061626f766520312e3525206f662063757272656e742060448201527f50492e00000000000000000000000000000000000000000000000000000000006064820152608401610e7b565b620f4240600954612e979190614e6c565b6015541015612f0e5760405162461bcd60e51b815260206004820152602e60248201527f43616e6e6f74206265206c6f776572207468616e20302e303030303125206f6660448201527f20746f74616c20737570706c792e0000000000000000000000000000000000006064820152608401610e7b565b620f4240600954612f1f9190614e6c565b6014541015612f965760405162461bcd60e51b815260206004820152602e60248201527f43616e6e6f74206265206c6f776572207468616e20302e303030303125206f6660448201527f20746f74616c20737570706c792e0000000000000000000000000000000000006064820152608401610e7b565b50505050565b601a546040517ffe575a870000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092620100009004169063fe575a8790602401602060405180830381865afa158015613006573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd9190614f7b565b601f546001600160a01b031633146130785760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6001600160a01b0383166130f95760405162461bcd60e51b815260206004820152601360248201527f45524332303a205a65726f2041646472657373000000000000000000000000006044820152606401610e7b565b6001600160a01b03821661314f5760405162461bcd60e51b815260206004820152601360248201527f45524332303a205a65726f2041646472657373000000000000000000000000006044820152606401610e7b565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006001600160a01b03841661322e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610e7b565b6001600160a01b0383166132aa5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610e7b565b600082116133205760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610e7b565b6001600160a01b0384166000908152600260205260408120548190819060ff161561334e576001925061337c565b6001600160a01b03861660009081526002602052604090205460ff1615613378576001915061337c565b5060015b6133868787613920565b1561359157601a5460ff166133dd5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610e7b565b82806133e65750815b156134aa576001600160a01b03871660009081526008602052604090205460ff1615801561342d57506001600160a01b03861660009081526008602052604090205460ff16155b156134aa576018548511156134aa5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785460448201527f78416d6f756e742e0000000000000000000000000000000000000000000000006064820152608401610e7b565b600c546001600160a01b0387811661010090920416148015906134cb575081155b15613591576001600160a01b03861660009081526008602052604090205460ff166135915760195485613513886001600160a01b031660009081526001602052604090205490565b61351d9190614f29565b11156135915760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201527f616c6c657453697a652e000000000000000000000000000000000000000000006064820152608401610e7b565b81156136285760135460ff1661362857601354610100900460ff1615613628573060009081526001602052604090205460145481106136265760155460165460ff161561361057601754600d546001600160a01b03166000908152600160205260409020546127109161360391614eba565b61360d9190614e6c565b90505b80821061361b578091505b61362482613a37565b505b505b613636878787868686613641565b979650505050505050565b601a54600090610100900460ff166137415761365d87876141c6565b601a54610100900460ff1615801561367a575061367a8787613920565b801561369f57506001600160a01b03871660009081526006602052604090205460ff16155b80156136c457506001600160a01b03861660009081526006602052604090205460ff16155b80156136ce575081155b156137415760405162461bcd60e51b815260206004820152602260248201527f5072652d6c6971756964697479207472616e736665722070726f74656374696f60448201527f6e2e0000000000000000000000000000000000000000000000000000000000006064820152608401610e7b565b61374b8787613920565b156137fe57601a546040517fecd07a530000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152888116602483015260448201889052600092620100009004169063ecd07a53906064016020604051808303816000875af19250505080156137e7575060408051601f3d908101601f191682019092526137e491810190614f7b565b60015b6137f057600080fd5b9050806137fc57600080fd5b505b6001600160a01b03871660009081526007602052604090205460019060ff168061384057506001600160a01b03871660009081526007602052604090205460ff165b15613849575060005b6001600160a01b03881660009081526001602052604081208054889290613871908490614ea7565b9091555060009050816138845786613890565b6138908987878a614336565b6001600160a01b0389166000908152600160205260408120805492935083929091906138bd908490614f29565b92505081905550876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161390991815260200190565b60405180910390a350600198975050505050505050565b601f546000906001600160a01b0384811691161480159061394f5750601f546001600160a01b03838116911614155b80156139665750601f546001600160a01b03163214155b801561398b57506001600160a01b03821660009081526005602052604090205460ff16155b80156139b057506001600160a01b03831660009081526005602052604090205460ff16155b80156139c757506001600160a01b03821661dead14155b80156139db57506001600160a01b03821615155b80156139f057506001600160a01b0383163014155b8015613a105750601a546001600160a01b03848116620100009092041614155b8015613a305750601a546001600160a01b03838116620100009092041614155b9392505050565b6013805460ff191660011790556040805160e081018252600b5461ffff80821683526201000082048116602084015264010000000082048116938301939093526601000000000000810483166060830152680100000000000000008104831660808301526a01000000000000000000008104831660a08301526c01000000000000000000000000900490911660c08201819052600003613ad757506141b9565b306000908152600460209081526040808320600c5461010090046001600160a01b0316845290915290205460001914613b3a57306000908152600460209081526040808320600c5461010090046001600160a01b03168452909152902060001990555b600060028260c0015161ffff16836000015161ffff1685613b5b9190614eba565b613b659190614e6c565b613b6f9190614e6c565b90506000613b7d8285614ea7565b60408051600280825260608201835292935060009290916020830190803683370190505090503081600081518110613bb757613bb7614ed9565b60200260200101906001600160a01b031690816001600160a01b031681525050600c60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c4e9190614f5e565b81600181518110613c6157613c61614ed9565b6001600160a01b039283166020918202929092010152600c546040517f791ac9470000000000000000000000000000000000000000000000000000000081526101009091049091169063791ac94790613cc7908590600090869030904290600401614f98565b600060405180830381600087803b158015613ce157600080fd5b505af1925050508015613cf2575060015b613cff57505050506141b9565b47600083613d0d8684614eba565b613d179190614e6c565b90508415613e1657600c546010546040517ff305d7190000000000000000000000000000000000000000000000000000000081523060048201526024810188905260006044820181905260648201526001600160a01b0391821660848201524260a4820152610100909204169063f305d71990839060c40160606040518083038185885af193505050508015613dca575060408051601f3d908101601f19168201909252613dc791810190614fd4565b60015b613dd9575050505050506141b9565b505060408051838152602081018890527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b613e208183614ea7565b915085600001518660c001818151613e389190615002565b61ffff90811690915260c0880151604089015160009350839291821691613e60911686614eba565b613e6a9190614e6c565b601b549091506000906001600160a01b0316613e87576000613eae565b8860c0015161ffff16896080015161ffff1686613ea49190614eba565b613eae9190614e6c565b601c549091506000906001600160a01b0316613ecb576000613ef2565b8960c0015161ffff168a60a0015161ffff1687613ee89190614eba565b613ef29190614e6c565b9050600081613f018486614f29565b613f0b9190614f29565b613f159088614ea7565b90508015613f7a57600e546040516001600160a01b03909116906188b89083906000818181858888f193505050503d8060008114613f6f576040519150601f19603f3d011682016040523d82523d6000602084013e613f74565b606091505b50909550505b8315613fdd57600f546040516001600160a01b03909116906188b89086906000818181858888f193505050503d8060008114613fd2576040519150601f19603f3d011682016040523d82523d6000602084013e613fd7565b606091505b50909550505b82156140c557600c60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614036573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061405a9190614f5e565b8860008151811061406d5761406d614ed9565b6001600160a01b039283166020918202929092010152601b5489519116908990600190811061409e5761409e614ed9565b6001600160a01b0392831660209182029290920101526011546140c5918a91869116614574565b81156141ad57600c60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561411e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141429190614f5e565b8860008151811061415557614155614ed9565b6001600160a01b039283166020918202929092010152601c5489519116908990600190811061418657614186614ed9565b6001600160a01b0392831660209182029290920101526012546141ad918a91859116614574565b50505050505050505050505b506013805460ff19169055565b601a54610100900460ff16156142445760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201527f65642e00000000000000000000000000000000000000000000000000000000006064820152608401610e7b565b61424e8282613920565b1580156142685750600d546001600160a01b038281169116145b1561207e576001600160a01b038083166000908152600560209081526040808320805460ff1990811660019081179092556007909352922080549091169091179055601a805461ff0019166101001790819055620100009004166142f657601a80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff163062010000021790555b6013805461ff001916610100179055604051600181527f7b0a47d3b0234280b6c9213c5bbff44c8b6001bea7770b3950280f9141053257906020016124a1565b6040805160e081018252600b5461ffff80821683526201000082048116602084015264010000000082048116938301939093526601000000000000810483166060830152680100000000000000008104831660808301526a01000000000000000000008104831660a08301526c01000000000000000000000000900490911660c08201526000908185156143d15750600a5461ffff166143fb565b84156143ea5750600a5462010000900461ffff166143fb565b50600a54640100000000900461ffff165b601a546201000090046001600160a01b031630148015614425575046600114806144255750466038145b1561442f57506111945b600061271061443e8387614eba565b6144489190614e6c565b905060008360c0015184606001516144609190614f3c565b61ffff16846060015161ffff16836144789190614eba565b6144829190614e6c565b905060006144908284614ea7565b905080156144fd5730600090815260016020526040812080548392906144b7908490614f29565b909155505060405181815230906001600160a01b038c16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b811561455c5781600960008282546145159190614ea7565b90915550506040518281526000906001600160a01b038c16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b6145668388614ea7565b9a9950505050505050505050565b600c546040517fb6f9de950000000000000000000000000000000000000000000000000000000081526101009091046001600160a01b03169063b6f9de959084906145ca9060009088903090429060040161501d565b6000604051808303818588803b1580156145e357600080fd5b505af1935050505080156145f5575060015b6145fe57505050565b60008360018151811061461357614613614ed9565b60209081029190910101516040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091506001600160a01b0382169063a9059cbb90849083906370a0823190602401602060405180830381865afa158015614688573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146ac9190615052565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561470f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147339190614f7b565b50601b5484516001600160a01b03909116908590600190811061475857614758614ed9565b60200260200101516001600160a01b03160361478b5782601d60008282546147809190614f29565b90915550612f969050565b601c5484516001600160a01b0390911690859060019081106147af576147af614ed9565b60200260200101516001600160a01b031603612f965782601e60008282546147d79190614f29565b909155505050505050565b8015158114612c3057600080fd5b6000806040838503121561480357600080fd5b823561480e816147e2565b9150602083013561481e816147e2565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561488157614881614829565b604052919050565b600067ffffffffffffffff8211156148a3576148a3614829565b5060051b60200190565b6001600160a01b0381168114612c3057600080fd5b600082601f8301126148d357600080fd5b813560206148e86148e383614889565b614858565b82815260059290921b8401810191818101908684111561490757600080fd5b8286015b8481101561492b57803561491e816148ad565b835291830191830161490b565b509695505050505050565b6000806040838503121561494957600080fd5b823567ffffffffffffffff81111561496057600080fd5b61496c858286016148c2565b925050602083013561481e816147e2565b600060208083528351808285015260005b818110156149aa5785810183015185820160400152820161498e565b506000604082860101526040601f19601f8301168501019250505092915050565b600080604083850312156149de57600080fd5b82356149e9816148ad565b946020939093013593505050565b600060208284031215614a0957600080fd5b8135613a30816148ad565b600080600060608486031215614a2957600080fd5b8335614a34816148ad565b92506020840135614a44816148ad565b929592945050506040919091013590565b60008060408385031215614a6857600080fd5b50508035926020909101359150565b60008060408385031215614a8a57600080fd5b823567ffffffffffffffff80821115614aa257600080fd5b614aae868387016148c2565b9350602091508185013581811115614ac557600080fd5b85019050601f81018613614ad857600080fd5b8035614ae66148e382614889565b81815260059190911b82018301908381019088831115614b0557600080fd5b928401925b82841015614b2357833582529284019290840190614b0a565b80955050505050509250929050565b803561ffff81168114614b4457600080fd5b919050565b600080600060608486031215614b5e57600080fd5b614b6784614b32565b9250614b7560208501614b32565b9150614b8360408501614b32565b90509250925092565b60008060408385031215614b9f57600080fd5b823561480e816148ad565b600060208284031215614bbc57600080fd5b5035919050565b600080600060608486031215614bd857600080fd5b8335614be3816148ad565b92506020840135614bf3816148ad565b91506040840135614c03816148ad565b809150509250925092565b60008060408385031215614c2157600080fd5b8235614c2c816148ad565b9150602083013561481e816148ad565b60008060008060008060c08789031215614c5557600080fd5b614c5e87614b32565b9550614c6c60208801614b32565b9450614c7a60408801614b32565b9350614c8860608801614b32565b9250614c9660808801614b32565b9150614ca460a08801614b32565b90509295509295509295565b60008060008060808587031215614cc657600080fd5b5050823594602084013594506040840135936060013592509050565b600081518084526020808501945080840160005b83811015614d1b5781516001600160a01b031687529582019590820190600101614cf6565b509495945050505050565b604081526000614d396040830185614ce2565b905082151560208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b80851115614db4578160001904821115614d9a57614d9a614d4a565b80851615614da757918102915b93841c9390800290614d7e565b509250929050565b600082614dcb57506001610fbd565b81614dd857506000610fbd565b8160018114614dee5760028114614df857614e14565b6001915050610fbd565b60ff841115614e0957614e09614d4a565b50506001821b610fbd565b5060208310610133831016604e8410600b8410161715614e37575081810a610fbd565b614e418383614d79565b8060001904821115614e5557614e55614d4a565b029392505050565b6000613a3060ff841683614dbc565b600082614ea2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115610fbd57610fbd614d4a565b6000816000190483118215151615614ed457614ed4614d4a565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061ffff808316818103614f1f57614f1f614d4a565b6001019392505050565b80820180821115610fbd57610fbd614d4a565b61ffff818116838216019080821115614f5757614f57614d4a565b5092915050565b600060208284031215614f7057600080fd5b8151613a30816148ad565b600060208284031215614f8d57600080fd5b8151613a30816147e2565b85815284602082015260a060408201526000614fb760a0830186614ce2565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215614fe957600080fd5b8351925060208401519150604084015190509250925092565b61ffff828116828216039080821115614f5757614f57614d4a565b8481526080602082015260006150366080830186614ce2565b6001600160a01b03949094166040830152506060015292915050565b60006020828403121561506457600080fd5b505191905056fea2646970667358221220706966fbcc15959dd3d0fddbde00a23c266ae3c190a24d6ec62edf4fcbe6128c64736f6c63430008100033

Deployed Bytecode

0x60806040526004361061044e5760003560e01c806350a8e01611610243578063b1b08f7111610143578063eafb5a3c116100bb578063f94aa1b41161008a578063fdb78c0e1161006f578063fdb78c0e14610dd2578063fe575a8714610df1578063feadde9c14610e1157600080fd5b8063f94aa1b414610d3f578063fb78680d14610db257600080fd5b8063eafb5a3c14610cca578063ee5d9c2d14610cea578063eec2744e14610cff578063f0c68ca314610d1f57600080fd5b8063bfc2fc3511610112578063cf847706116100f7578063cf84770614610baf578063d69153c914610c64578063dd62ed3e14610c8457600080fd5b8063bfc2fc3514610b79578063c31d9e9214610b9957600080fd5b8063b1b08f7114610735578063b3d514fb14610735578063b55cd04b14610b37578063b7df8b3614610b5f57600080fd5b806375cb1bd1116101d65780638a63bd9b116101a557806391ac5ea61161018a57806391ac5ea614610ab157806395d89b4114610ad1578063a9059cbb14610b1757600080fd5b80638a63bd9b14610a875780638a8c523c14610a9c57600080fd5b806375cb1bd114610a1457806378648edf14610a3457806380c581d114610a49578063893d20e814610a6957600080fd5b80635cce86cd116102125780635cce86cd1461097b5780636ebd0078146109b457806370a08231146109c9578063715018a6146109ff57600080fd5b806350a8e016146108fc578063581e5a361461091b578063590ffdce1461093b5780635c24b0741461095b57600080fd5b8063285777511161034e57806336fddb04116102e15780634ada218b116102b05780634e718e48116102955780634e718e48146108835780634fb2e45d146108a35780634fbee193146108c357600080fd5b80634ada218b146108495780634bbb93eb1461086357600080fd5b806336fddb04146107d35780633f3cf56c146107f3578063452ed4f11461081357806346ea7ac81461083357600080fd5b8063313ce5671161031d578063313ce5671461076157806332cde6641461077d57806333251a0b1461079d57806333d43771146107bd57600080fd5b8063285777511461070a5780632b112e49146107205780632b28fc7a146107355780632e8fa8211461074b57600080fd5b8063095ea7b3116103e15780631303cbc6116103b057806323b872dd1161039557806323b872dd146106aa57806326003957146106ca5780632610eaca146106ea57600080fd5b80631303cbc61461067557806318160ddd1461069557600080fd5b8063095ea7b3146105e75780630dcbcf1c146106075780630fa604e41461064057806310f9f9c51461065557600080fd5b8063069d955f1161041d578063069d955f146104f357806306fdde03146105495780630758d9241461059857806307dd79e0146105bd57600080fd5b806303fd2a451461045a5780630445b6671461048d578063044df726146104b157806305bbedb6146104d357600080fd5b3661045557005b600080fd5b34801561046657600080fd5b5061047061dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561049957600080fd5b506104a360145481565b604051908152602001610484565b3480156104bd57600080fd5b506104d16104cc3660046147f0565b610e31565b005b3480156104df57600080fd5b506104d16104ee366004614936565b610f0e565b3480156104ff57600080fd5b50600a546105249061ffff808216916201000081048216916401000000009091041683565b6040805161ffff94851681529284166020840152921691810191909152606001610484565b34801561055557600080fd5b5060408051808201909152600c81527f52696e67206f66205079726f000000000000000000000000000000000000000060208201525b604051610484919061497d565b3480156105a457600080fd5b50600c546104709061010090046001600160a01b031681565b3480156105c957600080fd5b50600c546105d79060ff1681565b6040519015158152602001610484565b3480156105f357600080fd5b506105d76106023660046149cb565b610fac565b34801561061357600080fd5b506105d76106223660046149f7565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561064c57600080fd5b506104a3610fc3565b34801561066157600080fd5b50601b54610470906001600160a01b031681565b34801561068157600080fd5b506104d16106903660046149f7565b610fe3565b3480156106a157600080fd5b506009546104a3565b3480156106b657600080fd5b506105d76106c5366004614a14565b611060565b3480156106d657600080fd5b506104d16106e5366004614a55565b6110d8565b3480156106f657600080fd5b506104d1610705366004614a77565b6111e2565b34801561071657600080fd5b506104a360175481565b34801561072c57600080fd5b506104a361135a565b34801561074157600080fd5b506104a36107d081565b34801561075757600080fd5b506104a360155481565b34801561076d57600080fd5b5060405160098152602001610484565b34801561078957600080fd5b506104d1610798366004614b49565b6113c3565b3480156107a957600080fd5b506104d16107b83660046149f7565b6115b0565b3480156107c957600080fd5b506104a3601e5481565b3480156107df57600080fd5b506104d16107ee366004614b8c565b611680565b3480156107ff57600080fd5b506104d161080e366004614a55565b6116f9565b34801561081f57600080fd5b50600d54610470906001600160a01b031681565b34801561083f57600080fd5b506104a3610bb881565b34801561085557600080fd5b50601a546105d79060ff1681565b34801561086f57600080fd5b506104a361087e366004614baa565b611810565b34801561088f57600080fd5b506104d161089e366004614baa565b611844565b3480156108af57600080fd5b506104d16108be3660046149f7565b6118e8565b3480156108cf57600080fd5b506105d76108de3660046149f7565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561090857600080fd5b50601a546105d790610100900460ff1681565b34801561092757600080fd5b506104d16109363660046149f7565b611b1a565b34801561094757600080fd5b506104d1610956366004614b8c565b611b97565b34801561096757600080fd5b506104d16109763660046149f7565b611c10565b34801561098757600080fd5b506105d76109963660046149f7565b6001600160a01b031660009081526008602052604090205460ff1690565b3480156109c057600080fd5b506104a3611d06565b3480156109d557600080fd5b506104a36109e43660046149f7565b6001600160a01b031660009081526001602052604090205490565b348015610a0b57600080fd5b506104d1611d21565b348015610a2057600080fd5b506104d1610a2f366004614bc3565b611de1565b348015610a4057600080fd5b506104d1611e7b565b348015610a5557600080fd5b506104d1610a64366004614b8c565b611ed8565b348015610a7557600080fd5b50601f546001600160a01b0316610470565b348015610a9357600080fd5b506105d7612082565b348015610aa857600080fd5b506104d16120f8565b348015610abd57600080fd5b506104d1610acc366004614c0e565b612360565b348015610add57600080fd5b5060408051808201909152600581527f2452494e47000000000000000000000000000000000000000000000000000000602082015261058b565b348015610b2357600080fd5b506105d7610b323660046149cb565b6123e9565b348015610b4357600080fd5b50601d54601e5460408051928352602083019190915201610484565b348015610b6b57600080fd5b506016546105d79060ff1681565b348015610b8557600080fd5b506104d1610b943660046147f0565b612400565b348015610ba557600080fd5b506104a3601d5481565b348015610bbb57600080fd5b50600b54610c209061ffff808216916201000081048216916401000000008204811691660100000000000081048216916801000000000000000082048116916a010000000000000000000081048216916c010000000000000000000000009091041687565b6040805161ffff9889168152968816602088015294871694860194909452918516606085015284166080840152831660a083015290911660c082015260e001610484565b348015610c7057600080fd5b506104d1610c7f366004614c3c565b6124ad565b348015610c9057600080fd5b506104a3610c9f366004614c0e565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b348015610cd657600080fd5b506104d1610ce53660046149f7565b612733565b348015610cf657600080fd5b506104d1612b51565b348015610d0b57600080fd5b506104d1610d1a366004614b8c565b612c33565b348015610d2b57600080fd5b50601c54610470906001600160a01b031681565b348015610d4b57600080fd5b50600e54600f54601054601154601254610d78946001600160a01b03908116948116938116928116911685565b604080516001600160a01b03968716815294861660208601529285169284019290925283166060830152909116608082015260a001610484565b348015610dbe57600080fd5b506104d1610dcd366004614cb0565b612cdb565b348015610dde57600080fd5b506013546105d790610100900460ff1681565b348015610dfd57600080fd5b506105d7610e0c3660046149f7565b612f9c565b348015610e1d57600080fd5b506104d1610e2c366004614b8c565b61302a565b601f546001600160a01b03163314610e845760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b60448201526064015b60405180910390fd5b601a546040517fefbdbabd00000000000000000000000000000000000000000000000000000000815283151560048201528215156024820152620100009091046001600160a01b03169063efbdbabd906044015b600060405180830381600087803b158015610ef257600080fd5b505af1158015610f06573d6000803e3d6000fd5b505050505050565b601f546001600160a01b03163314610f5c5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601a546040517f05bbedb6000000000000000000000000000000000000000000000000000000008152620100009091046001600160a01b0316906305bbedb690610ed89085908590600401614d26565b6000610fb93384846130a3565b5060015b92915050565b6000610fd16009600a614e5d565b601954610fde9190614e6c565b905090565b601f546001600160a01b031633146110315760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601c805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b0383166000908152600460209081526040808320338452909152812054600019146110c5576001600160a01b0384166000908152600460209081526040808320338452909152812080548492906110bf908490614ea7565b90915550505b6110d08484846131b0565b949350505050565b601f546001600160a01b031633146111265760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b60646009546111359190614e6c565b81836009546111449190614eba565b61114e9190614e6c565b10156111c25760405162461bcd60e51b815260206004820152603060248201527f4d61782057616c6c657420616d74206d7573742062652061626f76652031252060448201527f6f6620746f74616c20737570706c792e000000000000000000000000000000006064820152608401610e7b565b80826009546111d19190614eba565b6111db9190614e6c565b6019555050565b601f546001600160a01b031633146112305760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b80518251146112815760405162461bcd60e51b815260206004820152601560248201527f4c656e6774687320646f206e6f74206d617463682e00000000000000000000006044820152606401610e7b565b60005b82518161ffff1610156113555761129d6009600a614e5d565b828261ffff16815181106112b3576112b3614ed9565b60200260200101516112c59190614eba565b3360009081526001602052604090205410156112e057600080fd5b61134233848361ffff16815181106112fa576112fa614ed9565b60200260200101516009600a6113109190614e5d565b858561ffff168151811061132657611326614ed9565b60200260200101516113389190614eba565b6000806001613641565b508061134d81614f08565b915050611284565b505050565b60016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb495461dead60009081527fb34209a263f6c38fe55f099e9e70f9d67e93982480ff3234a5e0108028ad164d5490916113b691614f29565b600954610fde9190614ea7565b601f546001600160a01b031633146114115760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b600c5460ff16156114645760405162461bcd60e51b815260206004820152601160248201527f546178657320617265206c6f636b65642e0000000000000000000000000000006044820152606401610e7b565b6107d08361ffff161115801561148057506107d08261ffff1611155b801561149257506107d08161ffff1611155b6114de5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420657863656564206d6178696d756d732e0000000000000000006044820152606401610e7b565b610bb86114eb8385614f3c565b61ffff16111561153d5760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742065786365656420726f756e6474726970206d6178696d756d2e6044820152606401610e7b565b600a805461ffff9485167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909116176201000093851693909302929092177fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff166401000000009190931602919091179055565b601f546001600160a01b031633146115fe5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601a546040517f33251a0b0000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015262010000909204909116906333251a0b90602401600060405180830381600087803b15801561166557600080fd5b505af1158015611679573d6000803e3d6000fd5b5050505050565b601f546001600160a01b031633146116ce5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b601f546001600160a01b031633146117475760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b6103e860095460056117599190614eba565b6117639190614e6c565b81836009546117729190614eba565b61177c9190614e6c565b10156117f05760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3525206f6620746f74616c20737570706c792e0000000000000000006064820152608401610e7b565b80826009546117ff9190614eba565b6118099190614e6c565b6018555050565b600d546001600160a01b03166000908152600160205260408120546127109061183a908490614eba565b610fbd9190614e6c565b601f546001600160a01b031633146118925760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b60968111156118e35760405162461bcd60e51b815260206004820152601660248201527f43616e6e6f74207365742061626f766520312e35252e000000000000000000006044820152606401610e7b565b601755565b601f546001600160a01b031633146119365760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b6001600160a01b0381166119b25760405162461bcd60e51b815260206004820152603d60248201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660448201527f6572206f776e657220746f20746865207a65726f20616464726573732e0000006064820152608401610e7b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21536001600160a01b03821601611a505760405162461bcd60e51b815260206004820152603d60248201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660448201527f6572206f776e657220746f20746865207a65726f20616464726573732e0000006064820152608401610e7b565b601f54611a67906001600160a01b03166000611b97565b611a72816001611b97565b601f546001600160a01b031660009081526001602052604090205415611abb57601f546001600160a01b0316600081815260016020526040902054611ab991908390611338565b505b601f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601f546001600160a01b03163314611b685760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601b805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b601f546001600160a01b03163314611be55760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b601f546001600160a01b03163314611c5e5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601a5460ff1615611c6e57600080fd5b306001600160a01b03821603611cc65760405162461bcd60e51b815260206004820152600e60248201527f43616e27742062652073656c662e0000000000000000000000000000000000006044820152606401610e7b565b601a80546001600160a01b0390921662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff909216919091179055565b6000611d146009600a614e5d565b601854610fde9190614e6c565b601f546001600160a01b03163314611d6f5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601f54611d86906001600160a01b03166000611b97565b601f805473ffffffffffffffffffffffffffffffffffffffff1981169091556040516001600160a01b039091169060009082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a350565b601f546001600160a01b03163314611e2f5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b600e80546001600160a01b0394851673ffffffffffffffffffffffffffffffffffffffff1991821617909155600f80549385169382169390931790925560108054919093169116179055565b601f546001600160a01b03163314611ec95760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b600c805460ff19166001179055565b601f546001600160a01b03163314611f265760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b80611f9d576001600160a01b03828116600081815260026020526040808220805460ff19169055601a5490517f80c581d100000000000000000000000000000000000000000000000000000000815260048101939093526024830191909152620100009004909116906380c581d190604401610ed8565b60035415612004576203f48060035442611fb79190614ea7565b116120045760405162461bcd60e51b815260206004820152601060248201527f332044617920636f6f6c646f776e2e21000000000000000000000000000000006044820152606401610e7b565b6001600160a01b0382811660008181526002602052604090819020805460ff1916600190811790915542600355601a5491517f80c581d100000000000000000000000000000000000000000000000000000000815260048101939093526024830152620100009004909116906380c581d190604401610ed8565b5050565b601f546000906001600160a01b031633146120d35760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b600c546120f290309061010090046001600160a01b03166000196130a3565b50600190565b601f546001600160a01b031633146121465760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601a5460ff16156121995760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642100000000000000006044820152606401610e7b565b601a54610100900460ff166121f05760405162461bcd60e51b815260206004820152601860248201527f4c6971756964697479206d7573742062652061646465642e00000000000000006044820152606401610e7b565b601a546201000090046001600160a01b031661223657601a80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff163062010000021790555b601a54600d546040517f6c115c340000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015263ffffffff4316602482015267ffffffffffffffff4216604482015260096064820152620100009092041690636c115c3490608401600060405180830381600087803b1580156122c157600080fd5b505af19250505080156122d2575060015b50601a805460ff19166001179055600d546127109061230f906001600160a01b03166001600160a01b031660009081526001602052604090205490565b61231a90600a614eba565b6123249190614e6c565b601455600d546001600160a01b03166000908152600160205260409020546127109061235190601e614eba565b61235b9190614e6c565b601555565b601f546001600160a01b031633146123ae5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601180546001600160a01b0393841673ffffffffffffffffffffffffffffffffffffffff199182161790915560128054929093169116179055565b60006123f63384846131b0565b5060019392505050565b601f546001600160a01b0316331461244e5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b6013805461ff001916610100841515908102919091179091556016805460ff19168315151790556040519081527f7b0a47d3b0234280b6c9213c5bbff44c8b6001bea7770b3950280f9141053257906020015b60405180910390a15050565b601f546001600160a01b031633146124fb5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b600b805461ffff8881167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909216919091176201000088831602177fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff16640100000000878316027fffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffff1617660100000000000086831602177fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff1668010000000000000000858316027fffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffff16176a010000000000000000000091841691909102179055808285612608888a614f3c565b6126129190614f3c565b61261c9190614f3c565b6126269190614f3c565b600b80547fffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffff166c0100000000000000000000000061ffff93841602179055600a5460009161267d9162010000810482169116614f3c565b600b5461ffff918216925082916126b291660100000000000081048216916c0100000000000000000000000090910416614f3c565b61ffff16111561272a5760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f74206578636565642073756d206f662062757920616e642073656c60448201527f6c20666565732e000000000000000000000000000000000000000000000000006064820152608401610e7b565b50505050505050565b601f546001600160a01b031633146127815760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601a54610100900460ff16156127d95760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206368616e6765206166746572206c69717569646974792e00006044820152606401610e7b565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561281e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128429190614f5e565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561288f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128b39190614f5e565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015612916573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293a9190614f5e565b90506001600160a01b038116612ad857816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ac9190614f5e565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129f9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1d9190614f5e565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015612a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa69190614f5e565b600d805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055612b01565b600d805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383161790555b600c80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0385811682029290921792839055611355923092919004166000196130a3565b601f546001600160a01b03163314612b9f5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601a54610100900460ff1615612bf75760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742063616c6c206166746572206c69717569646974792e000000006044820152606401610e7b565b601f546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015612c30573d6000803e3d6000fd5b50565b601f546001600160a01b03163314612c815760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b601a546040517feec2744e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528315156024830152620100009092049091169063eec2744e90604401610ed8565b601f546001600160a01b03163314612d295760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b8284600954612d389190614eba565b612d429190614e6c565b6014556009548190612d55908490614eba565b612d5f9190614e6c565b60158190556014541115612ddb5760405162461bcd60e51b815260206004820152602160248201527f5468726573686f6c642063616e6e6f742062652061626f766520616d6f756e7460448201527f2e000000000000000000000000000000000000000000000000000000000000006064820152608401610e7b565b600d546001600160a01b031660009081526001602052604090205461271090612e05906096614eba565b612e0f9190614e6c565b6015541115612e865760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f742062652061626f766520312e3525206f662063757272656e742060448201527f50492e00000000000000000000000000000000000000000000000000000000006064820152608401610e7b565b620f4240600954612e979190614e6c565b6015541015612f0e5760405162461bcd60e51b815260206004820152602e60248201527f43616e6e6f74206265206c6f776572207468616e20302e303030303125206f6660448201527f20746f74616c20737570706c792e0000000000000000000000000000000000006064820152608401610e7b565b620f4240600954612f1f9190614e6c565b6014541015612f965760405162461bcd60e51b815260206004820152602e60248201527f43616e6e6f74206265206c6f776572207468616e20302e303030303125206f6660448201527f20746f74616c20737570706c792e0000000000000000000000000000000000006064820152608401610e7b565b50505050565b601a546040517ffe575a870000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092620100009004169063fe575a8790602401602060405180830381865afa158015613006573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd9190614f7b565b601f546001600160a01b031633146130785760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610e7b565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6001600160a01b0383166130f95760405162461bcd60e51b815260206004820152601360248201527f45524332303a205a65726f2041646472657373000000000000000000000000006044820152606401610e7b565b6001600160a01b03821661314f5760405162461bcd60e51b815260206004820152601360248201527f45524332303a205a65726f2041646472657373000000000000000000000000006044820152606401610e7b565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006001600160a01b03841661322e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610e7b565b6001600160a01b0383166132aa5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610e7b565b600082116133205760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610e7b565b6001600160a01b0384166000908152600260205260408120548190819060ff161561334e576001925061337c565b6001600160a01b03861660009081526002602052604090205460ff1615613378576001915061337c565b5060015b6133868787613920565b1561359157601a5460ff166133dd5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610e7b565b82806133e65750815b156134aa576001600160a01b03871660009081526008602052604090205460ff1615801561342d57506001600160a01b03861660009081526008602052604090205460ff16155b156134aa576018548511156134aa5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785460448201527f78416d6f756e742e0000000000000000000000000000000000000000000000006064820152608401610e7b565b600c546001600160a01b0387811661010090920416148015906134cb575081155b15613591576001600160a01b03861660009081526008602052604090205460ff166135915760195485613513886001600160a01b031660009081526001602052604090205490565b61351d9190614f29565b11156135915760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201527f616c6c657453697a652e000000000000000000000000000000000000000000006064820152608401610e7b565b81156136285760135460ff1661362857601354610100900460ff1615613628573060009081526001602052604090205460145481106136265760155460165460ff161561361057601754600d546001600160a01b03166000908152600160205260409020546127109161360391614eba565b61360d9190614e6c565b90505b80821061361b578091505b61362482613a37565b505b505b613636878787868686613641565b979650505050505050565b601a54600090610100900460ff166137415761365d87876141c6565b601a54610100900460ff1615801561367a575061367a8787613920565b801561369f57506001600160a01b03871660009081526006602052604090205460ff16155b80156136c457506001600160a01b03861660009081526006602052604090205460ff16155b80156136ce575081155b156137415760405162461bcd60e51b815260206004820152602260248201527f5072652d6c6971756964697479207472616e736665722070726f74656374696f60448201527f6e2e0000000000000000000000000000000000000000000000000000000000006064820152608401610e7b565b61374b8787613920565b156137fe57601a546040517fecd07a530000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152888116602483015260448201889052600092620100009004169063ecd07a53906064016020604051808303816000875af19250505080156137e7575060408051601f3d908101601f191682019092526137e491810190614f7b565b60015b6137f057600080fd5b9050806137fc57600080fd5b505b6001600160a01b03871660009081526007602052604090205460019060ff168061384057506001600160a01b03871660009081526007602052604090205460ff165b15613849575060005b6001600160a01b03881660009081526001602052604081208054889290613871908490614ea7565b9091555060009050816138845786613890565b6138908987878a614336565b6001600160a01b0389166000908152600160205260408120805492935083929091906138bd908490614f29565b92505081905550876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161390991815260200190565b60405180910390a350600198975050505050505050565b601f546000906001600160a01b0384811691161480159061394f5750601f546001600160a01b03838116911614155b80156139665750601f546001600160a01b03163214155b801561398b57506001600160a01b03821660009081526005602052604090205460ff16155b80156139b057506001600160a01b03831660009081526005602052604090205460ff16155b80156139c757506001600160a01b03821661dead14155b80156139db57506001600160a01b03821615155b80156139f057506001600160a01b0383163014155b8015613a105750601a546001600160a01b03848116620100009092041614155b8015613a305750601a546001600160a01b03838116620100009092041614155b9392505050565b6013805460ff191660011790556040805160e081018252600b5461ffff80821683526201000082048116602084015264010000000082048116938301939093526601000000000000810483166060830152680100000000000000008104831660808301526a01000000000000000000008104831660a08301526c01000000000000000000000000900490911660c08201819052600003613ad757506141b9565b306000908152600460209081526040808320600c5461010090046001600160a01b0316845290915290205460001914613b3a57306000908152600460209081526040808320600c5461010090046001600160a01b03168452909152902060001990555b600060028260c0015161ffff16836000015161ffff1685613b5b9190614eba565b613b659190614e6c565b613b6f9190614e6c565b90506000613b7d8285614ea7565b60408051600280825260608201835292935060009290916020830190803683370190505090503081600081518110613bb757613bb7614ed9565b60200260200101906001600160a01b031690816001600160a01b031681525050600c60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c4e9190614f5e565b81600181518110613c6157613c61614ed9565b6001600160a01b039283166020918202929092010152600c546040517f791ac9470000000000000000000000000000000000000000000000000000000081526101009091049091169063791ac94790613cc7908590600090869030904290600401614f98565b600060405180830381600087803b158015613ce157600080fd5b505af1925050508015613cf2575060015b613cff57505050506141b9565b47600083613d0d8684614eba565b613d179190614e6c565b90508415613e1657600c546010546040517ff305d7190000000000000000000000000000000000000000000000000000000081523060048201526024810188905260006044820181905260648201526001600160a01b0391821660848201524260a4820152610100909204169063f305d71990839060c40160606040518083038185885af193505050508015613dca575060408051601f3d908101601f19168201909252613dc791810190614fd4565b60015b613dd9575050505050506141b9565b505060408051838152602081018890527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b613e208183614ea7565b915085600001518660c001818151613e389190615002565b61ffff90811690915260c0880151604089015160009350839291821691613e60911686614eba565b613e6a9190614e6c565b601b549091506000906001600160a01b0316613e87576000613eae565b8860c0015161ffff16896080015161ffff1686613ea49190614eba565b613eae9190614e6c565b601c549091506000906001600160a01b0316613ecb576000613ef2565b8960c0015161ffff168a60a0015161ffff1687613ee89190614eba565b613ef29190614e6c565b9050600081613f018486614f29565b613f0b9190614f29565b613f159088614ea7565b90508015613f7a57600e546040516001600160a01b03909116906188b89083906000818181858888f193505050503d8060008114613f6f576040519150601f19603f3d011682016040523d82523d6000602084013e613f74565b606091505b50909550505b8315613fdd57600f546040516001600160a01b03909116906188b89086906000818181858888f193505050503d8060008114613fd2576040519150601f19603f3d011682016040523d82523d6000602084013e613fd7565b606091505b50909550505b82156140c557600c60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614036573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061405a9190614f5e565b8860008151811061406d5761406d614ed9565b6001600160a01b039283166020918202929092010152601b5489519116908990600190811061409e5761409e614ed9565b6001600160a01b0392831660209182029290920101526011546140c5918a91869116614574565b81156141ad57600c60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561411e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141429190614f5e565b8860008151811061415557614155614ed9565b6001600160a01b039283166020918202929092010152601c5489519116908990600190811061418657614186614ed9565b6001600160a01b0392831660209182029290920101526012546141ad918a91859116614574565b50505050505050505050505b506013805460ff19169055565b601a54610100900460ff16156142445760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201527f65642e00000000000000000000000000000000000000000000000000000000006064820152608401610e7b565b61424e8282613920565b1580156142685750600d546001600160a01b038281169116145b1561207e576001600160a01b038083166000908152600560209081526040808320805460ff1990811660019081179092556007909352922080549091169091179055601a805461ff0019166101001790819055620100009004166142f657601a80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff163062010000021790555b6013805461ff001916610100179055604051600181527f7b0a47d3b0234280b6c9213c5bbff44c8b6001bea7770b3950280f9141053257906020016124a1565b6040805160e081018252600b5461ffff80821683526201000082048116602084015264010000000082048116938301939093526601000000000000810483166060830152680100000000000000008104831660808301526a01000000000000000000008104831660a08301526c01000000000000000000000000900490911660c08201526000908185156143d15750600a5461ffff166143fb565b84156143ea5750600a5462010000900461ffff166143fb565b50600a54640100000000900461ffff165b601a546201000090046001600160a01b031630148015614425575046600114806144255750466038145b1561442f57506111945b600061271061443e8387614eba565b6144489190614e6c565b905060008360c0015184606001516144609190614f3c565b61ffff16846060015161ffff16836144789190614eba565b6144829190614e6c565b905060006144908284614ea7565b905080156144fd5730600090815260016020526040812080548392906144b7908490614f29565b909155505060405181815230906001600160a01b038c16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b811561455c5781600960008282546145159190614ea7565b90915550506040518281526000906001600160a01b038c16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b6145668388614ea7565b9a9950505050505050505050565b600c546040517fb6f9de950000000000000000000000000000000000000000000000000000000081526101009091046001600160a01b03169063b6f9de959084906145ca9060009088903090429060040161501d565b6000604051808303818588803b1580156145e357600080fd5b505af1935050505080156145f5575060015b6145fe57505050565b60008360018151811061461357614613614ed9565b60209081029190910101516040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091506001600160a01b0382169063a9059cbb90849083906370a0823190602401602060405180830381865afa158015614688573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146ac9190615052565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561470f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147339190614f7b565b50601b5484516001600160a01b03909116908590600190811061475857614758614ed9565b60200260200101516001600160a01b03160361478b5782601d60008282546147809190614f29565b90915550612f969050565b601c5484516001600160a01b0390911690859060019081106147af576147af614ed9565b60200260200101516001600160a01b031603612f965782601e60008282546147d79190614f29565b909155505050505050565b8015158114612c3057600080fd5b6000806040838503121561480357600080fd5b823561480e816147e2565b9150602083013561481e816147e2565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561488157614881614829565b604052919050565b600067ffffffffffffffff8211156148a3576148a3614829565b5060051b60200190565b6001600160a01b0381168114612c3057600080fd5b600082601f8301126148d357600080fd5b813560206148e86148e383614889565b614858565b82815260059290921b8401810191818101908684111561490757600080fd5b8286015b8481101561492b57803561491e816148ad565b835291830191830161490b565b509695505050505050565b6000806040838503121561494957600080fd5b823567ffffffffffffffff81111561496057600080fd5b61496c858286016148c2565b925050602083013561481e816147e2565b600060208083528351808285015260005b818110156149aa5785810183015185820160400152820161498e565b506000604082860101526040601f19601f8301168501019250505092915050565b600080604083850312156149de57600080fd5b82356149e9816148ad565b946020939093013593505050565b600060208284031215614a0957600080fd5b8135613a30816148ad565b600080600060608486031215614a2957600080fd5b8335614a34816148ad565b92506020840135614a44816148ad565b929592945050506040919091013590565b60008060408385031215614a6857600080fd5b50508035926020909101359150565b60008060408385031215614a8a57600080fd5b823567ffffffffffffffff80821115614aa257600080fd5b614aae868387016148c2565b9350602091508185013581811115614ac557600080fd5b85019050601f81018613614ad857600080fd5b8035614ae66148e382614889565b81815260059190911b82018301908381019088831115614b0557600080fd5b928401925b82841015614b2357833582529284019290840190614b0a565b80955050505050509250929050565b803561ffff81168114614b4457600080fd5b919050565b600080600060608486031215614b5e57600080fd5b614b6784614b32565b9250614b7560208501614b32565b9150614b8360408501614b32565b90509250925092565b60008060408385031215614b9f57600080fd5b823561480e816148ad565b600060208284031215614bbc57600080fd5b5035919050565b600080600060608486031215614bd857600080fd5b8335614be3816148ad565b92506020840135614bf3816148ad565b91506040840135614c03816148ad565b809150509250925092565b60008060408385031215614c2157600080fd5b8235614c2c816148ad565b9150602083013561481e816148ad565b60008060008060008060c08789031215614c5557600080fd5b614c5e87614b32565b9550614c6c60208801614b32565b9450614c7a60408801614b32565b9350614c8860608801614b32565b9250614c9660808801614b32565b9150614ca460a08801614b32565b90509295509295509295565b60008060008060808587031215614cc657600080fd5b5050823594602084013594506040840135936060013592509050565b600081518084526020808501945080840160005b83811015614d1b5781516001600160a01b031687529582019590820190600101614cf6565b509495945050505050565b604081526000614d396040830185614ce2565b905082151560208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b80851115614db4578160001904821115614d9a57614d9a614d4a565b80851615614da757918102915b93841c9390800290614d7e565b509250929050565b600082614dcb57506001610fbd565b81614dd857506000610fbd565b8160018114614dee5760028114614df857614e14565b6001915050610fbd565b60ff841115614e0957614e09614d4a565b50506001821b610fbd565b5060208310610133831016604e8410600b8410161715614e37575081810a610fbd565b614e418383614d79565b8060001904821115614e5557614e55614d4a565b029392505050565b6000613a3060ff841683614dbc565b600082614ea2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115610fbd57610fbd614d4a565b6000816000190483118215151615614ed457614ed4614d4a565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061ffff808316818103614f1f57614f1f614d4a565b6001019392505050565b80820180821115610fbd57610fbd614d4a565b61ffff818116838216019080821115614f5757614f57614d4a565b5092915050565b600060208284031215614f7057600080fd5b8151613a30816148ad565b600060208284031215614f8d57600080fd5b8151613a30816147e2565b85815284602082015260a060408201526000614fb760a0830186614ce2565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215614fe957600080fd5b8351925060208401519150604084015190509250925092565b61ffff828116828216039080821115614f5757614f57614d4a565b8481526080602082015260006150366080830186614ce2565b6001600160a01b03949094166040830152506060015292915050565b60006020828403121561506457600080fd5b505191905056fea2646970667358221220706966fbcc15959dd3d0fddbde00a23c266ae3c190a24d6ec62edf4fcbe6128c64736f6c63430008100033

Deployed Bytecode Sourcemap

4192:26233:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6015:73;;;;;;;;;;;;6046:42;6015:73;;;;;-1:-1:-1;;;;;178:55:1;;;160:74;;148:2;133:18;6015:73:0;;;;;;;;6761:28;;;;;;;;;;;;;;;;;;;391:25:1;;;379:2;364:18;6761:28:0;245:177:1;16077:151:0;;;;;;;;;;-1:-1:-1;16077:151:0;;;;;:::i;:::-;;:::i;:::-;;15582:172;;;;;;;;;;-1:-1:-1;15582:172:0;;;;;:::i;:::-;;:::i;5328:110::-;;;;;;;;;;-1:-1:-1;5328:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;3236:6:1;3269:15;;;3251:34;;3321:15;;;3316:2;3301:18;;3294:43;3373:15;;3353:18;;;3346:43;;;;3214:2;3199:18;5328:110:0;3030:365:1;11408:80:0;;;;;;;;;;-1:-1:-1;11480:5:0;;;;;;;;;;;;;;;;;11408:80;;;;;;;:::i;5954:26::-;;;;;;;;;;-1:-1:-1;5954:26:0;;;;;;;-1:-1:-1;;;;;5954:26:0;;;5921;;;;;;;;;;-1:-1:-1;5921:26:0;;;;;;;;;;;4425:14:1;;4418:22;4400:41;;4388:2;4373:18;5921:26:0;4260:187:1;12016:161:0;;;;;;;;;;-1:-1:-1;12016:161:0;;;;;:::i;:::-;;:::i;14622:140::-;;;;;;;;;;-1:-1:-1;14622:140:0;;;;;:::i;:::-;-1:-1:-1;;;;;14720:34:0;14696:4;14720:34;;;:25;:34;;;;;;;;;14622:140;18791:114;;;;;;;;;;;;;:::i;7145:24::-;;;;;;;;;;-1:-1:-1;7145:24:0;;;;-1:-1:-1;;;;;7145:24:0;;;20423:96;;;;;;;;;;-1:-1:-1;20423:96:0;;;;;:::i;:::-;;:::i;11143:83::-;;;;;;;;;;-1:-1:-1;11216:7:0;;11143:83;;12686:306;;;;;;;;;;-1:-1:-1;12686:306:0;;;;;:::i;:::-;;:::i;18403:264::-;;;;;;;;;;-1:-1:-1;18403:264:0;;;;;:::i;:::-;;:::i;27853:425::-;;;;;;;;;;-1:-1:-1;27853:425:0;;;;;:::i;:::-;;:::i;6869:33::-;;;;;;;;;;;;;;;;15216:141;;;;;;;;;;;;;:::i;5665:42::-;;;;;;;;;;;;5703:4;5665:42;;6796:25;;;;;;;;;;;;;;;;11232:80;;;;;;;;;;-1:-1:-1;11232:80:0;;4936:1;7023:36:1;;7011:2;6996:18;11232:80:0;6881:184:1;16426:544:0;;;;;;;;;;-1:-1:-1;16426:544:0;;;;;:::i;:::-;;:::i;15961:108::-;;;;;;;;;;-1:-1:-1;15961:108:0;;;;;:::i;:::-;;:::i;7249:33::-;;;;;;;;;;;;;;;;14770:140;;;;;;;;;;-1:-1:-1;14770:140:0;;;;;:::i;:::-;;:::i;18122:273::-;;;;;;;;;;-1:-1:-1;18122:273:0;;;;;:::i;:::-;;:::i;5987:21::-;;;;;;;;;;-1:-1:-1;5987:21:0;;;;-1:-1:-1;;;;;5987:21:0;;;5818:46;;;;;;;;;;;;5860:4;5818:46;;7033:34;;;;;;;;;;-1:-1:-1;7033:34:0;;;;;;;;18913:189;;;;;;;;;;-1:-1:-1;18913:189:0;;;;;:::i;:::-;;:::i;19817:217::-;;;;;;;;;;-1:-1:-1;19817:217:0;;;;;:::i;:::-;;:::i;9901:654::-;;;;;;;;;;-1:-1:-1;9901:654:0;;;;;:::i;:::-;;:::i;14487:127::-;;;;;;;;;;-1:-1:-1;14487:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;14578:28:0;14554:4;14578:28;;;:19;:28;;;;;;;;;14487:127;7074:36;;;;;;;;;;-1:-1:-1;7074:36:0;;;;;;;;;;;20313:102;;;;;;;;;;-1:-1:-1;20313:102:0;;;;;:::i;:::-;;:::i;14918:134::-;;;;;;;;;;-1:-1:-1;14918:134:0;;;;;:::i;:::-;;:::i;14121:218::-;;;;;;;;;;-1:-1:-1;14121:218:0;;;;;:::i;:::-;;:::i;14347:132::-;;;;;;;;;;-1:-1:-1;14347:132:0;;;;;:::i;:::-;-1:-1:-1;;;;;14441:30:0;14417:4;14441:30;;;:21;:30;;;;;;;;;14347:132;18675:108;;;;;;;;;;;;;:::i;11718:117::-;;;;;;;;;;-1:-1:-1;11718:117:0;;;;;:::i;:::-;-1:-1:-1;;;;;11811:16:0;11784:7;11811:16;;;:7;:16;;;;;;;11718:117;10563:225;;;;;;;;;;;;;:::i;17608:293::-;;;;;;;;;;-1:-1:-1;17608:293:0;;;;;:::i;:::-;;:::i;16236:182::-;;;;;;;;;;;;;:::i;13621:492::-;;;;;;;;;;-1:-1:-1;13621:492:0;;;;;:::i;:::-;;:::i;11494:79::-;;;;;;;;;;-1:-1:-1;11564:6:0;;-1:-1:-1;;;;;11564:6:0;11494:79;;12503:175;;;;;;;;;;;;;:::i;27110:545::-;;;;;;;;;;;;;:::i;17909:205::-;;;;;;;;;;-1:-1:-1;17909:205:0;;;;;:::i;:::-;;:::i;11318:84::-;;;;;;;;;;-1:-1:-1;11392:7:0;;;;;;;;;;;;;;;;;11318:84;;11843:165;;;;;;;;;;-1:-1:-1;11843:165:0;;;;;:::i;:::-;;:::i;20527:208::-;;;;;;;;;;-1:-1:-1;20665:15:0;;20709:18;;20527:208;;;9280:25:1;;;9336:2;9321:18;;9314:34;;;;9253:18;20527:208:0;9106:248:1;6828:34:0;;;;;;;;;;-1:-1:-1;6828:34:0;;;;;;;;20042:263;;;;;;;;;;-1:-1:-1;20042:263:0;;;;;:::i;:::-;;:::i;7212:30::-;;;;;;;;;;;;;;;;5447:209;;;;;;;;;;-1:-1:-1;5447:209:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9670:6:1;9703:15;;;9685:34;;9755:15;;;9750:2;9735:18;;9728:43;9807:15;;;9787:18;;;9780:43;;;;9859:15;;;9854:2;9839:18;;9832:43;9912:15;;9906:3;9891:19;;9884:44;9965:15;;9959:3;9944:19;;9937:44;10018:15;;;10012:3;9997:19;;9990:44;9647:3;9632:19;5447:209:0;9359:681:1;16978:622:0;;;;;;;;;;-1:-1:-1;16978:622:0;;;;;:::i;:::-;;:::i;11579:133::-;;;;;;;;;;-1:-1:-1;11579:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;11681:19:0;;;11663:7;11681:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;11579:133;13000:613;;;;;;;;;;-1:-1:-1;13000:613:0;;;;;:::i;:::-;;:::i;27663:182::-;;;;;;;;;;;;;:::i;15429:145::-;;;;;;;;;;-1:-1:-1;15429:145:0;;;;;:::i;:::-;;:::i;7176:27::-;;;;;;;;;;-1:-1:-1;7176:27:0;;;;-1:-1:-1;;;;;7176:27:0;;;6308:376;;;;;;;;;;-1:-1:-1;6308:376:0;;;;;;;;;;;;-1:-1:-1;;;;;6308:376:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11408:15:1;;;11390:34;;11460:15;;;11455:2;11440:18;;11433:43;11512:15;;;11492:18;;;11485:43;;;;11564:15;;11559:2;11544:18;;11537:43;11617:15;;;11611:3;11596:19;;11589:44;11316:3;11301:19;6308:376:0;10990:649:1;19110:699:0;;;;;;;;;;-1:-1:-1;19110:699:0;;;;;:::i;:::-;;:::i;6715:39::-;;;;;;;;;;-1:-1:-1;6715:39:0;;;;;;;;;;;15762:127;;;;;;;;;;-1:-1:-1;15762:127:0;;;;;:::i;:::-;;:::i;15060:148::-;;;;;;;;;;-1:-1:-1;15060:148:0;;;;;:::i;:::-;;:::i;16077:151::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;;;;;;;;;16172:9:::1;::::0;:48:::1;::::0;;;;12567:14:1;;12560:22;16172:48:0::1;::::0;::::1;12542:41:1::0;12626:14;;12619:22;12599:18;;;12592:50;16172:9:0;;;::::1;-1:-1:-1::0;;;;;16172:9:0::1;::::0;:24:::1;::::0;12515:18:1;;16172:48:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16077:151:::0;;:::o;15582:172::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;15690:9:::1;::::0;:56:::1;::::0;;;;:9;;;::::1;-1:-1:-1::0;;;;;15690:9:0::1;::::0;:37:::1;::::0;:56:::1;::::0;15728:8;;15738:7;;15690:56:::1;;;:::i;12016:161::-:0;12093:4;12110:37;12119:10;12131:7;12140:6;12110:8;:37::i;:::-;-1:-1:-1;12165:4:0;12016:161;;;;;:::o;18791:114::-;18838:7;18883:13;4936:1;18883:2;:13;:::i;:::-;18865:14;;:32;;;;:::i;:::-;18858:39;;18791:114;:::o;20423:96::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;20492:12:::1;:19:::0;;-1:-1:-1;;20492:19:0::1;-1:-1:-1::0;;;;;20492:19:0;;;::::1;::::0;;;::::1;::::0;;20423:96::o;12686:306::-;-1:-1:-1;;;;;12807:19:0;;12786:4;12807:19;;;:11;:19;;;;;;;;12827:10;12807:31;;;;;;;;-1:-1:-1;;12807:52:0;12803:126;;-1:-1:-1;;;;;12876:19:0;;;;;;:11;:19;;;;;;;;12896:10;12876:31;;;;;;;:41;;12911:6;;12876:19;:41;;12911:6;;12876:41;:::i;:::-;;;;-1:-1:-1;;12803:126:0;12948:36;12958:6;12966:9;12977:6;12948:9;:36::i;:::-;12941:43;12686:306;-1:-1:-1;;;;12686:306:0:o;18403:264::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;18545:3:::1;18535:7;;:13;;;;:::i;:::-;18523:7;18512;18502;;:17;;;;:::i;:::-;18501:29;;;;:::i;:::-;:48;;18493:109;;;::::0;-1:-1:-1;;;18493:109:0;;16028:2:1;18493:109:0::1;::::0;::::1;16010:21:1::0;16067:2;16047:18;;;16040:30;16106:34;16086:18;;;16079:62;16177:18;16157;;;16150:46;16213:19;;18493:109:0::1;15826:412:1::0;18493:109:0::1;18652:7;18641;18631;;:17;;;;:::i;:::-;18630:29;;;;:::i;:::-;18613:14;:46:::0;-1:-1:-1;;18403:264:0:o;27853:425::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;27988:7:::1;:14;27969:8;:15;:33;27961:67;;;::::0;-1:-1:-1;;;27961:67:0;;16445:2:1;27961:67:0::1;::::0;::::1;16427:21:1::0;16484:2;16464:18;;;16457:30;16523:23;16503:18;;;16496:51;16564:18;;27961:67:0::1;16243:345:1::0;27961:67:0::1;28044:8;28039:232;28062:8;:15;28058:1;:19;;;28039:232;;;28143:13;4936:1;28143:2;:13;:::i;:::-;28132:7;28140:1;28132:10;;;;;;;;;;:::i;:::-;;;;;;;:24;;;;:::i;:::-;28117:10;11784:7:::0;11811:16;;;:7;:16;;;;;;28107:49:::1;;28099:58;;;::::0;::::1;;28172:87;28189:10;28201:8;28210:1;28201:11;;;;;;;;;;:::i;:::-;;;;;;;4936:1;28225:2;:13;;;;:::i;:::-;28214:7;28222:1;28214:10;;;;;;;;;;:::i;:::-;;;;;;;:24;;;;:::i;:::-;28240:5;28247::::0;28254:4:::1;28172:16;:87::i;:::-;-1:-1:-1::0;28079:3:0;::::1;::::0;::::1;:::i;:::-;;;;28039:232;;;;27853:425:::0;;:::o;15216:141::-;11811:7;:16;;;;6046:42;15269:7;11811:16;;;;;15269:7;;15308:39;;;:::i;:::-;15297:7;;:51;;;;:::i;16426:544::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;16534:14:::1;::::0;::::1;;16533:15;16525:45;;;::::0;-1:-1:-1;;;16525:45:0;;17316:2:1;16525:45:0::1;::::0;::::1;17298:21:1::0;17355:2;17335:18;;;17328:30;17394:19;17374:18;;;17367:47;17431:18;;16525:45:0::1;17114:341:1::0;16525:45:0::1;5703:4;16589:6;:21;;;;:65;;;;;5753:4;16631:7;:23;;;;16589:65;:117;;;;;5807:4;16675:11;:31;;;;16589:117;16581:170;;;::::0;-1:-1:-1;;;16581:170:0;;17662:2:1;16581:170:0::1;::::0;::::1;17644:21:1::0;17701:2;17681:18;;;17674:30;17740:25;17720:18;;;17713:53;17783:18;;16581:170:0::1;17460:347:1::0;16581:170:0::1;5860:4;16770:16;16779:7:::0;16770:6;:16:::1;:::i;:::-;:35;;;;16762:80;;;::::0;-1:-1:-1;;;16762:80:0;;18187:2:1;16762:80:0::1;::::0;::::1;18169:21:1::0;;;18206:18;;;18199:30;18265:34;18245:18;;;18238:62;18317:18;;16762:80:0::1;17985:356:1::0;16762:80:0::1;16853:9;:25:::0;;::::1;::::0;;::::1;16889:27:::0;;;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;16927:35:::0;::::1;::::0;;;;::::1;;::::0;;;::::1;::::0;;16426:544::o;15961:108::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;16030:9:::1;::::0;:31:::1;::::0;;;;-1:-1:-1;;;;;178:55:1;;;16030:31:0::1;::::0;::::1;160:74:1::0;16030:9:0;;;::::1;::::0;;::::1;::::0;:22:::1;::::0;133:18:1;;16030:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15961:108:::0;:::o;14770:140::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;-1:-1:-1;;;;;14862:30:0;;;::::1;;::::0;;;:21:::1;:30;::::0;;;;:40;;-1:-1:-1;;14862:40:0::1;::::0;::::1;;::::0;;;::::1;::::0;;14770:140::o;18122:273::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;18267:4:::1;18253:7;;18263:1;18253:11;;;;:::i;:::-;:18;;;;:::i;:::-;18241:7;18230;18220;;:17;;;;:::i;:::-;18219:29;;;;:::i;:::-;:53;;18211:121;;;::::0;-1:-1:-1;;;18211:121:0;;18548:2:1;18211:121:0::1;::::0;::::1;18530:21:1::0;18587:2;18567:18;;;18560:30;18626:34;18606:18;;;18599:62;18697:25;18677:18;;;18670:53;18740:19;;18211:121:0::1;18346:419:1::0;18211:121:0::1;18380:7;18369;18359;;:17;;;;:::i;:::-;18358:29;;;;:::i;:::-;18343:12;:44:::0;-1:-1:-1;;18122:273:0:o;18913:189::-;19042:6;;-1:-1:-1;;;;;19042:6:0;19004:7;11811:16;;;:7;:16;;;;;;5907:5;;19032:41;;19052:21;;19032:41;:::i;:::-;19031:62;;;;:::i;19817:217::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;19947:3:::1;19921:22;:29;;19913:64;;;::::0;-1:-1:-1;;;19913:64:0;;18972:2:1;19913:64:0::1;::::0;::::1;18954:21:1::0;19011:2;18991:18;;;18984:30;19050:24;19030:18;;;19023:52;19092:18;;19913:64:0::1;18770:346:1::0;19913:64:0::1;19988:13;:38:::0;19817:217::o;9901:654::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;-1:-1:-1;;;;;9980:22:0;::::1;9972:96;;;::::0;-1:-1:-1;;;9972:96:0;;19323:2:1;9972:96:0::1;::::0;::::1;19305:21:1::0;19362:2;19342:18;;;19335:30;19401:34;19381:18;;;19374:62;19472:31;19452:18;;;19445:59;19521:19;;9972:96:0::1;19121:425:1::0;9972:96:0::1;10087:16:::0;-1:-1:-1;;;;;10087:16:0;::::1;::::0;10079:90:::1;;;::::0;-1:-1:-1;;;10079:90:0;;19323:2:1;10079:90:0::1;::::0;::::1;19305:21:1::0;19362:2;19342:18;;;19335:30;19401:34;19381:18;;;19374:62;19472:31;19452:18;;;19445:59;19521:19;;10079:90:0::1;19121:425:1::0;10079:90:0::1;10200:6;::::0;10180:34:::1;::::0;-1:-1:-1;;;;;10200:6:0::1;;10180:19;:34::i;:::-;10225:35;10245:8;10255:4;10225:19;:35::i;:::-;10295:6;::::0;-1:-1:-1;;;;;10295:6:0::1;10305:1;11811:16:::0;;;:7;:16;;;;;;10285:21;10281:127:::1;;10340:6;::::0;-1:-1:-1;;;;;10340:6:0::1;11784:7:::0;11811:16;;;:7;:16;;;;;;10323:73:::1;::::0;10340:6;10348:8;;10358:17:::1;11718:117:::0;10323:73:::1;;10281:127;10447:6;::::0;;-1:-1:-1;;;;;10464:17:0;;::::1;-1:-1:-1::0;;10464:17:0;::::1;::::0;::::1;::::0;;;10497:40:::1;::::0;10447:6;::::1;::::0;10464:17;10447:6;;10497:40:::1;::::0;10428:16:::1;::::0;10497:40:::1;9961:594;9901:654:::0;:::o;20313:102::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;20385:9:::1;:22:::0;;-1:-1:-1;;20385:22:0::1;-1:-1:-1::0;;;;;20385:22:0;;;::::1;::::0;;;::::1;::::0;;20313:102::o;14918:134::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;-1:-1:-1;;;;;15006:28:0;;;::::1;;::::0;;;:19:::1;:28;::::0;;;;:38;;-1:-1:-1;;15006:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;14918:134::o;14121:218::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;14205:14:::1;::::0;::::1;;14204:15;14196:24;;;::::0;::::1;;14262:4;-1:-1:-1::0;;;;;14239:28:0;::::1;::::0;14231:55:::1;;;::::0;-1:-1:-1;;;14231:55:0;;19753:2:1;14231:55:0::1;::::0;::::1;19735:21:1::0;19792:2;19772:18;;;19765:30;19831:16;19811:18;;;19804:44;19865:18;;14231:55:0::1;19551:338:1::0;14231:55:0::1;14297:9;:34:::0;;-1:-1:-1;;;;;14297:34:0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;14121:218::o;18675:108::-;18718:7;18761:13;4936:1;18761:2;:13;:::i;:::-;18745:12;;:30;;;;:::i;10563:225::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;10642:6:::1;::::0;10622:34:::1;::::0;-1:-1:-1;;;;;10642:6:0::1;;10622:19;:34::i;:::-;10686:6;::::0;;-1:-1:-1;;10703:19:0;::::1;::::0;;;10738:42:::1;::::0;-1:-1:-1;;;;;10686:6:0;;::::1;::::0;10667:16:::1;::::0;10686:6;;10738:42:::1;::::0;10667:16;;10738:42:::1;10611:177;10563:225::o:0;17608:293::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;17741:11:::1;:42:::0;;-1:-1:-1;;;;;17741:42:0;;::::1;-1:-1:-1::0;;17741:42:0;;::::1;;::::0;;;17794:23;:46;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;17851:21;:42;;;;;::::1;::::0;::::1;;::::0;;17608:293::o;16236:182::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;16389:14:::1;:21:::0;;-1:-1:-1;;16389:21:0::1;16406:4;16389:21;::::0;;16236:182::o;13621:492::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;13703:7:::1;13698:408;;-1:-1:-1::0;;;;;13727:13:0;;::::1;13743:5;13727:13:::0;;;:7:::1;:13;::::0;;;;;:21;;-1:-1:-1;;13727:21:0::1;::::0;;13763:9:::1;::::0;:32;;;;;::::1;::::0;::::1;20062:74:1::0;;;;20152:18;;;20145:50;;;;13763:9:0;;::::1;::::0;;::::1;::::0;:19:::1;::::0;20035:18:1;;13763:32:0::1;19894:307:1::0;13698:408:0::1;13832:17;::::0;:22;13828:136:::1;;13921:6;13901:17;;13883:15;:35;;;;:::i;:::-;:44;13875:73;;;::::0;-1:-1:-1;;;13875:73:0;;20408:2:1;13875:73:0::1;::::0;::::1;20390:21:1::0;20447:2;20427:18;;;20420:30;20486:18;20466;;;20459:46;20522:18;;13875:73:0::1;20206:340:1::0;13875:73:0::1;-1:-1:-1::0;;;;;13978:13:0;;::::1;;::::0;;;:7:::1;:13;::::0;;;;;;:20;;-1:-1:-1;;13978:20:0::1;13994:4;13978:20:::0;;::::1;::::0;;;14033:15:::1;14013:17;:35:::0;14063:9:::1;::::0;:31;;;;;::::1;::::0;::::1;20062:74:1::0;;;;20152:18;;;20145:50;14063:9:0;;::::1;::::0;;::::1;::::0;:19:::1;::::0;20035:18:1;;14063:31:0::1;19894:307:1::0;13698:408:0::1;13621:492:::0;;:::o;12503:175::-;7741:6;;12569:4;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;12618:9:::1;::::0;12586:62:::1;::::0;12603:4:::1;::::0;12618:9:::1;::::0;::::1;-1:-1:-1::0;;;;;12618:9:0::1;-1:-1:-1::0;;12586:8:0::1;:62::i;:::-;-1:-1:-1::0;12666:4:0::1;12503:175:::0;:::o;27110:545::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;27172:14:::1;::::0;::::1;;27171:15;27163:52;;;::::0;-1:-1:-1;;;27163:52:0;;20753:2:1;27163:52:0::1;::::0;::::1;20735:21:1::0;20792:2;20772:18;;;20765:30;20831:26;20811:18;;;20804:54;20875:18;;27163:52:0::1;20551:348:1::0;27163:52:0::1;27234:16;::::0;::::1;::::0;::::1;;;27226:53;;;::::0;-1:-1:-1;;;27226:53:0;;21106:2:1;27226:53:0::1;::::0;::::1;21088:21:1::0;21145:2;21125:18;;;21118:30;21184:26;21164:18;;;21157:54;21228:18;;27226:53:0::1;20904:348:1::0;27226:53:0::1;27302:9;::::0;;;::::1;-1:-1:-1::0;;;;;27302:9:0::1;27290:100;;27342:9;:36:::0;;;::::1;27372:4;27342:36:::0;::::1;;::::0;;27290:100:::1;27404:9;::::0;27424:6:::1;::::0;27404:85:::1;::::0;;;;-1:-1:-1;;;;;27424:6:0;;::::1;27404:85;::::0;::::1;21480:74:1::0;21602:10;27439:12:0::1;21590:23:1::0;21570:18;;;21563:51;21662:18;27461:15:0::1;21650:31:1::0;21630:18;;;21623:59;4936:1:0::1;21698:18:1::0;;;21691:45;27404:9:0;;;::::1;;::::0;:19:::1;::::0;21452::1;;27404:85:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;27400:101:::0;27511:14:::1;:21:::0;;-1:-1:-1;;27511:21:0::1;27528:4;27511:21;::::0;;27570:6:::1;::::0;27586:5:::1;::::0;27560:17:::1;::::0;-1:-1:-1;;;;;27570:6:0::1;-1:-1:-1::0;;;;;11811:16:0;11784:7;11811:16;;;:7;:16;;;;;;;11718:117;27560:17:::1;:22;::::0;27580:2:::1;27560:22;:::i;:::-;27559:32;;;;:::i;:::-;27543:13;:48:::0;27626:6:::1;::::0;-1:-1:-1;;;;;27626:6:0::1;11784:7:::0;11811:16;;;:7;:16;;;;;;27642:5:::1;::::0;27616:22:::1;::::0;27636:2:::1;27616:22;:::i;:::-;27615:32;;;;:::i;:::-;27602:10;:45:::0;27110:545::o;17909:205::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;18021:21;:42;;-1:-1:-1;;;;;18021:42:0;;::::1;-1:-1:-1::0;;18021:42:0;;::::1;;::::0;;;18074:16;:32;;;;;::::1;::::0;::::1;;::::0;;17909:205::o;11843:165::-;11921:4;11938:40;11948:10;11960:9;11971:6;11938:9;:40::i;:::-;-1:-1:-1;11996:4:0;;11843:165;-1:-1:-1;;;11843:165:0:o;20042:263::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;20151:19:::1;:33:::0;;-1:-1:-1;;20151:33:0::1;;::::0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;20195:22:::1;:47:::0;;-1:-1:-1;;20195:47:0::1;::::0;::::1;;;::::0;;20258:39:::1;::::0;4400:41:1;;;20258:39:0::1;::::0;4388:2:1;4373:18;20258:39:0::1;;;;;;;;20042:263:::0;;:::o;16978:622::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;17127:7:::1;:29:::0;;::::1;::::0;;::::1;17167::::0;;;;;;;;;;;::::1;;;17251:19:::0;;17207:33;;;::::1;;17251:19:::0;;;;;;::::1;;;17321::::0;;17281:29;;;::::1;;17321:19:::0;;;;;;::::1;::::0;;;::::1;;::::0;;;17281:29;17207:33;17371:21:::1;17167:29:::0;17127;17371:21:::1;:::i;:::-;:35;;;;:::i;:::-;:47;;;;:::i;:::-;:54;;;;:::i;:::-;17351:7;:74:::0;;;::::1;::::0;::::1;::::0;;::::1;;;::::0;;17471:9:::1;:17:::0;-1:-1:-1;;17452:36:0::1;::::0;17471:17;;::::1;::::0;::::1;::::0;17452:16:::1;:36;:::i;:::-;17527:7;:12:::0;17436:52:::1;::::0;;::::1;::::0;-1:-1:-1;17436:52:0;;17507:32:::1;::::0;17527:12;;::::1;::::0;::::1;::::0;17507:17;;;::::1;;:32;:::i;:::-;:41;;;;17499:93;;;::::0;-1:-1:-1;;;17499:93:0;;21949:2:1;17499:93:0::1;::::0;::::1;21931:21:1::0;21988:2;21968:18;;;21961:30;22027:34;22007:18;;;22000:62;22098:9;22078:18;;;22071:37;22125:19;;17499:93:0::1;21747:403:1::0;17499:93:0::1;17116:484;16978:622:::0;;;;;;:::o;13000:613::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;13080:16:::1;::::0;::::1;::::0;::::1;;;13079:17;13071:60;;;::::0;-1:-1:-1;;;13071:60:0;;22357:2:1;13071:60:0::1;::::0;::::1;22339:21:1::0;22396:2;22376:18;;;22369:30;22435:32;22415:18;;;22408:60;22485:18;;13071:60:0::1;22155:354:1::0;13071:60:0::1;13142:20;13175:9;13142:43;;13196:16;13226:10;-1:-1:-1::0;;;;;13226:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;13215:40:0::1;;13264:4;13271:10;-1:-1:-1::0;;;;;13271:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13215:74;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;23023:15:1;;;13215:74:0::1;::::0;::::1;23005:34:1::0;23075:15;;23055:18;;;23048:43;22917:18;;13215:74:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13196:93:::0;-1:-1:-1;;;;;;13304:22:0;::::1;13300:200;;13363:10;-1:-1:-1::0;;;;;13363:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;13352:43:0::1;;13404:4;13411:10;-1:-1:-1::0;;;;;13411:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13352:77;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;23023:15:1;;;13352:77:0::1;::::0;::::1;23005:34:1::0;23075:15;;23055:18;;;23048:43;22917:18;;13352:77:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13343:6;:86:::0;;-1:-1:-1;;13343:86:0::1;-1:-1:-1::0;;;;;13343:86:0;;;::::1;::::0;;;::::1;::::0;;13300:200:::1;;;13471:6;:17:::0;;-1:-1:-1;;13471:17:0::1;-1:-1:-1::0;;;;;13471:17:0;::::1;;::::0;;13300:200:::1;13510:9;:22:::0;;;::::1;;-1:-1:-1::0;;;;;13510:22:0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;13543:62:::1;::::0;13560:4:::1;::::0;13575:9;;::::1;;-1:-1:-1::0;;13543:8:0::1;:62::i;27663:182::-:0;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;27730:16:::1;::::0;::::1;::::0;::::1;;;27729:17;27721:58;;;::::0;-1:-1:-1;;;27721:58:0;;23304:2:1;27721:58:0::1;::::0;::::1;23286:21:1::0;23343:2;23323:18;;;23316:30;23382;23362:18;;;23355:58;23430:18;;27721:58:0::1;23102:352:1::0;27721:58:0::1;27798:6;::::0;27790:47:::1;::::0;-1:-1:-1;;;;;27798:6:0;;::::1;::::0;27815:21:::1;27790:47:::0;::::1;;;::::0;27798:6:::1;27790:47:::0;27798:6;27790:47;27815:21;27798:6;27790:47;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;27663:182::o:0;15429:145::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;15519:9:::1;::::0;:47:::1;::::0;;;;-1:-1:-1;;;;;20080:55:1;;;15519:47:0::1;::::0;::::1;20062:74:1::0;20179:14;;20172:22;20152:18;;;20145:50;15519:9:0;;;::::1;::::0;;::::1;::::0;:29:::1;::::0;20035:18:1;;15519:47:0::1;19894:307:1::0;19110:699:0;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;19310:16:::1;19290;19280:7;;:26;;;;:::i;:::-;19279:47;;;;:::i;:::-;19263:13;:63:::0;19351:7:::1;::::0;19378:13;;19351:23:::1;::::0;19361:13;;19351:23:::1;:::i;:::-;19350:41;;;;:::i;:::-;19337:10;:54:::0;;;19410:13:::1;::::0;:27:::1;;19402:73;;;::::0;-1:-1:-1;;;19402:73:0;;23661:2:1;19402:73:0::1;::::0;::::1;23643:21:1::0;23700:2;23680:18;;;23673:30;23739:34;23719:18;;;23712:62;23810:3;23790:18;;;23783:31;23831:19;;19402:73:0::1;23459:397:1::0;19402:73:0::1;19519:6;::::0;-1:-1:-1;;;;;19519:6:0::1;11784:7:::0;11811:16;;;:7;:16;;;;;;5907:5:::1;::::0;19509:23:::1;::::0;19529:3:::1;19509:23;:::i;:::-;19508:44;;;;:::i;:::-;19494:10;;:58;;19486:106;;;::::0;-1:-1:-1;;;19486:106:0;;24063:2:1;19486:106:0::1;::::0;::::1;24045:21:1::0;24102:2;24082:18;;;24075:30;24141:34;24121:18;;;24114:62;24212:5;24192:18;;;24185:33;24235:19;;19486:106:0::1;23861:399:1::0;19486:106:0::1;19635:9;19625:7;;:19;;;;:::i;:::-;19611:10;;:33;;19603:92;;;::::0;-1:-1:-1;;;19603:92:0;;24467:2:1;19603:92:0::1;::::0;::::1;24449:21:1::0;24506:2;24486:18;;;24479:30;24545:34;24525:18;;;24518:62;24616:16;24596:18;;;24589:44;24650:19;;19603:92:0::1;24265:410:1::0;19603:92:0::1;19741:9;19731:7;;:19;;;;:::i;:::-;19714:13;;:36;;19706:95;;;::::0;-1:-1:-1;;;19706:95:0;;24467:2:1;19706:95:0::1;::::0;::::1;24449:21:1::0;24506:2;24486:18;;;24479:30;24545:34;24525:18;;;24518:62;24616:16;24596:18;;;24589:44;24650:19;;19706:95:0::1;24265:410:1::0;19706:95:0::1;19110:699:::0;;;;:::o;15762:127::-;15849:9;;:32;;;;;-1:-1:-1;;;;;178:55:1;;;15849:32:0;;;160:74:1;15825:4:0;;15849:9;;;;;:23;;133:18:1;;15849:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15060:148::-;7741:6;;-1:-1:-1;;;;;7741:6:0;7751:10;7741:20;7733:50;;;;-1:-1:-1;;;7733:50:0;;12236:2:1;7733:50:0;;;12218:21:1;12275:2;12255:18;;;12248:30;-1:-1:-1;;;12294:18:1;;;12287:47;12351:18;;7733:50:0;12034:341:1;7733:50:0;-1:-1:-1;;;;;15156:34:0;;;::::1;;::::0;;;:25:::1;:34;::::0;;;;:44;;-1:-1:-1;;15156:44:0::1;::::0;::::1;;::::0;;;::::1;::::0;;15060:148::o;12185:310::-;-1:-1:-1;;;;;12280:20:0;;12272:52;;;;-1:-1:-1;;;12272:52:0;;25132:2:1;12272:52:0;;;25114:21:1;25171:2;25151:18;;;25144:30;25210:21;25190:18;;;25183:49;25249:18;;12272:52:0;24930:343:1;12272:52:0;-1:-1:-1;;;;;12343:21:0;;12335:53;;;;-1:-1:-1;;;12335:53:0;;25132:2:1;12335:53:0;;;25114:21:1;25171:2;25151:18;;;25144:30;25210:21;25190:18;;;25183:49;25249:18;;12335:53:0;24930:343:1;12335:53:0;-1:-1:-1;;;;;12401:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:37;;;12454:33;;391:25:1;;;12454:33:0;;364:18:1;12454:33:0;;;;;;;12185:310;;;:::o;21193:1946::-;21272:4;-1:-1:-1;;;;;21297:18:0;;21289:68;;;;-1:-1:-1;;;21289:68:0;;25480:2:1;21289:68:0;;;25462:21:1;25519:2;25499:18;;;25492:30;25558:34;25538:18;;;25531:62;25629:7;25609:18;;;25602:35;25654:19;;21289:68:0;25278:401:1;21289:68:0;-1:-1:-1;;;;;21376:16:0;;21368:64;;;;-1:-1:-1;;;21368:64:0;;25886:2:1;21368:64:0;;;25868:21:1;25925:2;25905:18;;;25898:30;25964:34;25944:18;;;25937:62;26035:5;26015:18;;;26008:33;26058:19;;21368:64:0;25684:399:1;21368:64:0;21460:1;21451:6;:10;21443:64;;;;-1:-1:-1;;;21443:64:0;;26290:2:1;21443:64:0;;;26272:21:1;26329:2;26309:18;;;26302:30;26368:34;26348:18;;;26341:62;26439:11;26419:18;;;26412:39;26468:19;;21443:64:0;26088:405:1;21443:64:0;-1:-1:-1;;;;;21606:13:0;;21518:8;21606:13;;;:7;:13;;;;;;21518:8;;;;21606:13;;21602:162;;;21642:4;21636:10;;21602:162;;;-1:-1:-1;;;;;21668:11:0;;;;;;:7;:11;;;;;;;;21664:100;;;21703:4;21696:11;;21664:100;;;-1:-1:-1;21748:4:0;21664:100;21778:20;21789:4;21795:2;21778:10;:20::i;:::-;21774:644;;;21819:14;;;;21815:89;;21854:34;;-1:-1:-1;;;21854:34:0;;26700:2:1;21854:34:0;;;26682:21:1;26739:2;26719:18;;;26712:30;26778:26;26758:18;;;26751:54;26822:18;;21854:34:0;26498:348:1;21815:89:0;21922:3;:11;;;;21929:4;21922:11;21918:232;;;-1:-1:-1;;;;;21958:27:0;;;;;;:21;:27;;;;;;;;21957:28;:58;;;;-1:-1:-1;;;;;;21990:25:0;;;;;;:21;:25;;;;;;;;21989:26;21957:58;21953:182;;;22058:12;;22048:6;:22;;22040:75;;;;-1:-1:-1;;;22040:75:0;;27053:2:1;22040:75:0;;;27035:21:1;27092:2;27072:18;;;27065:30;27131:34;27111:18;;;27104:62;27202:10;27182:18;;;27175:38;27230:19;;22040:75:0;26851:404:1;22040:75:0;22182:9;;-1:-1:-1;;;;;22168:24:0;;;22182:9;;;;;22168:24;;;;:33;;;22197:4;22196:5;22168:33;22164:243;;;-1:-1:-1;;;;;22227:25:0;;;;;;:21;:25;;;;;;;;22222:170;;22311:14;;22301:6;22285:13;22295:2;-1:-1:-1;;;;;11811:16:0;11784:7;11811:16;;;:7;:16;;;;;;;11718:117;22285:13;:22;;;;:::i;:::-;:40;;22277:95;;;;-1:-1:-1;;;22277:95:0;;27462:2:1;22277:95:0;;;27444:21:1;27501:2;27481:18;;;27474:30;27540:34;27520:18;;;27513:62;27611:12;27591:18;;;27584:40;27641:19;;22277:95:0;27260:406:1;22277:95:0;22434:4;22430:632;;;22460:6;;;;22455:596;;22491:19;;;;;;;22487:549;;;22584:4;22535:28;11811:16;;;:7;:16;;;;;;22641:13;;22617:37;;22613:404;;22701:10;;22742:22;;;;22738:97;;;22799:13;;22789:6;;-1:-1:-1;;;;;22789:6:0;11784:7;11811:16;;;:7;:16;;;;;;5907:5;;22779:33;;;:::i;:::-;22778:54;;;;:::i;:::-;22768:64;;22738:97;22889:7;22865:20;:31;22861:72;;22923:7;22900:30;;22861:72;22959:34;22972:20;22959:12;:34::i;:::-;22656:361;22613:404;22512:524;22487:549;23079:52;23096:4;23102:2;23106:6;23114:3;23119:4;23125:5;23079:16;:52::i;:::-;23072:59;21193:1946;-1:-1:-1;;;;;;;21193:1946:0:o;28286:1061::-;28427:16;;28405:4;;28427:16;;;;;28422:298;;28460:28;28479:4;28485:2;28460:18;:28::i;:::-;28508:16;;;;;;;28507:17;:41;;;;;28528:20;28539:4;28545:2;28528:10;:20::i;:::-;28507:77;;;;-1:-1:-1;;;;;;28553:31:0;;;;;;:25;:31;;;;;;;;28552:32;28507:77;:111;;;;-1:-1:-1;;;;;;28589:29:0;;;;;;:25;:29;;;;;;;;28588:30;28507:111;:121;;;;;28623:5;28622:6;28507:121;28503:206;;;28649:44;;-1:-1:-1;;;28649:44:0;;27873:2:1;28649:44:0;;;27855:21:1;27912:2;27892:18;;;27885:30;27951:34;27931:18;;;27924:62;28022:4;28002:18;;;27995:32;28044:19;;28649:44:0;27671:398:1;28503:206:0;28736:20;28747:4;28753:2;28736:10;:20::i;:::-;28732:226;;;28791:9;;:37;;;;;-1:-1:-1;;;;;28355:15:1;;;28791:37:0;;;28337:34:1;28407:15;;;28387:18;;;28380:43;28439:18;;;28432:34;;;28760:12:0;;28791:9;;;;;:19;;28249:18:1;;28791:37:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;28791:37:0;;;;;;;;-1:-1:-1;;28791:37:0;;;;;;;;;;;;:::i;:::-;;;28787:120;;28896:8;;;28787:120;28879:5;-1:-1:-1;28925:7:0;28921:26;;28936:8;;;28921:26;28758:200;28732:226;-1:-1:-1;;;;;29004:25:0;;28970:12;29004:25;;;:19;:25;;;;;;28985:4;;29004:25;;;:52;;-1:-1:-1;;;;;;29033:23:0;;;;;;:19;:23;;;;;;;;29004:52;29000:99;;;-1:-1:-1;29082:5:0;29000:99;-1:-1:-1;;;;;29111:13:0;;;;;;:7;:13;;;;;:23;;29128:6;;29111:13;:23;;29128:6;;29111:23;:::i;:::-;;;;-1:-1:-1;29145:22:0;;-1:-1:-1;29171:7:0;29170:55;;29219:6;29170:55;;;29182:34;29192:4;29198:3;29203:4;29209:6;29182:9;:34::i;:::-;-1:-1:-1;;;;;29236:11:0;;;;;;:7;:11;;;;;:29;;29145:80;;-1:-1:-1;29145:80:0;;29236:11;;;:29;;29145:80;;29236:29;:::i;:::-;;;;;;;;29298:2;-1:-1:-1;;;;;29283:34:0;29292:4;-1:-1:-1;;;;;29283:34:0;;29302:14;29283:34;;;;391:25:1;;379:2;364:18;;245:177;29283:34:0;;;;;;;;-1:-1:-1;29335:4:0;;28286:1061;-1:-1:-1;;;;;;;;28286:1061:0:o;20743:442::-;20844:6;;20812:4;;-1:-1:-1;;;;;20836:14:0;;;20844:6;;20836:14;;;;:43;;-1:-1:-1;20873:6:0;;-1:-1:-1;;;;;20867:12:0;;;20873:6;;20867:12;;20836:43;:79;;;;-1:-1:-1;20909:6:0;;-1:-1:-1;;;;;20909:6:0;20896:9;:19;;20836:79;:118;;;;-1:-1:-1;;;;;;20933:21:0;;;;;;:17;:21;;;;;;;;20932:22;20836:118;:159;;;;-1:-1:-1;;;;;;20972:23:0;;;;;;:17;:23;;;;;;;;20971:24;20836:159;:186;;;;-1:-1:-1;;;;;;21012:10:0;;6046:42;21012:10;;20836:186;:219;;;;-1:-1:-1;;;;;;21039:16:0;;;;20836:219;:257;;;;-1:-1:-1;;;;;;21072:21:0;;21088:4;21072:21;;20836:257;:300;;;;-1:-1:-1;21126:9:0;;-1:-1:-1;;;;;21110:26:0;;;21126:9;;;;;21110:26;;20836:300;:341;;;;-1:-1:-1;21167:9:0;;-1:-1:-1;;;;;21153:24:0;;;21167:9;;;;;21153:24;;20836:341;20829:348;20743:442;-1:-1:-1;;;20743:442:0:o;23147:2704::-;7635:6;:13;;-1:-1:-1;;7635:13:0;7644:4;7635:13;;;23230:30:::1;::::0;;::::1;::::0;::::1;::::0;;23253:7:::1;23230:30:::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;;;7635:6;23275:21;23271:60:::1;;23313:7;;;23271:60;23367:4;23347:26;::::0;;;:11:::1;:26;::::0;;;;;;;23382:9:::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;23382:9:0::1;23347:46:::0;;;;;;;;-1:-1:-1;;23347:67:0::1;23343:166;;23451:4;23431:26;::::0;;;:11:::1;:26;::::0;;;;;;;23466:9:::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;23466:9:0::1;23431:46:::0;;;;;;;-1:-1:-1;;23431:66:0;;23343:166:::1;23521:17;23606:1;23586:6;:16;;;23542:60;;23566:6;:16;;;23543:39;;:20;:39;;;;:::i;:::-;23542:60;;;;:::i;:::-;23541:66;;;;:::i;:::-;23521:86:::0;-1:-1:-1;23618:15:0::1;23636:32;23521:86:::0;23636:20;:32:::1;:::i;:::-;23713:16;::::0;;23727:1:::1;23713:16:::0;;;;;::::1;::::0;;23618:50;;-1:-1:-1;23689:21:0::1;::::0;23713:16;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;23713:16:0::1;23689:40;;23758:4;23740;23745:1;23740:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;23740:23:0::1;;;-1:-1:-1::0;;;;;23740:23:0::1;;;::::0;::::1;23784:9;;;;;;;;;-1:-1:-1::0;;;;;23784:9:0::1;-1:-1:-1::0;;;;;23784:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23774:4;23779:1;23774:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;23774:26:0;;::::1;:7;::::0;;::::1;::::0;;;;;:26;23817:9:::1;::::0;:186:::1;::::0;;;;:9:::1;::::0;;::::1;::::0;;::::1;::::0;:60:::1;::::0;:186:::1;::::0;23892:7;;23914:1:::1;::::0;23930:4;;23957::::1;::::0;23977:15:::1;::::0;23817:186:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;23813:233;;24028:7;;;;;;23813:233;24079:21;24058:18;24165:7:::0;24139:22:::1;24152:9:::0;24079:21;24139:22:::1;:::i;:::-;24138:34;;;;:::i;:::-;24111:61:::0;-1:-1:-1;24189:13:0;;24185:417:::1;;24223:9;::::0;24392:21;;24223:239:::1;::::0;;;;24300:4:::1;24223:239;::::0;::::1;29459:34:1::0;29509:18;;;29502:34;;;24352:1:0::1;29552:18:1::0;;;29545:34;;;29595:18;;;29588:34;-1:-1:-1;;;;;24392:21:0;;::::1;29638:19:1::0;;;29631:44;24432:15:0::1;29691:19:1::0;;;29684:35;24223:9:0::1;::::0;;::::1;;::::0;:25:::1;::::0;24256:16;;29370:19:1;;24223:239:0::1;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;24223:239:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;24223:239:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;24219:372;;24569:7;;;;;;;;24219:372;-1:-1:-1::0;;24487:40:0::1;::::0;;9280:25:1;;;9336:2;9321:18;;9314:34;;;24487:40:0::1;::::0;-1:-1:-1;9253:18:1;24487:40:0::1;;;;;;;24219:372;24614:30;24628:16:::0;24614:30;::::1;:::i;:::-;;;24675:6;:16;;;24655:6;:16;;:36;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;24790:16:::1;::::0;::::1;::::0;24768:18:::1;::::0;::::1;::::0;24702:12:::1;::::0;-1:-1:-1;24702:12:0;;24754:52;;::::1;::::0;24755:31:::1;::::0;::::1;:10:::0;:31:::1;:::i;:::-;24754:52;;;;:::i;:::-;24845:9;::::0;24725:81;;-1:-1:-1;24817:24:0::1;::::0;-1:-1:-1;;;;;24845:9:0::1;24844:82;;24925:1;24844:82;;;24906:6;:16;;;24872:50;;24886:6;:16;;;24873:29;;:10;:29;;;;:::i;:::-;24872:50;;;;:::i;:::-;24968:12;::::0;24817:109;;-1:-1:-1;24937:27:0::1;::::0;-1:-1:-1;;;;;24968:12:0::1;24967:80;;25046:1;24967:80;;;25027:6;:16;;;24998:45;;25012:6;:11;;;24999:24;;:10;:24;;;;:::i;:::-;24998:45;;;;:::i;:::-;24937:110:::0;-1:-1:-1;25058:24:0::1;24937:110:::0;25099:37:::1;25120:16:::0;25099:18;:37:::1;:::i;:::-;:59;;;;:::i;:::-;25085:74;::::0;:10;:74:::1;:::i;:::-;25058:101:::0;-1:-1:-1;25174:20:0;;25170:133:::1;;25224:11;:21:::0;:67:::1;::::0;-1:-1:-1;;;;;25224:21:0;;::::1;::::0;25281:5:::1;::::0;25258:16;;25224:67:::1;::::0;;;25258:16;25224:21;25281:5;25224:67:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;25211:80:0;;-1:-1:-1;;25170:133:0::1;25317:22:::0;;25313:139:::1;;25369:23:::0;;:71:::1;::::0;-1:-1:-1;;;;;25369:23:0;;::::1;::::0;25430:5:::1;::::0;25405:18;;25369:71:::1;::::0;;;25405:18;25369:23;25430:5;25369:71:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;25356:84:0;;-1:-1:-1;;25313:139:0::1;25466:20:::0;;25462:184:::1;;25513:9;;;;;;;;;-1:-1:-1::0;;;;;25513:9:0::1;-1:-1:-1::0;;;;;25513:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25503:4;25508:1;25503:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;25503:26:0;;::::1;:7;::::0;;::::1;::::0;;;;;:26;25554:9:::1;::::0;25544:7;;25554:9;::::1;::::0;25544:4;;25554:9;;25544:7;::::1;;;;;:::i;:::-;-1:-1:-1::0;;;;;25544:19:0;;::::1;:7;::::0;;::::1;::::0;;;;;:19;25612:21;;25578:56:::1;::::0;25588:4;;25594:16;;25612:21:::1;25578:9;:56::i;:::-;25660:23:::0;;25656:188:::1;;25710:9;;;;;;;;;-1:-1:-1::0;;;;;25710:9:0::1;-1:-1:-1::0;;;;;25710:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25700:4;25705:1;25700:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;25700:26:0;;::::1;:7;::::0;;::::1;::::0;;;;;:26;25751:12:::1;::::0;25741:7;;25751:12;::::1;::::0;25741:4;;25751:12;;25741:7;::::1;;;;;:::i;:::-;-1:-1:-1::0;;;;;25741:22:0;;::::1;:7;::::0;;::::1;::::0;;;;;:22;25815:16;;25778:54:::1;::::0;25788:4;;25794:19;;25815:16:::1;25778:9;:54::i;:::-;23219:2632;;;;;;;;;;;7659:1;-1:-1:-1::0;7671:6:0;:14;;-1:-1:-1;;7671:14:0;;;23147:2704::o;26545:557::-;26628:16;;;;;;;26627:17;26619:65;;;;-1:-1:-1;;;26619:65:0;;30629:2:1;26619:65:0;;;30611:21:1;30668:2;30648:18;;;30641:30;30707:34;30687:18;;;30680:62;30778:5;30758:18;;;30751:33;30801:19;;26619:65:0;30427:399:1;26619:65:0;26700:20;26711:4;26717:2;26700:10;:20::i;:::-;26699:21;:37;;;;-1:-1:-1;26730:6:0;;-1:-1:-1;;;;;26724:12:0;;;26730:6;;26724:12;26699:37;26695:400;;;-1:-1:-1;;;;;26753:23:0;;;;;;;:17;:23;;;;;;;;:30;;-1:-1:-1;;26753:30:0;;;26779:4;26753:30;;;;;;26798:19;:25;;;;;:32;;;;;;;;;;26845:16;:23;;-1:-1:-1;;26845:23:0;26753:30;26845:23;;;;;26895:9;;;;26883:108;;26939:9;:36;;;;26969:4;26939:36;;;;;26883:108;27005:19;:26;;-1:-1:-1;;27005:26:0;;;;;27051:32;;-1:-1:-1;4400:41:1;;27051:32:0;;4388:2:1;4373:18;27051:32:0;4260:187:1;29355:1067:0;29463:30;;;;;;;;29486:7;29463:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29443:7;;;29533:205;;;;-1:-1:-1;29570:9:0;:16;;;29533:205;;;29608:4;29604:134;;;-1:-1:-1;29642:9:0;:17;;;;;;29604:134;;;-1:-1:-1;29705:9:0;:21;;;;;;29604:134;29760:9;;;;;-1:-1:-1;;;;;29760:9:0;29782:4;29752:35;:108;;;;;29805:13;29822:1;29805:18;:54;;;;29840:13;29857:2;29840:19;29805:54;29748:136;;;-1:-1:-1;29877:4:0;29748:136;29894:17;5907:5;29914:19;29923:10;29914:6;:19;:::i;:::-;:38;;;;:::i;:::-;29894:58;;29963:18;30027:6;:16;;;30013:6;:11;;;:30;;;;:::i;:::-;29984:60;;29997:6;:11;;;29985:23;;:9;:23;;;;:::i;:::-;29984:60;;;;:::i;:::-;29963:81;-1:-1:-1;30055:15:0;30073:22;29963:81;30073:9;:22;:::i;:::-;30055:40;-1:-1:-1;30110:11:0;;30106:135;;30154:4;30138:22;;;;:7;:22;;;;;:33;;30164:7;;30138:22;:33;;30164:7;;30138:33;:::i;:::-;;;;-1:-1:-1;;30191:38:0;;391:25:1;;;30214:4:0;;-1:-1:-1;;;;;30191:38:0;;;;;379:2:1;364:18;30191:38:0;;;;;;;30106:135;30255:14;;30251:126;;30297:10;30286:7;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;30327:38:0;;391:25:1;;;30350:1:0;;-1:-1:-1;;;;;30327:38:0;;;;;379:2:1;364:18;30327:38:0;;;;;;;30251:126;30396:18;30405:9;30396:6;:18;:::i;:::-;30389:25;29355:1067;-1:-1:-1;;;;;;;;;;29355:1067:0:o;25859:678::-;25970:9;;:189;;;;;:9;;;;-1:-1:-1;;;;;25970:9:0;;:60;;26038:6;;25970:189;;26070:1;;26086:4;;26113;;26133:15;;25970:189;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25966:564;;25859:678;;;:::o;25966:564::-;26175:12;26197:4;26202:1;26197:7;;;;;;;;:::i;:::-;;;;;;;;;;;26248:30;;;;;26272:4;26248:30;;;160:74:1;26197:7:0;;-1:-1:-1;;;;;;26220:14:0;;;;;26235:11;;26220:14;;26248:15;;133:18:1;;26248:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26220:59;;;;;;;;;;-1:-1:-1;;;;;31758:55:1;;;26220:59:0;;;31740:74:1;31830:18;;;31823:34;31713:18;;26220:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;26310:9:0;;26298:7;;-1:-1:-1;;;;;26310:9:0;;;;26298:4;;26310:9;;26298:7;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;26298:21:0;;26294:185;;26359:6;26340:15;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;26294:185:0;;-1:-1:-1;26294:185:0;;26402:12;;26391:7;;-1:-1:-1;;;;;26402:12:0;;;;26391:4;;26402:12;;26391:7;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;26391:23:0;;26387:92;;26457:6;26435:18;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;26160:330:0;25859:678;;;:::o;427:118:1:-;513:5;506:13;499:21;492:5;489:32;479:60;;535:1;532;525:12;550:376;612:6;620;673:2;661:9;652:7;648:23;644:32;641:52;;;689:1;686;679:12;641:52;728:9;715:23;747:28;769:5;747:28;:::i;:::-;794:5;-1:-1:-1;851:2:1;836:18;;823:32;864:30;823:32;864:30;:::i;:::-;913:7;903:17;;;550:376;;;;;:::o;931:184::-;983:77;980:1;973:88;1080:4;1077:1;1070:15;1104:4;1101:1;1094:15;1120:334;1191:2;1185:9;1247:2;1237:13;;-1:-1:-1;;1233:86:1;1221:99;;1350:18;1335:34;;1371:22;;;1332:62;1329:88;;;1397:18;;:::i;:::-;1433:2;1426:22;1120:334;;-1:-1:-1;1120:334:1:o;1459:183::-;1519:4;1552:18;1544:6;1541:30;1538:56;;;1574:18;;:::i;:::-;-1:-1:-1;1619:1:1;1615:14;1631:4;1611:25;;1459:183::o;1647:154::-;-1:-1:-1;;;;;1726:5:1;1722:54;1715:5;1712:65;1702:93;;1791:1;1788;1781:12;1806:737;1860:5;1913:3;1906:4;1898:6;1894:17;1890:27;1880:55;;1931:1;1928;1921:12;1880:55;1967:6;1954:20;1993:4;2017:60;2033:43;2073:2;2033:43;:::i;:::-;2017:60;:::i;:::-;2111:15;;;2197:1;2193:10;;;;2181:23;;2177:32;;;2142:12;;;;2221:15;;;2218:35;;;2249:1;2246;2239:12;2218:35;2285:2;2277:6;2273:15;2297:217;2313:6;2308:3;2305:15;2297:217;;;2393:3;2380:17;2410:31;2435:5;2410:31;:::i;:::-;2454:18;;2492:12;;;;2330;;2297:217;;;-1:-1:-1;2532:5:1;1806:737;-1:-1:-1;;;;;;1806:737:1:o;2548:477::-;2638:6;2646;2699:2;2687:9;2678:7;2674:23;2670:32;2667:52;;;2715:1;2712;2705:12;2667:52;2755:9;2742:23;2788:18;2780:6;2777:30;2774:50;;;2820:1;2817;2810:12;2774:50;2843:61;2896:7;2887:6;2876:9;2872:22;2843:61;:::i;:::-;2833:71;;;2954:2;2943:9;2939:18;2926:32;2967:28;2989:5;2967:28;:::i;3400:607::-;3512:4;3541:2;3570;3559:9;3552:21;3602:6;3596:13;3645:6;3640:2;3629:9;3625:18;3618:34;3670:1;3680:140;3694:6;3691:1;3688:13;3680:140;;;3789:14;;;3785:23;;3779:30;3755:17;;;3774:2;3751:26;3744:66;3709:10;;3680:140;;;3684:3;3869:1;3864:2;3855:6;3844:9;3840:22;3836:31;3829:42;3998:2;-1:-1:-1;;3923:2:1;3915:6;3911:15;3907:88;3896:9;3892:104;3888:113;3880:121;;;;3400:607;;;;:::o;4452:315::-;4520:6;4528;4581:2;4569:9;4560:7;4556:23;4552:32;4549:52;;;4597:1;4594;4587:12;4549:52;4636:9;4623:23;4655:31;4680:5;4655:31;:::i;:::-;4705:5;4757:2;4742:18;;;;4729:32;;-1:-1:-1;;;4452:315:1:o;4772:247::-;4831:6;4884:2;4872:9;4863:7;4859:23;4855:32;4852:52;;;4900:1;4897;4890:12;4852:52;4939:9;4926:23;4958:31;4983:5;4958:31;:::i;5024:456::-;5101:6;5109;5117;5170:2;5158:9;5149:7;5145:23;5141:32;5138:52;;;5186:1;5183;5176:12;5138:52;5225:9;5212:23;5244:31;5269:5;5244:31;:::i;:::-;5294:5;-1:-1:-1;5351:2:1;5336:18;;5323:32;5364:33;5323:32;5364:33;:::i;:::-;5024:456;;5416:7;;-1:-1:-1;;;5470:2:1;5455:18;;;;5442:32;;5024:456::o;5485:248::-;5553:6;5561;5614:2;5602:9;5593:7;5589:23;5585:32;5582:52;;;5630:1;5627;5620:12;5582:52;-1:-1:-1;;5653:23:1;;;5723:2;5708:18;;;5695:32;;-1:-1:-1;5485:248:1:o;5738:1138::-;5856:6;5864;5917:2;5905:9;5896:7;5892:23;5888:32;5885:52;;;5933:1;5930;5923:12;5885:52;5973:9;5960:23;6002:18;6043:2;6035:6;6032:14;6029:34;;;6059:1;6056;6049:12;6029:34;6082:61;6135:7;6126:6;6115:9;6111:22;6082:61;:::i;:::-;6072:71;;6162:2;6152:12;;6217:2;6206:9;6202:18;6189:32;6246:2;6236:8;6233:16;6230:36;;;6262:1;6259;6252:12;6230:36;6285:24;;;-1:-1:-1;6340:4:1;6332:13;;6328:27;-1:-1:-1;6318:55:1;;6369:1;6366;6359:12;6318:55;6405:2;6392:16;6428:60;6444:43;6484:2;6444:43;:::i;6428:60::-;6522:15;;;6604:1;6600:10;;;;6592:19;;6588:28;;;6553:12;;;;6628:19;;;6625:39;;;6660:1;6657;6650:12;6625:39;6684:11;;;;6704:142;6720:6;6715:3;6712:15;6704:142;;;6786:17;;6774:30;;6737:12;;;;6824;;;;6704:142;;;6865:5;6855:15;;;;;;;5738:1138;;;;;:::o;7070:159::-;7137:20;;7197:6;7186:18;;7176:29;;7166:57;;7219:1;7216;7209:12;7166:57;7070:159;;;:::o;7234:328::-;7308:6;7316;7324;7377:2;7365:9;7356:7;7352:23;7348:32;7345:52;;;7393:1;7390;7383:12;7345:52;7416:28;7434:9;7416:28;:::i;:::-;7406:38;;7463:37;7496:2;7485:9;7481:18;7463:37;:::i;:::-;7453:47;;7519:37;7552:2;7541:9;7537:18;7519:37;:::i;:::-;7509:47;;7234:328;;;;;:::o;7567:382::-;7632:6;7640;7693:2;7681:9;7672:7;7668:23;7664:32;7661:52;;;7709:1;7706;7699:12;7661:52;7748:9;7735:23;7767:31;7792:5;7767:31;:::i;7954:180::-;8013:6;8066:2;8054:9;8045:7;8041:23;8037:32;8034:52;;;8082:1;8079;8072:12;8034:52;-1:-1:-1;8105:23:1;;7954:180;-1:-1:-1;7954:180:1:o;8139:553::-;8240:6;8248;8256;8309:2;8297:9;8288:7;8284:23;8280:32;8277:52;;;8325:1;8322;8315:12;8277:52;8364:9;8351:23;8383:31;8408:5;8383:31;:::i;:::-;8433:5;-1:-1:-1;8490:2:1;8475:18;;8462:32;8503:33;8462:32;8503:33;:::i;:::-;8555:7;-1:-1:-1;8614:2:1;8599:18;;8586:32;8627:33;8586:32;8627:33;:::i;:::-;8679:7;8669:17;;;8139:553;;;;;:::o;8697:404::-;8781:6;8789;8842:2;8830:9;8821:7;8817:23;8813:32;8810:52;;;8858:1;8855;8848:12;8810:52;8897:9;8884:23;8916:31;8941:5;8916:31;:::i;:::-;8966:5;-1:-1:-1;9023:2:1;9008:18;;8995:32;9036:33;8995:32;9036:33;:::i;10045:547::-;10143:6;10151;10159;10167;10175;10183;10236:3;10224:9;10215:7;10211:23;10207:33;10204:53;;;10253:1;10250;10243:12;10204:53;10276:28;10294:9;10276:28;:::i;:::-;10266:38;;10323:37;10356:2;10345:9;10341:18;10323:37;:::i;:::-;10313:47;;10379:37;10412:2;10401:9;10397:18;10379:37;:::i;:::-;10369:47;;10435:37;10468:2;10457:9;10453:18;10435:37;:::i;:::-;10425:47;;10491:38;10524:3;10513:9;10509:19;10491:38;:::i;:::-;10481:48;;10548:38;10581:3;10570:9;10566:19;10548:38;:::i;:::-;10538:48;;10045:547;;;;;;;;:::o;11644:385::-;11730:6;11738;11746;11754;11807:3;11795:9;11786:7;11782:23;11778:33;11775:53;;;11824:1;11821;11814:12;11775:53;-1:-1:-1;;11847:23:1;;;11917:2;11902:18;;11889:32;;-1:-1:-1;11968:2:1;11953:18;;11940:32;;12019:2;12004:18;11991:32;;-1:-1:-1;11644:385:1;-1:-1:-1;11644:385:1:o;12653:484::-;12706:3;12744:5;12738:12;12771:6;12766:3;12759:19;12797:4;12826:2;12821:3;12817:12;12810:19;;12863:2;12856:5;12852:14;12884:1;12894:218;12908:6;12905:1;12902:13;12894:218;;;12973:13;;-1:-1:-1;;;;;12969:62:1;12957:75;;13052:12;;;;13087:15;;;;12930:1;12923:9;12894:218;;;-1:-1:-1;13128:3:1;;12653:484;-1:-1:-1;;;;;12653:484:1:o;13142:342::-;13343:2;13332:9;13325:21;13306:4;13363:56;13415:2;13404:9;13400:18;13392:6;13363:56;:::i;:::-;13355:64;;13469:6;13462:14;13455:22;13450:2;13439:9;13435:18;13428:50;13142:342;;;;;:::o;13489:184::-;13541:77;13538:1;13531:88;13638:4;13635:1;13628:15;13662:4;13659:1;13652:15;13678:482;13767:1;13810:5;13767:1;13824:330;13845:7;13835:8;13832:21;13824:330;;;13964:4;-1:-1:-1;;13892:77:1;13886:4;13883:87;13880:113;;;13973:18;;:::i;:::-;14023:7;14013:8;14009:22;14006:55;;;14043:16;;;;14006:55;14122:22;;;;14082:15;;;;13824:330;;;13828:3;13678:482;;;;;:::o;14165:866::-;14214:5;14244:8;14234:80;;-1:-1:-1;14285:1:1;14299:5;;14234:80;14333:4;14323:76;;-1:-1:-1;14370:1:1;14384:5;;14323:76;14415:4;14433:1;14428:59;;;;14501:1;14496:130;;;;14408:218;;14428:59;14458:1;14449:10;;14472:5;;;14496:130;14533:3;14523:8;14520:17;14517:43;;;14540:18;;:::i;:::-;-1:-1:-1;;14596:1:1;14582:16;;14611:5;;14408:218;;14710:2;14700:8;14697:16;14691:3;14685:4;14682:13;14678:36;14672:2;14662:8;14659:16;14654:2;14648:4;14645:12;14641:35;14638:77;14635:159;;;-1:-1:-1;14747:19:1;;;14779:5;;14635:159;14826:34;14851:8;14845:4;14826:34;:::i;:::-;14956:6;-1:-1:-1;;14884:79:1;14875:7;14872:92;14869:118;;;14967:18;;:::i;:::-;15005:20;;14165:866;-1:-1:-1;;;14165:866:1:o;15036:140::-;15094:5;15123:47;15164:4;15154:8;15150:19;15144:4;15123:47;:::i;15181:274::-;15221:1;15247;15237:189;;15282:77;15279:1;15272:88;15383:4;15380:1;15373:15;15411:4;15408:1;15401:15;15237:189;-1:-1:-1;15440:9:1;;15181:274::o;15460:128::-;15527:9;;;15548:11;;;15545:37;;;15562:18;;:::i;15593:228::-;15633:7;15759:1;-1:-1:-1;;15687:74:1;15684:1;15681:81;15676:1;15669:9;15662:17;15658:105;15655:131;;;15766:18;;:::i;:::-;-1:-1:-1;15806:9:1;;15593:228::o;16593:184::-;16645:77;16642:1;16635:88;16742:4;16739:1;16732:15;16766:4;16763:1;16756:15;16782:197;16820:3;16848:6;16889:2;16882:5;16878:14;16916:2;16907:7;16904:15;16901:41;;16922:18;;:::i;:::-;16971:1;16958:15;;16782:197;-1:-1:-1;;;16782:197:1:o;16984:125::-;17049:9;;;17070:10;;;17067:36;;;17083:18;;:::i;17812:168::-;17879:6;17905:10;;;17917;;;17901:27;;17940:11;;;17937:37;;;17954:18;;:::i;:::-;17937:37;17812:168;;;;:::o;22514:251::-;22584:6;22637:2;22625:9;22616:7;22612:23;22608:32;22605:52;;;22653:1;22650;22643:12;22605:52;22685:9;22679:16;22704:31;22729:5;22704:31;:::i;24680:245::-;24747:6;24800:2;24788:9;24779:7;24775:23;24771:32;24768:52;;;24816:1;24813;24806:12;24768:52;24848:9;24842:16;24867:28;24889:5;24867:28;:::i;28477:605::-;28776:6;28765:9;28758:25;28819:6;28814:2;28803:9;28799:18;28792:34;28862:3;28857:2;28846:9;28842:18;28835:31;28739:4;28883:57;28935:3;28924:9;28920:19;28912:6;28883:57;:::i;:::-;-1:-1:-1;;;;;28976:55:1;;;;28971:2;28956:18;;28949:83;-1:-1:-1;29063:3:1;29048:19;29041:35;28875:65;28477:605;-1:-1:-1;;;28477:605:1:o;29730:306::-;29818:6;29826;29834;29887:2;29875:9;29866:7;29862:23;29858:32;29855:52;;;29903:1;29900;29893:12;29855:52;29932:9;29926:16;29916:26;;29982:2;29971:9;29967:18;29961:25;29951:35;;30026:2;30015:9;30011:18;30005:25;29995:35;;29730:306;;;;;:::o;30041:171::-;30109:6;30148:10;;;30136;;;30132:27;;30171:12;;;30168:38;;;30186:18;;:::i;30831:533::-;31102:6;31091:9;31084:25;31145:3;31140:2;31129:9;31125:18;31118:31;31065:4;31166:57;31218:3;31207:9;31203:19;31195:6;31166:57;:::i;:::-;-1:-1:-1;;;;;31259:55:1;;;;31254:2;31239:18;;31232:83;-1:-1:-1;31346:2:1;31331:18;31324:34;31158:65;30831:533;-1:-1:-1;;30831:533:1:o;31369:184::-;31439:6;31492:2;31480:9;31471:7;31467:23;31463:32;31460:52;;;31508:1;31505;31498:12;31460:52;-1:-1:-1;31531:16:1;;31369:184;-1:-1:-1;31369:184:1:o

Swarm Source

ipfs://706966fbcc15959dd3d0fddbde00a23c266ae3c190a24d6ec62edf4fcbe6128c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.