ETH Price: $3,114.01 (-0.63%)

Token

CBSWAP.IO (COINS)
 

Overview

Max Total Supply

1,000,000,000 COINS

Holders

733

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
azima.eth
Balance
11,487,861.42699849860305707 COINS

Value
$0.00
0x9d156bc7c8768294510A4A41883d5A4EB15b15E3
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:
BASEDSWAP

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-27
*/

// SPDX-License-Identifier: MIT                                                                               
                                                    
 pragma solidity 0.8.16;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    function _createInitialSupply(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

interface IDexRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

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

interface IDexFactory {
    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);
}

contract BASEDSWAP is ERC20, Ownable {

    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxWalletAmount;

    IDexRouter public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;

    bool private swapping;
    uint256 public swapTokensAtAmount;

    address public sustainabilityAddress;
    address public treasuryAddress;
    address public liquidityAddress;

    uint256 public tradingActiveBlock = 0; // 0 means trading is not active

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;
    
     // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

    uint256 public buyTotalFees;
    uint256 public buySustainabilityFee;
    uint256 public buyLiquidityFee;
    uint256 public buyTreasuryFee;

    uint256 public sellTotalFees;
    uint256 public sellSustainabilityFee;
    uint256 public sellLiquidityFee;
    uint256 public sellTreasuryFee;

    uint256 public tokensForSustainability;
    uint256 public tokensForLiquidity;
    uint256 public tokensForTreasury;

    uint256 public lpWithdrawRequestTimestamp;
    uint256 public lpWithdrawRequestDuration = 7 days;
    bool public lpWithdrawRequestPending;
    uint256 public lpPercToWithDraw;
    
    /******************/

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event EnabledTrading();
    event RemovedLimits();

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event UpdatedMaxBuyAmount(uint256 newAmount);

    event UpdatedMaxSellAmount(uint256 newAmount);

    event UpdatedMaxWalletAmount(uint256 newAmount);

    event UpdatedSustainabilityAddress(address indexed newWallet);

    event UpdatedTreasuryAddress(address indexed newWallet);

    event UpdatedLiquidityAddress(address indexed newWallet);

    event MaxTransactionExclusion(address _address, bool excluded);

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    event TransferForeignToken(address token, uint256 amount);

    event RequestedLPWithdraw();
    event WithdrewLPForMigration();
    event CanceledLpWithdrawRequest();

    constructor() ERC20("CBSWAP.IO", "COINS") {
        
        address newOwner = msg.sender; // can leave alone if owner is deployer.
        
        IDexRouter _uniswapV2Router = IDexRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

        _excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;
        
        uniswapV2Pair = IDexFactory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
 
        uint256 totalSupply = 1 * 1e9 * 1e18;
        
        maxBuyAmount = totalSupply * 10 / 1000;
        maxSellAmount = totalSupply * 10 / 1000;
        maxWalletAmount = totalSupply * 10 / 1000;
        swapTokensAtAmount = totalSupply * 25 / 100000; // 0.025% swap amount

        buySustainabilityFee = 500;
        buyLiquidityFee = 0;
        buyTreasuryFee = 0;
        buyTotalFees = buySustainabilityFee + buyLiquidityFee + buyTreasuryFee;

        sellSustainabilityFee = 500;
        sellLiquidityFee = 0;
        sellTreasuryFee = 0;
        sellTotalFees = sellSustainabilityFee + sellLiquidityFee + sellTreasuryFee;

        _excludeFromMaxTransaction(newOwner, true);
        _excludeFromMaxTransaction(address(this), true);
        _excludeFromMaxTransaction(address(0xdead), true);

        excludeFromFees(newOwner, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        sustainabilityAddress = address(newOwner);
        treasuryAddress = address(newOwner);
        liquidityAddress = address(newOwner);
        
        _createInitialSupply(newOwner, totalSupply);
        transferOwnership(newOwner);
    }

    receive() external payable {}

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        require(!tradingActive, "Cannot reenable trading");
        tradingActive = true;
        swapEnabled = true;
        tradingActiveBlock = block.number;
        emit EnabledTrading();
    }
    
    // remove limits after token is stable
    function removeLimits() external onlyOwner {
        limitsInEffect = false;
        transferDelayEnabled = false;
        emit RemovedLimits();
    }
    
   
    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner {
        transferDelayEnabled = false;
    }
    
    function updateMaxBuyAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/1e18, "Cannot set max buy amount lower than 0.1%");
        maxBuyAmount = newNum * (10**18);
        emit UpdatedMaxBuyAmount(maxBuyAmount);
    }
    
    function updateMaxSellAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/1e18, "Cannot set max sell amount lower than 0.1%");
        maxSellAmount = newNum * (10**18);
        emit UpdatedMaxSellAmount(maxSellAmount);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 5 / 1000)/1e18, "Cannot set max wallet amount lower than 0.5%");
        maxWalletAmount = newNum * (10**18);
        emit UpdatedMaxWalletAmount(maxWalletAmount);
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner {
  	    require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
  	    require(newAmount <= totalSupply() * 1 / 1000, "Swap amount cannot be higher than 0.1% total supply.");
  	    swapTokensAtAmount = newAmount;
  	}
    
    function _excludeFromMaxTransaction(address updAds, bool isExcluded) private {
        _isExcludedMaxTransactionAmount[updAds] = isExcluded;
        emit MaxTransactionExclusion(updAds, isExcluded);
    }

    function airdropToWallets(address[] memory wallets, uint256[] memory amountsInTokens) external onlyOwner {
        require(wallets.length == amountsInTokens.length, "arrays must be the same length");
        require(wallets.length < 200, "Can only airdrop 200 wallets per txn due to gas limits"); // allows for airdrop + launch at the same exact time, reducing delays and reducing sniper input.
        for(uint256 i = 0; i < wallets.length; i++){
            address wallet = wallets[i];
            uint256 amount = amountsInTokens[i]*1e18;
            _transfer(msg.sender, wallet, amount);
        }
    }
    
    function excludeFromMaxTransaction(address updAds, bool isEx) external onlyOwner {
        if(!isEx){
            require(updAds != uniswapV2Pair, "Cannot remove uniswap pair from max txn");
        }
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;
        
        _excludeFromMaxTransaction(pair, value);

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateBuyFees(uint256 _sustainabilityFee, uint256 _liquidityFee, uint256 _treasuryFee) external onlyOwner {
        buySustainabilityFee = _sustainabilityFee;
        buyLiquidityFee = _liquidityFee;
        buyTreasuryFee = _treasuryFee;
        buyTotalFees = buySustainabilityFee + buyLiquidityFee + buyTreasuryFee;
        require(buyTotalFees <= 1000, "Must keep fees at 10% or less");
    }

    function updateSellFees(uint256 _sustainabilityFee, uint256 _liquidityFee, uint256 _treasuryFee) external onlyOwner {
        sellSustainabilityFee = _sustainabilityFee;
        sellLiquidityFee = _liquidityFee;
        sellTreasuryFee = _treasuryFee;
        sellTotalFees = sellSustainabilityFee + sellLiquidityFee + sellTreasuryFee;
        require(sellTotalFees <= 1000, "Must keep fees at 10% or less");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function _transfer(address from, address to, uint256 amount) internal override {

        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "amount must be greater than 0");
        
        
        if(limitsInEffect){
            if (from != owner() && to != owner() && to != address(0) && to != address(0xdead)){
                if(!tradingActive){
                    require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
                }
                
                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
                if (transferDelayEnabled){
                    if (to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number - 4 && _holderLastTransferTimestamp[to] < block.number - 4, "_transfer:: Transfer Delay enabled.  Try again later.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                        _holderLastTransferTimestamp[to] = block.number;
                    }
                }
                 
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(amount <= maxBuyAmount, "Buy transfer amount exceeds the max buy.");
                        require(amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet");
                } 
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                        require(amount <= maxSellAmount, "Sell transfer amount exceeds the max sell.");
                } 
                else if (!_isExcludedMaxTransactionAmount[to] && !_isExcludedMaxTransactionAmount[from]){
                    require(amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet");
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if(canSwap && swapEnabled && !swapping && !automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            swapping = true;

            swapBack();

            swapping = false;
        }

        bool takeFee = true;
        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        uint256 fees = 0;
        uint256 penaltyAmount = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            // bot/sniper penalty.  Tokens get transferred to marketing wallet to allow potential refund.
            if(tradingActiveBlock >= block.number + 1 && automatedMarketMakerPairs[from]){
                penaltyAmount = amount * 99 / 100;
                super._transfer(from, sustainabilityAddress, penaltyAmount);
            }
            // on sell
            else if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount * sellTotalFees /10000;
                tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
                tokensForSustainability += fees * sellSustainabilityFee / sellTotalFees;
                tokensForTreasury += fees * sellTreasuryFee / sellTotalFees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
        	    fees = amount * buyTotalFees / 10000;
        	    tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForSustainability += fees * buySustainabilityFee / buyTotalFees;
                tokensForTreasury += fees * buyTreasuryFee / buyTotalFees;
            }
            
            if(fees > 0){    
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees + penaltyAmount;
        }

        super._transfer(from, to, amount);
    }

    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }
    
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(liquidityAddress),
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForSustainability + tokensForTreasury;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmount * 10){
            contractBalance = swapTokensAtAmount * 10;
        }

        bool success;
        
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;
        
        swapTokensForEth(contractBalance - liquidityTokens); 
        
        uint256 ethBalance = address(this).balance;
        uint256 ethForLiquidity = ethBalance;

        uint256 ethForSustainability = ethBalance * tokensForSustainability / (totalTokensToSwap - (tokensForLiquidity/2));
        uint256 ethForTreasury = ethBalance * tokensForTreasury / (totalTokensToSwap - (tokensForLiquidity/2));

        ethForLiquidity -= ethForSustainability + ethForTreasury;
            
        tokensForLiquidity = 0;
        tokensForSustainability = 0;
        tokensForTreasury = 0;
        
        if(liquidityTokens > 0 && ethForLiquidity > 0){
            addLiquidity(liquidityTokens, ethForLiquidity);
        }

        (success,) = address(treasuryAddress).call{value: ethForTreasury}("");

        (success,) = address(sustainabilityAddress).call{value: address(this).balance}("");
    }

    function transferForeignToken(address _token, address _to) external onlyOwner returns (bool _sent) {
        require(_token != address(0), "_token address cannot be 0");
        require(_token != address(this), "Can't withdraw native tokens");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        _sent = IERC20(_token).transfer(_to, _contractBalance);
        emit TransferForeignToken(_token, _contractBalance);
    }

    // withdraw ETH if stuck or someone sends to the address
    function withdrawStuckETH() external onlyOwner {
        bool success;
        (success,) = address(msg.sender).call{value: address(this).balance}("");
    }

    function setSustainabilityAddress(address _sustainabilityAddress) external onlyOwner {
        require(_sustainabilityAddress != address(0), "_sustainabilityAddress address cannot be 0");
        sustainabilityAddress = payable(_sustainabilityAddress);
        emit UpdatedSustainabilityAddress(_sustainabilityAddress);
    }

    function setTreasuryAddress(address _treasuryAddress) external onlyOwner {
        require(_treasuryAddress != address(0), "_treasuryAddress address cannot be 0");
        treasuryAddress = payable(_treasuryAddress);
        emit UpdatedTreasuryAddress(_treasuryAddress);
    }

     function setLiquidityAddress(address _liquidityAddress) external onlyOwner {
        require(_liquidityAddress != address(0), "address cannot be 0");
        liquidityAddress = payable(_liquidityAddress);
        emit UpdatedLiquidityAddress(_liquidityAddress);
    }

    function requestToWithdrawLP(uint256 percToWithdraw) external onlyOwner {
        require(!lpWithdrawRequestPending, "Cannot request again until first request is over.");
        require(percToWithdraw <= 100 && percToWithdraw > 0, "Need to set between 1-100%");
        lpWithdrawRequestTimestamp = block.timestamp;
        lpWithdrawRequestPending = true;
        lpPercToWithDraw = percToWithdraw;
        emit RequestedLPWithdraw();
    }

    function nextAvailableLpWithdrawDate() public view returns (uint256){
        if(lpWithdrawRequestPending){
            return lpWithdrawRequestTimestamp + lpWithdrawRequestDuration;
        }
        else {
            return 0;  // 0 means no open requests
        }
    }

    function withdrawRequestedLP() external onlyOwner {
        require(block.timestamp >= nextAvailableLpWithdrawDate() && nextAvailableLpWithdrawDate() > 0, "Must request and wait.");
        lpWithdrawRequestTimestamp = 0;
        lpWithdrawRequestPending = false;

        uint256 amtToWithdraw = IERC20(address(uniswapV2Pair)).balanceOf(address(this)) * lpPercToWithDraw / 100;
        
        lpPercToWithDraw = 0;

        IERC20(uniswapV2Pair).transfer(msg.sender, amtToWithdraw);
    }

    function cancelLPWithdrawRequest() external onlyOwner {
        lpWithdrawRequestPending = false;
        lpPercToWithDraw = 0;
        lpWithdrawRequestTimestamp = 0;
        emit CanceledLpWithdrawRequest();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","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":[],"name":"CanceledLpWithdrawRequest","type":"event"},{"anonymous":false,"inputs":[],"name":"EnabledTrading","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"MaxTransactionExclusion","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":[],"name":"RemovedLimits","type":"event"},{"anonymous":false,"inputs":[],"name":"RequestedLPWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferForeignToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedLiquidityAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxBuyAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxSellAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxWalletAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedSustainabilityAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedTreasuryAddress","type":"event"},{"anonymous":false,"inputs":[],"name":"WithdrewLPForMigration","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"amountsInTokens","type":"uint256[]"}],"name":"airdropToWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buySustainabilityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelLPWithdrawRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPercToWithDraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpWithdrawRequestDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpWithdrawRequestPending","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpWithdrawRequestTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextAvailableLpWithdrawDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percToWithdraw","type":"uint256"}],"name":"requestToWithdrawLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellSustainabilityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityAddress","type":"address"}],"name":"setLiquidityAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sustainabilityAddress","type":"address"}],"name":"setSustainabilityAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddress","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sustainabilityAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForSustainability","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForTreasury","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferForeignToken","outputs":[{"internalType":"bool","name":"_sent","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":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IDexRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sustainabilityFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sustainabilityFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawRequestedLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526000600e55600f805462ffffff191660019081179091556011805460ff1916909117905562093a80601e553480156200003c57600080fd5b50604051806040016040528060098152602001684342535741502e494f60b81b81525060405180604001604052806005815260200164434f494e5360d81b81525081600390816200008e919062000821565b5060046200009d828262000821565b5050506000620000b26200041960201b60201c565b600580546001600160a01b0319166001600160a01b0383169081179091556040519192509060009060008051602062004419833981519152908290a35033737a250d5630b4cf539739df2c5dacb4c659f2488d620001128160016200041d565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200015d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001839190620008ed565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001d1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f79190620008ed565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000245573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026b9190620008ed565b6001600160a01b031660a08190526200028690600162000480565b6b033b2e3c9fd0803ce80000006103e8620002a382600a62000935565b620002af919062000957565b6006556103e8620002c282600a62000935565b620002ce919062000957565b6007556103e8620002e182600a62000935565b620002ed919062000957565b600855620186a06200030182601962000935565b6200030d919062000957565b600a556101f4601381905560006014819055601581905590620003329082906200097a565b6200033e91906200097a565b6012556101f4601781905560006018819055601981905590620003639082906200097a565b6200036f91906200097a565b6016556200037f8360016200041d565b6200038c3060016200041d565b6200039b61dead60016200041d565b620003a8836001620004ec565b620003b5306001620004ec565b620003c461dead6001620004ec565b600b80546001600160a01b0385166001600160a01b03199182168117909255600c8054821683179055600d805490911690911790556200040583826200059a565b62000410836200067f565b50505062000996565b3390565b6001600160a01b038216600081815260226020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6001600160a01b0382166000908152602360205260409020805460ff1916821515179055620004b082826200041d565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b031633146200053b5760405162461bcd60e51b81526020600482018190526024820152600080516020620043f983398151915260448201526064015b60405180910390fd5b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620005f25760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000532565b80600260008282546200060691906200097a565b90915550506001600160a01b03821660009081526020819052604081208054839290620006359084906200097a565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b03163314620006ca5760405162461bcd60e51b81526020600482018190526024820152600080516020620043f9833981519152604482015260640162000532565b6001600160a01b038116620007315760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000532565b6005546040516001600160a01b038084169216906000805160206200441983398151915290600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620007a757607f821691505b602082108103620007c857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200081c57600081815260208120601f850160051c81016020861015620007f75750805b601f850160051c820191505b81811015620008185782815560010162000803565b5050505b505050565b81516001600160401b038111156200083d576200083d6200077c565b62000855816200084e845462000792565b84620007ce565b602080601f8311600181146200088d5760008415620008745750858301515b600019600386901b1c1916600185901b17855562000818565b600085815260208120601f198616915b82811015620008be578886015182559484019460019091019084016200089d565b5085821015620008dd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200090057600080fd5b81516001600160a01b03811681146200091857600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156200095257620009526200091f565b500290565b6000826200097557634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156200099057620009906200091f565b92915050565b60805160a0516139f062000a096000396000818161061c0152818161138e01528181611502015281816115ad015281816119d001526125e80152600081816104e9015281816125ab0152818161318d0152818161324601528181613282015281816132fc015261336401526139f06000f3fe6080604052600436106103e85760003560e01c80638095d56411610208578063c5f956af11610118578063e2f45605116100ab578063f11a24d31161007a578063f11a24d314610b57578063f2fde38b14610b6d578063f5648a4f14610b8d578063f637434214610ba2578063fd361d0e14610bb857600080fd5b8063e2f4560514610b00578063e884f26014610b16578063ee40166e14610b2b578063ee44b44e14610b4157600080fd5b8063d257b34f116100e7578063d257b34f14610a64578063d85ba06314610a84578063dc3f0d0f14610a9a578063dd62ed3e14610aba57600080fd5b8063c5f956af146109ff578063c7c61e2c14610a1f578063c876d0b914610a34578063cc2ffe7c14610a4e57600080fd5b8063a9059cbb1161019b578063bbc0c7421161016a578063bbc0c74214610960578063befd2fac1461097f578063c02466681461099f578063c17b5b8c146109bf578063c18bc195146109df57600080fd5b8063a9059cbb146108e4578063aa4bde2814610904578063b62496f51461091a578063b691124e1461094a57600080fd5b80638da5cb5b116101d75780638da5cb5b1461087157806395d89b411461088f5780639a7a23d6146108a4578063a457c2d7146108c457600080fd5b80638095d564146108065780638366e79a1461082657806388e765ff146108465780638a8c523c1461085c57600080fd5b80634a62bb65116103035780636b2fb12411610296578063715018a611610265578063715018a614610791578063751039fc146107a65780637571336a146107bb578063763cef49146107db578063783102eb146107f057600080fd5b80636b2fb124146107105780636ddd17131461072657806370a0823114610746578063712c29851461077c57600080fd5b8063639e7e68116102d2578063639e7e68146106a45780636605bfda146106c457806366d602ae146106e45780636a486a8e146106fa57600080fd5b80634a62bb651461063e5780634b6b251414610658578063525fa81f1461066e5780635c068a8c1461068e57600080fd5b80632307b4411161037b5780633221c93f1161034a5780633221c93f146105b4578063379a2bf2146105d457806339509351146105ea57806349bd5a5e1461060a57600080fd5b80632307b4411461053657806323b872dd146105585780632be32b6114610578578063313ce5671461059857600080fd5b806310d5de53116103b757806310d5de53146104a75780631694505e146104d757806318160ddd1461050b5780631a8145bb1461052057600080fd5b8063058054c9146103f457806306fdde031461041d578063095ea7b31461043f57806309b021a81461046f57600080fd5b366103ef57005b600080fd5b34801561040057600080fd5b5061040a601d5481565b6040519081526020015b60405180910390f35b34801561042957600080fd5b50610432610bd2565b60405161041491906133dc565b34801561044b57600080fd5b5061045f61045a366004613442565b610c64565b6040519015158152602001610414565b34801561047b57600080fd5b50600b5461048f906001600160a01b031681565b6040516001600160a01b039091168152602001610414565b3480156104b357600080fd5b5061045f6104c236600461346e565b60226020526000908152604090205460ff1681565b3480156104e357600080fd5b5061048f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561051757600080fd5b5060025461040a565b34801561052c57600080fd5b5061040a601b5481565b34801561054257600080fd5b50610556610551366004613568565b610c7b565b005b34801561056457600080fd5b5061045f61057336600461362a565b610def565b34801561058457600080fd5b5061055661059336600461366b565b610e99565b3480156105a457600080fd5b5060405160128152602001610414565b3480156105c057600080fd5b50600d5461048f906001600160a01b031681565b3480156105e057600080fd5b5061040a60135481565b3480156105f657600080fd5b5061045f610605366004613442565b610fa6565b34801561061657600080fd5b5061048f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561064a57600080fd5b50600f5461045f9060ff1681565b34801561066457600080fd5b5061040a60175481565b34801561067a57600080fd5b5061055661068936600461346e565b610fe2565b34801561069a57600080fd5b5061040a60155481565b3480156106b057600080fd5b506105566106bf36600461346e565b6110a2565b3480156106d057600080fd5b506105566106df36600461346e565b61117f565b3480156106f057600080fd5b5061040a60075481565b34801561070657600080fd5b5061040a60165481565b34801561071c57600080fd5b5061040a60195481565b34801561073257600080fd5b50600f5461045f9062010000900460ff1681565b34801561075257600080fd5b5061040a61076136600461346e565b6001600160a01b031660009081526020819052604090205490565b34801561078857600080fd5b5061040a611255565b34801561079d57600080fd5b5061055661127e565b3480156107b257600080fd5b506105566112f2565b3480156107c757600080fd5b506105566107d6366004613692565b61135d565b3480156107e757600080fd5b50610556611448565b3480156107fc57600080fd5b5061040a60205481565b34801561081257600080fd5b506105566108213660046136cb565b611626565b34801561083257600080fd5b5061045f6108413660046136f7565b6116ca565b34801561085257600080fd5b5061040a60065481565b34801561086857600080fd5b506105566118d3565b34801561087d57600080fd5b506005546001600160a01b031661048f565b34801561089b57600080fd5b50610432611995565b3480156108b057600080fd5b506105566108bf366004613692565b6119a4565b3480156108d057600080fd5b5061045f6108df366004613442565b611a7f565b3480156108f057600080fd5b5061045f6108ff366004613442565b611b18565b34801561091057600080fd5b5061040a60085481565b34801561092657600080fd5b5061045f61093536600461346e565b60236020526000908152604090205460ff1681565b34801561095657600080fd5b5061040a601a5481565b34801561096c57600080fd5b50600f5461045f90610100900460ff1681565b34801561098b57600080fd5b5061055661099a36600461366b565b611b25565b3480156109ab57600080fd5b506105566109ba366004613692565b611c5b565b3480156109cb57600080fd5b506105566109da3660046136cb565b611ce4565b3480156109eb57600080fd5b506105566109fa36600461366b565b611d88565b348015610a0b57600080fd5b50600c5461048f906001600160a01b031681565b348015610a2b57600080fd5b50610556611e91565b348015610a4057600080fd5b5060115461045f9060ff1681565b348015610a5a57600080fd5b5061040a601c5481565b348015610a7057600080fd5b50610556610a7f36600461366b565b611efa565b348015610a9057600080fd5b5061040a60125481565b348015610aa657600080fd5b50610556610ab536600461366b565b612045565b348015610ac657600080fd5b5061040a610ad53660046136f7565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b0c57600080fd5b5061040a600a5481565b348015610b2257600080fd5b5061055661214c565b348015610b3757600080fd5b5061040a600e5481565b348015610b4d57600080fd5b5061040a601e5481565b348015610b6357600080fd5b5061040a60145481565b348015610b7957600080fd5b50610556610b8836600461346e565b612182565b348015610b9957600080fd5b5061055661226d565b348015610bae57600080fd5b5061040a60185481565b348015610bc457600080fd5b50601f5461045f9060ff1681565b606060038054610be190613725565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0d90613725565b8015610c5a5780601f10610c2f57610100808354040283529160200191610c5a565b820191906000526020600020905b815481529060010190602001808311610c3d57829003601f168201915b5050505050905090565b6000610c713384846122e4565b5060015b92915050565b6005546001600160a01b03163314610cae5760405162461bcd60e51b8152600401610ca59061375f565b60405180910390fd5b8051825114610cff5760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610ca5565b60c8825110610d6f5760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203230302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610ca5565b60005b8251811015610dea576000838281518110610d8f57610d8f613794565b602002602001015190506000838381518110610dad57610dad613794565b6020026020010151670de0b6b3a7640000610dc891906137c0565b9050610dd5338383612408565b50508080610de2906137df565b915050610d72565b505050565b6000610dfc848484612408565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610e815760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ca5565b610e8e85338584036122e4565b506001949350505050565b6005546001600160a01b03163314610ec35760405162461bcd60e51b8152600401610ca59061375f565b670de0b6b3a76400006103e8610ed860025490565b610ee39060016137c0565b610eed91906137f8565b610ef791906137f8565b811015610f585760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e312560b81b6064820152608401610ca5565b610f6a81670de0b6b3a76400006137c0565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c71918590610fdd90869061381a565b6122e4565b6005546001600160a01b0316331461100c5760405162461bcd60e51b8152600401610ca59061375f565b6001600160a01b0381166110585760405162461bcd60e51b81526020600482015260136024820152720616464726573732063616e6e6f74206265203606c1b6044820152606401610ca5565b600d80546001600160a01b0319166001600160a01b0383169081179091556040517f217742673c85d2f459a37c99960c860122cdadf529374b41418d2718cae7726f90600090a250565b6005546001600160a01b031633146110cc5760405162461bcd60e51b8152600401610ca59061375f565b6001600160a01b0381166111355760405162461bcd60e51b815260206004820152602a60248201527f5f7375737461696e6162696c69747941646472657373206164647265737320636044820152690616e6e6f7420626520360b41b6064820152608401610ca5565b600b80546001600160a01b0319166001600160a01b0383169081179091556040517ff275628a8150470f5bc4173968b31817ea7169e8565b3d26875b0f068892317790600090a250565b6005546001600160a01b031633146111a95760405162461bcd60e51b8152600401610ca59061375f565b6001600160a01b03811661120b5760405162461bcd60e51b8152602060048201526024808201527f5f74726561737572794164647265737320616464726573732063616e6e6f74206044820152630626520360e41b6064820152608401610ca5565b600c80546001600160a01b0319166001600160a01b0383169081179091556040517f2e1e696cfb265fa16e1170d24ef04cb2262772bde00ecf34d80bae6722487b7f90600090a250565b601f5460009060ff161561127857601e54601d54611273919061381a565b905090565b50600090565b6005546001600160a01b031633146112a85760405162461bcd60e51b8152600401610ca59061375f565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b0316331461131c5760405162461bcd60e51b8152600401610ca59061375f565b600f805460ff199081169091556011805490911690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b031633146113875760405162461bcd60e51b8152600401610ca59061375f565b8061141d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361141d5760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610ca5565b6001600160a01b03919091166000908152602260205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146114725760405162461bcd60e51b8152600401610ca59061375f565b61147a611255565b42101580156114905750600061148e611255565b115b6114d55760405162461bcd60e51b815260206004820152601660248201527526bab9ba103932b8bab2b9ba1030b732103bb0b4ba1760511b6044820152606401610ca5565b6000601d819055601f805460ff191690556020546040516370a0823160e01b8152306004820152606491907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611551573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611575919061382d565b61157f91906137c0565b61158991906137f8565b600060205560405163a9059cbb60e01b8152336004820152602481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af11580156115fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116229190613846565b5050565b6005546001600160a01b031633146116505760405162461bcd60e51b8152600401610ca59061375f565b6013839055601482905560158190558061166a838561381a565b611674919061381a565b60128190556103e81015610dea5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610ca5565b6005546000906001600160a01b031633146116f75760405162461bcd60e51b8152600401610ca59061375f565b6001600160a01b03831661174d5760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610ca5565b306001600160a01b038416036117a55760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e73000000006044820152606401610ca5565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa1580156117ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611810919061382d565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af1158015611863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118879190613846565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6005546001600160a01b031633146118fd5760405162461bcd60e51b8152600401610ca59061375f565b600f54610100900460ff16156119555760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610ca5565b600f805462ffff0019166201010017905543600e556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a1565b606060048054610be190613725565b6005546001600160a01b031633146119ce5760405162461bcd60e51b8152600401610ca59061375f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611a755760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610ca5565b6116228282612d09565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611b015760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ca5565b611b0e33858584036122e4565b5060019392505050565b6000610c71338484612408565b6005546001600160a01b03163314611b4f5760405162461bcd60e51b8152600401610ca59061375f565b601f5460ff1615611bbc5760405162461bcd60e51b815260206004820152603160248201527f43616e6e6f74207265717565737420616761696e20756e74696c206669727374604482015270103932b8bab2b9ba1034b99037bb32b91760791b6064820152608401610ca5565b60648111158015611bcd5750600081115b611c195760405162461bcd60e51b815260206004820152601a60248201527f4e65656420746f20736574206265747765656e20312d313030250000000000006044820152606401610ca5565b42601d55601f805460ff1916600117905560208190556040517fd99a77b2f3951cd076e75814e44db497e6abc203dd251329da0b62c288f9f48b90600090a150565b6005546001600160a01b03163314611c855760405162461bcd60e51b8152600401610ca59061375f565b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314611d0e5760405162461bcd60e51b8152600401610ca59061375f565b60178390556018829055601981905580611d28838561381a565b611d32919061381a565b60168190556103e81015610dea5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610ca5565b6005546001600160a01b03163314611db25760405162461bcd60e51b8152600401610ca59061375f565b670de0b6b3a76400006103e8611dc760025490565b611dd29060056137c0565b611ddc91906137f8565b611de691906137f8565b811015611e4a5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e352560a01b6064820152608401610ca5565b611e5c81670de0b6b3a76400006137c0565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc90602001610f9b565b6005546001600160a01b03163314611ebb5760405162461bcd60e51b8152600401610ca59061375f565b601f805460ff1916905560006020819055601d8190556040517ffbcc1c208c9c4d1d9f557267b55c5ae316e74ce676a0db72ef18c6d5f5767c619190a1565b6005546001600160a01b03163314611f245760405162461bcd60e51b8152600401610ca59061375f565b620186a0611f3160025490565b611f3c9060016137c0565b611f4691906137f8565b811015611fb35760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610ca5565b6103e8611fbf60025490565b611fca9060016137c0565b611fd491906137f8565b8111156120405760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610ca5565b600a55565b6005546001600160a01b0316331461206f5760405162461bcd60e51b8152600401610ca59061375f565b670de0b6b3a76400006103e861208460025490565b61208f9060016137c0565b61209991906137f8565b6120a391906137f8565b8110156121055760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e312560b01b6064820152608401610ca5565b61211781670de0b6b3a76400006137c0565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e90602001610f9b565b6005546001600160a01b031633146121765760405162461bcd60e51b8152600401610ca59061375f565b6011805460ff19169055565b6005546001600160a01b031633146121ac5760405162461bcd60e51b8152600401610ca59061375f565b6001600160a01b0381166122115760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ca5565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146122975760405162461bcd60e51b8152600401610ca59061375f565b604051600090339047908381818185875af1925050503d80600081146122d9576040519150601f19603f3d011682016040523d82523d6000602084013e6122de565b606091505b50505050565b6001600160a01b0383166123465760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ca5565b6001600160a01b0382166123a75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ca5565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661242e5760405162461bcd60e51b8152600401610ca590613863565b6001600160a01b0382166124545760405162461bcd60e51b8152600401610ca5906138a8565b600081116124a45760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610ca5565b600f5460ff1615612978576005546001600160a01b038481169116148015906124db57506005546001600160a01b03838116911614155b80156124ef57506001600160a01b03821615155b801561250657506001600160a01b03821661dead14155b1561297857600f54610100900460ff1661259e576001600160a01b03831660009081526021602052604090205460ff168061255957506001600160a01b03821660009081526021602052604090205460ff165b61259e5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610ca5565b60115460ff16156126fa577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415801561261d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b156126fa5761262d6004436138eb565b3260009081526010602052604090205410801561266b57506126506004436138eb565b6001600160a01b038316600090815260106020526040902054105b6126d55760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610ca5565b3260009081526010602052604080822043908190556001600160a01b03851683529120555b6001600160a01b03831660009081526023602052604090205460ff16801561273b57506001600160a01b03821660009081526022602052604090205460ff16155b15612817576006548111156127a35760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610ca5565b6008546001600160a01b0383166000908152602081905260409020546127c9908361381a565b11156128125760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610ca5565b612978565b6001600160a01b03821660009081526023602052604090205460ff16801561285857506001600160a01b03831660009081526022602052604090205460ff16155b156128c2576007548111156128125760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610ca5565b6001600160a01b03821660009081526022602052604090205460ff1615801561290457506001600160a01b03831660009081526022602052604090205460ff16155b15612978576008546001600160a01b03831660009081526020819052604090205461292f908361381a565b11156129785760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610ca5565b30600090815260208190526040902054600a54811080159081906129a45750600f5462010000900460ff165b80156129b3575060095460ff16155b80156129d857506001600160a01b03851660009081526023602052604090205460ff16155b80156129fd57506001600160a01b03851660009081526021602052604090205460ff16155b8015612a2257506001600160a01b03841660009081526021602052604090205460ff16155b15612a47576009805460ff19166001179055612a3c612d73565b6009805460ff191690555b6001600160a01b03851660009081526021602052604090205460019060ff1680612a8957506001600160a01b03851660009081526021602052604090205460ff165b15612a92575060005b6000808215612cf457612aa643600161381a565b600e5410158015612acf57506001600160a01b03881660009081526023602052604090205460ff165b15612b0b576064612ae18760636137c0565b612aeb91906137f8565b600b54909150612b069089906001600160a01b031683612f7e565b612ccc565b6001600160a01b03871660009081526023602052604090205460ff168015612b3557506000601654115b15612bee5761271060165487612b4b91906137c0565b612b5591906137f8565b915060165460185483612b6891906137c0565b612b7291906137f8565b601b6000828254612b83919061381a565b9091555050601654601754612b9890846137c0565b612ba291906137f8565b601a6000828254612bb3919061381a565b9091555050601654601954612bc890846137c0565b612bd291906137f8565b601c6000828254612be3919061381a565b90915550612ccc9050565b6001600160a01b03881660009081526023602052604090205460ff168015612c1857506000601254115b15612ccc5761271060125487612c2e91906137c0565b612c3891906137f8565b915060125460145483612c4b91906137c0565b612c5591906137f8565b601b6000828254612c66919061381a565b9091555050601254601354612c7b90846137c0565b612c8591906137f8565b601a6000828254612c96919061381a565b9091555050601254601554612cab90846137c0565b612cb591906137f8565b601c6000828254612cc6919061381a565b90915550505b8115612cdd57612cdd883084612f7e565b612ce7818361381a565b612cf190876138eb565b95505b612cff888888612f7e565b5050505050505050565b6001600160a01b0382166000908152602360205260409020805460ff1916821515179055612d3782826130d3565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b3060009081526020819052604081205490506000601c54601a54601b54612d9a919061381a565b612da4919061381a565b9050811580612db1575080155b15612dba575050565b600a8054612dc7916137c0565b821115612dde57600a8054612ddb916137c0565b91505b600080600283601b5486612df291906137c0565b612dfc91906137f8565b612e0691906137f8565b9050612e1a612e1582866138eb565b613136565b601b5447908190600090612e30906002906137f8565b612e3a90876138eb565b601a54612e4790856137c0565b612e5191906137f8565b905060006002601b54612e6491906137f8565b612e6e90886138eb565b601c54612e7b90866137c0565b612e8591906137f8565b9050612e91818361381a565b612e9b90846138eb565b6000601b819055601a819055601c5592508415801590612ebb5750600083115b15612eca57612eca85846132f6565b600c546040516001600160a01b03909116908290600081818185875af1925050503d8060008114612f17576040519150601f19603f3d011682016040523d82523d6000602084013e612f1c565b606091505b5050600b546040519197506001600160a01b0316904790600081818185875af1925050503d8060008114612f6c576040519150601f19603f3d011682016040523d82523d6000602084013e612f71565b606091505b5050505050505050505050565b6001600160a01b038316612fa45760405162461bcd60e51b8152600401610ca590613863565b6001600160a01b038216612fca5760405162461bcd60e51b8152600401610ca5906138a8565b6001600160a01b038316600090815260208190526040902054818110156130425760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ca5565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061307990849061381a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516130c591815260200190565b60405180910390a350505050565b6001600160a01b038216600081815260226020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061316b5761316b613794565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061320d91906138fe565b8160018151811061322057613220613794565b60200260200101906001600160a01b031690816001600160a01b03168152505061326b307f0000000000000000000000000000000000000000000000000000000000000000846122e4565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906132c090859060009086903090429060040161391b565b600060405180830381600087803b1580156132da57600080fd5b505af11580156132ee573d6000803e3d6000fd5b505050505050565b613321307f0000000000000000000000000000000000000000000000000000000000000000846122e4565b600d5460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000009091169063f305d71990839060c40160606040518083038185885af11580156133b0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906133d5919061398c565b5050505050565b600060208083528351808285015260005b81811015613409578581018301518582016040015282016133ed565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461343f57600080fd5b50565b6000806040838503121561345557600080fd5b82356134608161342a565b946020939093013593505050565b60006020828403121561348057600080fd5b813561348b8161342a565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156134d1576134d1613492565b604052919050565b600067ffffffffffffffff8211156134f3576134f3613492565b5060051b60200190565b600082601f83011261350e57600080fd5b8135602061352361351e836134d9565b6134a8565b82815260059290921b8401810191818101908684111561354257600080fd5b8286015b8481101561355d5780358352918301918301613546565b509695505050505050565b6000806040838503121561357b57600080fd5b823567ffffffffffffffff8082111561359357600080fd5b818501915085601f8301126135a757600080fd5b813560206135b761351e836134d9565b82815260059290921b840181019181810190898411156135d657600080fd5b948201945b838610156135fd5785356135ee8161342a565b825294820194908201906135db565b9650508601359250508082111561361357600080fd5b50613620858286016134fd565b9150509250929050565b60008060006060848603121561363f57600080fd5b833561364a8161342a565b9250602084013561365a8161342a565b929592945050506040919091013590565b60006020828403121561367d57600080fd5b5035919050565b801515811461343f57600080fd5b600080604083850312156136a557600080fd5b82356136b08161342a565b915060208301356136c081613684565b809150509250929050565b6000806000606084860312156136e057600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561370a57600080fd5b82356137158161342a565b915060208301356136c08161342a565b600181811c9082168061373957607f821691505b60208210810361375957634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156137da576137da6137aa565b500290565b6000600182016137f1576137f16137aa565b5060010190565b60008261381557634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610c7557610c756137aa565b60006020828403121561383f57600080fd5b5051919050565b60006020828403121561385857600080fd5b815161348b81613684565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610c7557610c756137aa565b60006020828403121561391057600080fd5b815161348b8161342a565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561396b5784516001600160a01b031683529383019391830191600101613946565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156139a157600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220267fd8fd4d78136583d28ab77cac279254a41a949bb76a71fc9bee69c134f64364736f6c634300081000334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0

Deployed Bytecode

0x6080604052600436106103e85760003560e01c80638095d56411610208578063c5f956af11610118578063e2f45605116100ab578063f11a24d31161007a578063f11a24d314610b57578063f2fde38b14610b6d578063f5648a4f14610b8d578063f637434214610ba2578063fd361d0e14610bb857600080fd5b8063e2f4560514610b00578063e884f26014610b16578063ee40166e14610b2b578063ee44b44e14610b4157600080fd5b8063d257b34f116100e7578063d257b34f14610a64578063d85ba06314610a84578063dc3f0d0f14610a9a578063dd62ed3e14610aba57600080fd5b8063c5f956af146109ff578063c7c61e2c14610a1f578063c876d0b914610a34578063cc2ffe7c14610a4e57600080fd5b8063a9059cbb1161019b578063bbc0c7421161016a578063bbc0c74214610960578063befd2fac1461097f578063c02466681461099f578063c17b5b8c146109bf578063c18bc195146109df57600080fd5b8063a9059cbb146108e4578063aa4bde2814610904578063b62496f51461091a578063b691124e1461094a57600080fd5b80638da5cb5b116101d75780638da5cb5b1461087157806395d89b411461088f5780639a7a23d6146108a4578063a457c2d7146108c457600080fd5b80638095d564146108065780638366e79a1461082657806388e765ff146108465780638a8c523c1461085c57600080fd5b80634a62bb65116103035780636b2fb12411610296578063715018a611610265578063715018a614610791578063751039fc146107a65780637571336a146107bb578063763cef49146107db578063783102eb146107f057600080fd5b80636b2fb124146107105780636ddd17131461072657806370a0823114610746578063712c29851461077c57600080fd5b8063639e7e68116102d2578063639e7e68146106a45780636605bfda146106c457806366d602ae146106e45780636a486a8e146106fa57600080fd5b80634a62bb651461063e5780634b6b251414610658578063525fa81f1461066e5780635c068a8c1461068e57600080fd5b80632307b4411161037b5780633221c93f1161034a5780633221c93f146105b4578063379a2bf2146105d457806339509351146105ea57806349bd5a5e1461060a57600080fd5b80632307b4411461053657806323b872dd146105585780632be32b6114610578578063313ce5671461059857600080fd5b806310d5de53116103b757806310d5de53146104a75780631694505e146104d757806318160ddd1461050b5780631a8145bb1461052057600080fd5b8063058054c9146103f457806306fdde031461041d578063095ea7b31461043f57806309b021a81461046f57600080fd5b366103ef57005b600080fd5b34801561040057600080fd5b5061040a601d5481565b6040519081526020015b60405180910390f35b34801561042957600080fd5b50610432610bd2565b60405161041491906133dc565b34801561044b57600080fd5b5061045f61045a366004613442565b610c64565b6040519015158152602001610414565b34801561047b57600080fd5b50600b5461048f906001600160a01b031681565b6040516001600160a01b039091168152602001610414565b3480156104b357600080fd5b5061045f6104c236600461346e565b60226020526000908152604090205460ff1681565b3480156104e357600080fd5b5061048f7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561051757600080fd5b5060025461040a565b34801561052c57600080fd5b5061040a601b5481565b34801561054257600080fd5b50610556610551366004613568565b610c7b565b005b34801561056457600080fd5b5061045f61057336600461362a565b610def565b34801561058457600080fd5b5061055661059336600461366b565b610e99565b3480156105a457600080fd5b5060405160128152602001610414565b3480156105c057600080fd5b50600d5461048f906001600160a01b031681565b3480156105e057600080fd5b5061040a60135481565b3480156105f657600080fd5b5061045f610605366004613442565b610fa6565b34801561061657600080fd5b5061048f7f00000000000000000000000037109070391ad7cee96cbc388de1c2a7e52dc0e381565b34801561064a57600080fd5b50600f5461045f9060ff1681565b34801561066457600080fd5b5061040a60175481565b34801561067a57600080fd5b5061055661068936600461346e565b610fe2565b34801561069a57600080fd5b5061040a60155481565b3480156106b057600080fd5b506105566106bf36600461346e565b6110a2565b3480156106d057600080fd5b506105566106df36600461346e565b61117f565b3480156106f057600080fd5b5061040a60075481565b34801561070657600080fd5b5061040a60165481565b34801561071c57600080fd5b5061040a60195481565b34801561073257600080fd5b50600f5461045f9062010000900460ff1681565b34801561075257600080fd5b5061040a61076136600461346e565b6001600160a01b031660009081526020819052604090205490565b34801561078857600080fd5b5061040a611255565b34801561079d57600080fd5b5061055661127e565b3480156107b257600080fd5b506105566112f2565b3480156107c757600080fd5b506105566107d6366004613692565b61135d565b3480156107e757600080fd5b50610556611448565b3480156107fc57600080fd5b5061040a60205481565b34801561081257600080fd5b506105566108213660046136cb565b611626565b34801561083257600080fd5b5061045f6108413660046136f7565b6116ca565b34801561085257600080fd5b5061040a60065481565b34801561086857600080fd5b506105566118d3565b34801561087d57600080fd5b506005546001600160a01b031661048f565b34801561089b57600080fd5b50610432611995565b3480156108b057600080fd5b506105566108bf366004613692565b6119a4565b3480156108d057600080fd5b5061045f6108df366004613442565b611a7f565b3480156108f057600080fd5b5061045f6108ff366004613442565b611b18565b34801561091057600080fd5b5061040a60085481565b34801561092657600080fd5b5061045f61093536600461346e565b60236020526000908152604090205460ff1681565b34801561095657600080fd5b5061040a601a5481565b34801561096c57600080fd5b50600f5461045f90610100900460ff1681565b34801561098b57600080fd5b5061055661099a36600461366b565b611b25565b3480156109ab57600080fd5b506105566109ba366004613692565b611c5b565b3480156109cb57600080fd5b506105566109da3660046136cb565b611ce4565b3480156109eb57600080fd5b506105566109fa36600461366b565b611d88565b348015610a0b57600080fd5b50600c5461048f906001600160a01b031681565b348015610a2b57600080fd5b50610556611e91565b348015610a4057600080fd5b5060115461045f9060ff1681565b348015610a5a57600080fd5b5061040a601c5481565b348015610a7057600080fd5b50610556610a7f36600461366b565b611efa565b348015610a9057600080fd5b5061040a60125481565b348015610aa657600080fd5b50610556610ab536600461366b565b612045565b348015610ac657600080fd5b5061040a610ad53660046136f7565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b0c57600080fd5b5061040a600a5481565b348015610b2257600080fd5b5061055661214c565b348015610b3757600080fd5b5061040a600e5481565b348015610b4d57600080fd5b5061040a601e5481565b348015610b6357600080fd5b5061040a60145481565b348015610b7957600080fd5b50610556610b8836600461346e565b612182565b348015610b9957600080fd5b5061055661226d565b348015610bae57600080fd5b5061040a60185481565b348015610bc457600080fd5b50601f5461045f9060ff1681565b606060038054610be190613725565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0d90613725565b8015610c5a5780601f10610c2f57610100808354040283529160200191610c5a565b820191906000526020600020905b815481529060010190602001808311610c3d57829003601f168201915b5050505050905090565b6000610c713384846122e4565b5060015b92915050565b6005546001600160a01b03163314610cae5760405162461bcd60e51b8152600401610ca59061375f565b60405180910390fd5b8051825114610cff5760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610ca5565b60c8825110610d6f5760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203230302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610ca5565b60005b8251811015610dea576000838281518110610d8f57610d8f613794565b602002602001015190506000838381518110610dad57610dad613794565b6020026020010151670de0b6b3a7640000610dc891906137c0565b9050610dd5338383612408565b50508080610de2906137df565b915050610d72565b505050565b6000610dfc848484612408565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610e815760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ca5565b610e8e85338584036122e4565b506001949350505050565b6005546001600160a01b03163314610ec35760405162461bcd60e51b8152600401610ca59061375f565b670de0b6b3a76400006103e8610ed860025490565b610ee39060016137c0565b610eed91906137f8565b610ef791906137f8565b811015610f585760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e312560b81b6064820152608401610ca5565b610f6a81670de0b6b3a76400006137c0565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c71918590610fdd90869061381a565b6122e4565b6005546001600160a01b0316331461100c5760405162461bcd60e51b8152600401610ca59061375f565b6001600160a01b0381166110585760405162461bcd60e51b81526020600482015260136024820152720616464726573732063616e6e6f74206265203606c1b6044820152606401610ca5565b600d80546001600160a01b0319166001600160a01b0383169081179091556040517f217742673c85d2f459a37c99960c860122cdadf529374b41418d2718cae7726f90600090a250565b6005546001600160a01b031633146110cc5760405162461bcd60e51b8152600401610ca59061375f565b6001600160a01b0381166111355760405162461bcd60e51b815260206004820152602a60248201527f5f7375737461696e6162696c69747941646472657373206164647265737320636044820152690616e6e6f7420626520360b41b6064820152608401610ca5565b600b80546001600160a01b0319166001600160a01b0383169081179091556040517ff275628a8150470f5bc4173968b31817ea7169e8565b3d26875b0f068892317790600090a250565b6005546001600160a01b031633146111a95760405162461bcd60e51b8152600401610ca59061375f565b6001600160a01b03811661120b5760405162461bcd60e51b8152602060048201526024808201527f5f74726561737572794164647265737320616464726573732063616e6e6f74206044820152630626520360e41b6064820152608401610ca5565b600c80546001600160a01b0319166001600160a01b0383169081179091556040517f2e1e696cfb265fa16e1170d24ef04cb2262772bde00ecf34d80bae6722487b7f90600090a250565b601f5460009060ff161561127857601e54601d54611273919061381a565b905090565b50600090565b6005546001600160a01b031633146112a85760405162461bcd60e51b8152600401610ca59061375f565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b0316331461131c5760405162461bcd60e51b8152600401610ca59061375f565b600f805460ff199081169091556011805490911690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b031633146113875760405162461bcd60e51b8152600401610ca59061375f565b8061141d577f00000000000000000000000037109070391ad7cee96cbc388de1c2a7e52dc0e36001600160a01b0316826001600160a01b03160361141d5760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610ca5565b6001600160a01b03919091166000908152602260205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146114725760405162461bcd60e51b8152600401610ca59061375f565b61147a611255565b42101580156114905750600061148e611255565b115b6114d55760405162461bcd60e51b815260206004820152601660248201527526bab9ba103932b8bab2b9ba1030b732103bb0b4ba1760511b6044820152606401610ca5565b6000601d819055601f805460ff191690556020546040516370a0823160e01b8152306004820152606491907f00000000000000000000000037109070391ad7cee96cbc388de1c2a7e52dc0e36001600160a01b0316906370a0823190602401602060405180830381865afa158015611551573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611575919061382d565b61157f91906137c0565b61158991906137f8565b600060205560405163a9059cbb60e01b8152336004820152602481018290529091507f00000000000000000000000037109070391ad7cee96cbc388de1c2a7e52dc0e36001600160a01b03169063a9059cbb906044016020604051808303816000875af11580156115fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116229190613846565b5050565b6005546001600160a01b031633146116505760405162461bcd60e51b8152600401610ca59061375f565b6013839055601482905560158190558061166a838561381a565b611674919061381a565b60128190556103e81015610dea5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610ca5565b6005546000906001600160a01b031633146116f75760405162461bcd60e51b8152600401610ca59061375f565b6001600160a01b03831661174d5760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610ca5565b306001600160a01b038416036117a55760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e73000000006044820152606401610ca5565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa1580156117ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611810919061382d565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af1158015611863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118879190613846565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6005546001600160a01b031633146118fd5760405162461bcd60e51b8152600401610ca59061375f565b600f54610100900460ff16156119555760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610ca5565b600f805462ffff0019166201010017905543600e556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a1565b606060048054610be190613725565b6005546001600160a01b031633146119ce5760405162461bcd60e51b8152600401610ca59061375f565b7f00000000000000000000000037109070391ad7cee96cbc388de1c2a7e52dc0e36001600160a01b0316826001600160a01b031603611a755760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610ca5565b6116228282612d09565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611b015760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ca5565b611b0e33858584036122e4565b5060019392505050565b6000610c71338484612408565b6005546001600160a01b03163314611b4f5760405162461bcd60e51b8152600401610ca59061375f565b601f5460ff1615611bbc5760405162461bcd60e51b815260206004820152603160248201527f43616e6e6f74207265717565737420616761696e20756e74696c206669727374604482015270103932b8bab2b9ba1034b99037bb32b91760791b6064820152608401610ca5565b60648111158015611bcd5750600081115b611c195760405162461bcd60e51b815260206004820152601a60248201527f4e65656420746f20736574206265747765656e20312d313030250000000000006044820152606401610ca5565b42601d55601f805460ff1916600117905560208190556040517fd99a77b2f3951cd076e75814e44db497e6abc203dd251329da0b62c288f9f48b90600090a150565b6005546001600160a01b03163314611c855760405162461bcd60e51b8152600401610ca59061375f565b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314611d0e5760405162461bcd60e51b8152600401610ca59061375f565b60178390556018829055601981905580611d28838561381a565b611d32919061381a565b60168190556103e81015610dea5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610ca5565b6005546001600160a01b03163314611db25760405162461bcd60e51b8152600401610ca59061375f565b670de0b6b3a76400006103e8611dc760025490565b611dd29060056137c0565b611ddc91906137f8565b611de691906137f8565b811015611e4a5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e352560a01b6064820152608401610ca5565b611e5c81670de0b6b3a76400006137c0565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc90602001610f9b565b6005546001600160a01b03163314611ebb5760405162461bcd60e51b8152600401610ca59061375f565b601f805460ff1916905560006020819055601d8190556040517ffbcc1c208c9c4d1d9f557267b55c5ae316e74ce676a0db72ef18c6d5f5767c619190a1565b6005546001600160a01b03163314611f245760405162461bcd60e51b8152600401610ca59061375f565b620186a0611f3160025490565b611f3c9060016137c0565b611f4691906137f8565b811015611fb35760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610ca5565b6103e8611fbf60025490565b611fca9060016137c0565b611fd491906137f8565b8111156120405760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610ca5565b600a55565b6005546001600160a01b0316331461206f5760405162461bcd60e51b8152600401610ca59061375f565b670de0b6b3a76400006103e861208460025490565b61208f9060016137c0565b61209991906137f8565b6120a391906137f8565b8110156121055760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e312560b01b6064820152608401610ca5565b61211781670de0b6b3a76400006137c0565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e90602001610f9b565b6005546001600160a01b031633146121765760405162461bcd60e51b8152600401610ca59061375f565b6011805460ff19169055565b6005546001600160a01b031633146121ac5760405162461bcd60e51b8152600401610ca59061375f565b6001600160a01b0381166122115760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ca5565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146122975760405162461bcd60e51b8152600401610ca59061375f565b604051600090339047908381818185875af1925050503d80600081146122d9576040519150601f19603f3d011682016040523d82523d6000602084013e6122de565b606091505b50505050565b6001600160a01b0383166123465760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ca5565b6001600160a01b0382166123a75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ca5565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661242e5760405162461bcd60e51b8152600401610ca590613863565b6001600160a01b0382166124545760405162461bcd60e51b8152600401610ca5906138a8565b600081116124a45760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610ca5565b600f5460ff1615612978576005546001600160a01b038481169116148015906124db57506005546001600160a01b03838116911614155b80156124ef57506001600160a01b03821615155b801561250657506001600160a01b03821661dead14155b1561297857600f54610100900460ff1661259e576001600160a01b03831660009081526021602052604090205460ff168061255957506001600160a01b03821660009081526021602052604090205460ff165b61259e5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610ca5565b60115460ff16156126fa577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b03161415801561261d57507f00000000000000000000000037109070391ad7cee96cbc388de1c2a7e52dc0e36001600160a01b0316826001600160a01b031614155b156126fa5761262d6004436138eb565b3260009081526010602052604090205410801561266b57506126506004436138eb565b6001600160a01b038316600090815260106020526040902054105b6126d55760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610ca5565b3260009081526010602052604080822043908190556001600160a01b03851683529120555b6001600160a01b03831660009081526023602052604090205460ff16801561273b57506001600160a01b03821660009081526022602052604090205460ff16155b15612817576006548111156127a35760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610ca5565b6008546001600160a01b0383166000908152602081905260409020546127c9908361381a565b11156128125760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610ca5565b612978565b6001600160a01b03821660009081526023602052604090205460ff16801561285857506001600160a01b03831660009081526022602052604090205460ff16155b156128c2576007548111156128125760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610ca5565b6001600160a01b03821660009081526022602052604090205460ff1615801561290457506001600160a01b03831660009081526022602052604090205460ff16155b15612978576008546001600160a01b03831660009081526020819052604090205461292f908361381a565b11156129785760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610ca5565b30600090815260208190526040902054600a54811080159081906129a45750600f5462010000900460ff165b80156129b3575060095460ff16155b80156129d857506001600160a01b03851660009081526023602052604090205460ff16155b80156129fd57506001600160a01b03851660009081526021602052604090205460ff16155b8015612a2257506001600160a01b03841660009081526021602052604090205460ff16155b15612a47576009805460ff19166001179055612a3c612d73565b6009805460ff191690555b6001600160a01b03851660009081526021602052604090205460019060ff1680612a8957506001600160a01b03851660009081526021602052604090205460ff165b15612a92575060005b6000808215612cf457612aa643600161381a565b600e5410158015612acf57506001600160a01b03881660009081526023602052604090205460ff165b15612b0b576064612ae18760636137c0565b612aeb91906137f8565b600b54909150612b069089906001600160a01b031683612f7e565b612ccc565b6001600160a01b03871660009081526023602052604090205460ff168015612b3557506000601654115b15612bee5761271060165487612b4b91906137c0565b612b5591906137f8565b915060165460185483612b6891906137c0565b612b7291906137f8565b601b6000828254612b83919061381a565b9091555050601654601754612b9890846137c0565b612ba291906137f8565b601a6000828254612bb3919061381a565b9091555050601654601954612bc890846137c0565b612bd291906137f8565b601c6000828254612be3919061381a565b90915550612ccc9050565b6001600160a01b03881660009081526023602052604090205460ff168015612c1857506000601254115b15612ccc5761271060125487612c2e91906137c0565b612c3891906137f8565b915060125460145483612c4b91906137c0565b612c5591906137f8565b601b6000828254612c66919061381a565b9091555050601254601354612c7b90846137c0565b612c8591906137f8565b601a6000828254612c96919061381a565b9091555050601254601554612cab90846137c0565b612cb591906137f8565b601c6000828254612cc6919061381a565b90915550505b8115612cdd57612cdd883084612f7e565b612ce7818361381a565b612cf190876138eb565b95505b612cff888888612f7e565b5050505050505050565b6001600160a01b0382166000908152602360205260409020805460ff1916821515179055612d3782826130d3565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b3060009081526020819052604081205490506000601c54601a54601b54612d9a919061381a565b612da4919061381a565b9050811580612db1575080155b15612dba575050565b600a8054612dc7916137c0565b821115612dde57600a8054612ddb916137c0565b91505b600080600283601b5486612df291906137c0565b612dfc91906137f8565b612e0691906137f8565b9050612e1a612e1582866138eb565b613136565b601b5447908190600090612e30906002906137f8565b612e3a90876138eb565b601a54612e4790856137c0565b612e5191906137f8565b905060006002601b54612e6491906137f8565b612e6e90886138eb565b601c54612e7b90866137c0565b612e8591906137f8565b9050612e91818361381a565b612e9b90846138eb565b6000601b819055601a819055601c5592508415801590612ebb5750600083115b15612eca57612eca85846132f6565b600c546040516001600160a01b03909116908290600081818185875af1925050503d8060008114612f17576040519150601f19603f3d011682016040523d82523d6000602084013e612f1c565b606091505b5050600b546040519197506001600160a01b0316904790600081818185875af1925050503d8060008114612f6c576040519150601f19603f3d011682016040523d82523d6000602084013e612f71565b606091505b5050505050505050505050565b6001600160a01b038316612fa45760405162461bcd60e51b8152600401610ca590613863565b6001600160a01b038216612fca5760405162461bcd60e51b8152600401610ca5906138a8565b6001600160a01b038316600090815260208190526040902054818110156130425760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ca5565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061307990849061381a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516130c591815260200190565b60405180910390a350505050565b6001600160a01b038216600081815260226020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061316b5761316b613794565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061320d91906138fe565b8160018151811061322057613220613794565b60200260200101906001600160a01b031690816001600160a01b03168152505061326b307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846122e4565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906132c090859060009086903090429060040161391b565b600060405180830381600087803b1580156132da57600080fd5b505af11580156132ee573d6000803e3d6000fd5b505050505050565b613321307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846122e4565b600d5460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063f305d71990839060c40160606040518083038185885af11580156133b0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906133d5919061398c565b5050505050565b600060208083528351808285015260005b81811015613409578581018301518582016040015282016133ed565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461343f57600080fd5b50565b6000806040838503121561345557600080fd5b82356134608161342a565b946020939093013593505050565b60006020828403121561348057600080fd5b813561348b8161342a565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156134d1576134d1613492565b604052919050565b600067ffffffffffffffff8211156134f3576134f3613492565b5060051b60200190565b600082601f83011261350e57600080fd5b8135602061352361351e836134d9565b6134a8565b82815260059290921b8401810191818101908684111561354257600080fd5b8286015b8481101561355d5780358352918301918301613546565b509695505050505050565b6000806040838503121561357b57600080fd5b823567ffffffffffffffff8082111561359357600080fd5b818501915085601f8301126135a757600080fd5b813560206135b761351e836134d9565b82815260059290921b840181019181810190898411156135d657600080fd5b948201945b838610156135fd5785356135ee8161342a565b825294820194908201906135db565b9650508601359250508082111561361357600080fd5b50613620858286016134fd565b9150509250929050565b60008060006060848603121561363f57600080fd5b833561364a8161342a565b9250602084013561365a8161342a565b929592945050506040919091013590565b60006020828403121561367d57600080fd5b5035919050565b801515811461343f57600080fd5b600080604083850312156136a557600080fd5b82356136b08161342a565b915060208301356136c081613684565b809150509250929050565b6000806000606084860312156136e057600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561370a57600080fd5b82356137158161342a565b915060208301356136c08161342a565b600181811c9082168061373957607f821691505b60208210810361375957634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156137da576137da6137aa565b500290565b6000600182016137f1576137f16137aa565b5060010190565b60008261381557634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610c7557610c756137aa565b60006020828403121561383f57600080fd5b5051919050565b60006020828403121561385857600080fd5b815161348b81613684565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610c7557610c756137aa565b60006020828403121561391057600080fd5b815161348b8161342a565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561396b5784516001600160a01b031683529383019391830191600101613946565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156139a157600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220267fd8fd4d78136583d28ab77cac279254a41a949bb76a71fc9bee69c134f64364736f6c63430008100033

Deployed Bytecode Sourcemap

9440:19452:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10743:41;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;10743:41:0;;;;;;;;4078:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4992:169::-;;;;;;;;;;-1:-1:-1;4992:169:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;4992:169:0;1205:187:1;9761:36:0;;;;;;;;;;-1:-1:-1;9761:36:0;;;;-1:-1:-1;;;;;9761:36:0;;;;;;-1:-1:-1;;;;;1561:32:1;;;1543:51;;1531:2;1516:18;9761:36:0;1397:203:1;11075:64:0;;;;;;;;;;-1:-1:-1;11075:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;9594:43;;;;;;;;;;;;;;;4399:108;;;;;;;;;;-1:-1:-1;4487:12:0;;4399:108;;10662:33;;;;;;;;;;;;;;;;16323:617;;;;;;;;;;-1:-1:-1;16323:617:0;;;;;:::i;:::-;;:::i;:::-;;5169:492;;;;;;;;;;-1:-1:-1;5169:492:0;;;;;:::i;:::-;;:::i;14833:269::-;;;;;;;;;;-1:-1:-1;14833:269:0;;;;;:::i;:::-;;:::i;4298:93::-;;;;;;;;;;-1:-1:-1;4298:93:0;;4381:2;5358:36:1;;5346:2;5331:18;4298:93:0;5216:184:1;9841:31:0;;;;;;;;;;-1:-1:-1;9841:31:0;;;;-1:-1:-1;;;;;9841:31:0;;;10345:35;;;;;;;;;;;;;;;;5669:215;;;;;;;;;;-1:-1:-1;5669:215:0;;;;;:::i;:::-;;:::i;9644:38::-;;;;;;;;;;;;;;;9960:33;;;;;;;;;;-1:-1:-1;9960:33:0;;;;;;;;10497:36;;;;;;;;;;;;;;;;27135:271;;;;;;;;;;-1:-1:-1;27135:271:0;;;;;:::i;:::-;;:::i;10424:29::-;;;;;;;;;;;;;;;;26508:329;;;;;;;;;;-1:-1:-1;26508:329:0;;;;;:::i;:::-;;:::i;26845:281::-;;;;;;;;;;-1:-1:-1;26845:281:0;;;;;:::i;:::-;;:::i;9520:28::-;;;;;;;;;;;;;;;;10462;;;;;;;;;;;;;;;;10578:30;;;;;;;;;;;;;;;;10040:31;;;;;;;;;;-1:-1:-1;10040:31:0;;;;;;;;;;;4515:127;;;;;;;;;;-1:-1:-1;4515:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;4616:18:0;4589:7;4616:18;;;;;;;;;;;;4515:127;27871:281;;;;;;;;;;;;;:::i;8159:150::-;;;;;;;;;;;;;:::i;14499:154::-;;;;;;;;;;;;;:::i;16952:267::-;;;;;;;;;;-1:-1:-1;16952:267:0;;;;;:::i;:::-;;:::i;28160:501::-;;;;;;;;;;;;;:::i;10890:31::-;;;;;;;;;;;;;;;;17737:411;;;;;;;;;;-1:-1:-1;17737:411:0;;;;;:::i;:::-;;:::i;25814:456::-;;;;;;;;;;-1:-1:-1;25814:456:0;;;;;:::i;:::-;;:::i;9486:27::-;;;;;;;;;;;;;;;;14194:249;;;;;;;;;;;;;:::i;7945:79::-;;;;;;;;;;-1:-1:-1;8010:6:0;;-1:-1:-1;;;;;8010:6:0;7945:79;;4186:104;;;;;;;;;;;;;:::i;17227:246::-;;;;;;;;;;-1:-1:-1;17227:246:0;;;;;:::i;:::-;;:::i;5892:413::-;;;;;;;;;;-1:-1:-1;5892:413:0;;;;;:::i;:::-;;:::i;4650:175::-;;;;;;;;;;-1:-1:-1;4650:175:0;;;;;:::i;:::-;;:::i;9555:30::-;;;;;;;;;;;;;;;;11297:58;;;;;;;;;;-1:-1:-1;11297:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;10617:38;;;;;;;;;;;;;;;;10000:33;;;;;;;;;;-1:-1:-1;10000:33:0;;;;;;;;;;;27414:449;;;;;;;;;;-1:-1:-1;27414:449:0;;;;;:::i;:::-;;:::i;18584:182::-;;;;;;;;;;-1:-1:-1;18584:182:0;;;;;:::i;:::-;;:::i;18156:420::-;;;;;;;;;;-1:-1:-1;18156:420:0;;;;;:::i;:::-;;:::i;15396:284::-;;;;;;;;;;-1:-1:-1;15396:284:0;;;;;:::i;:::-;;:::i;9804:30::-;;;;;;;;;;-1:-1:-1;9804:30:0;;;;-1:-1:-1;;;;;9804:30:0;;;28669:220;;;;;;;;;;;;;:::i;10263:39::-;;;;;;;;;;-1:-1:-1;10263:39:0;;;;;;;;10702:32;;;;;;;;;;;;;;;;15750:346;;;;;;;;;;-1:-1:-1;15750:346:0;;;;;:::i;:::-;;:::i;10311:27::-;;;;;;;;;;;;;;;;15114:274;;;;;;;;;;-1:-1:-1;15114:274:0;;;;;:::i;:::-;;:::i;4833:151::-;;;;;;;;;;-1:-1:-1;4833:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;4949:18:0;;;4922:7;4949:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4833:151;9719:33;;;;;;;;;;;;;;;;14723:98;;;;;;;;;;;;;:::i;9881:37::-;;;;;;;;;;;;;;;;10791:49;;;;;;;;;;;;;;;;10387:30;;;;;;;;;;;;;;;;8317:244;;;;;;;;;;-1:-1:-1;8317:244:0;;;;;:::i;:::-;;:::i;26340:160::-;;;;;;;;;;;;;:::i;10540:31::-;;;;;;;;;;;;;;;;10847:36;;;;;;;;;;-1:-1:-1;10847:36:0;;;;;;;;4078:100;4132:13;4165:5;4158:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4078:100;:::o;4992:169::-;5075:4;5092:39;307:10;5115:7;5124:6;5092:8;:39::i;:::-;-1:-1:-1;5149:4:0;4992:169;;;;;:::o;16323:617::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;;;;;;;;;16465:15:::1;:22;16447:7;:14;:40;16439:83;;;::::0;-1:-1:-1;;;16439:83:0;;7577:2:1;16439:83:0::1;::::0;::::1;7559:21:1::0;7616:2;7596:18;;;7589:30;7655:32;7635:18;;;7628:60;7705:18;;16439:83:0::1;7375:354:1::0;16439:83:0::1;16558:3;16541:7;:14;:20;16533:87;;;::::0;-1:-1:-1;;;16533:87:0;;7936:2:1;16533:87:0::1;::::0;::::1;7918:21:1::0;7975:2;7955:18;;;7948:30;8014:34;7994:18;;;7987:62;-1:-1:-1;;;8065:18:1;;;8058:52;8127:19;;16533:87:0::1;7734:418:1::0;16533:87:0::1;16733:9;16729:204;16752:7;:14;16748:1;:18;16729:204;;;16787:14;16804:7;16812:1;16804:10;;;;;;;;:::i;:::-;;;;;;;16787:27;;16829:14;16846:15;16862:1;16846:18;;;;;;;;:::i;:::-;;;;;;;16865:4;16846:23;;;;:::i;:::-;16829:40;;16884:37;16894:10;16906:6;16914;16884:9;:37::i;:::-;16772:161;;16768:3;;;;;:::i;:::-;;;;16729:204;;;;16323:617:::0;;:::o;5169:492::-;5309:4;5326:36;5336:6;5344:9;5355:6;5326:9;:36::i;:::-;-1:-1:-1;;;;;5402:19:0;;5375:24;5402:19;;;:11;:19;;;;;;;;307:10;5402:33;;;;;;;;5454:26;;;;5446:79;;;;-1:-1:-1;;;5446:79:0;;8936:2:1;5446:79:0;;;8918:21:1;8975:2;8955:18;;;8948:30;9014:34;8994:18;;;8987:62;-1:-1:-1;;;9065:18:1;;;9058:38;9113:19;;5446:79:0;8734:404:1;5446:79:0;5561:57;5570:6;307:10;5611:6;5592:16;:25;5561:8;:57::i;:::-;-1:-1:-1;5649:4:0;;5169:492;-1:-1:-1;;;;5169:492:0:o;14833:269::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;14952:4:::1;14946;14926:13;4487:12:::0;;;4399:108;14926:13:::1;:17;::::0;14942:1:::1;14926:17;:::i;:::-;:24;;;;:::i;:::-;14925:31;;;;:::i;:::-;14915:6;:41;;14907:95;;;::::0;-1:-1:-1;;;14907:95:0;;9567:2:1;14907:95:0::1;::::0;::::1;9549:21:1::0;9606:2;9586:18;;;9579:30;9645:34;9625:18;;;9618:62;-1:-1:-1;;;9696:18:1;;;9689:39;9745:19;;14907:95:0::1;9365:405:1::0;14907:95:0::1;15028:17;:6:::0;15038::::1;15028:17;:::i;:::-;15013:12;:32:::0;;;15061:33:::1;::::0;160:25:1;;;15061:33:0::1;::::0;148:2:1;133:18;15061:33:0::1;;;;;;;;14833:269:::0;:::o;5669:215::-;307:10;5757:4;5806:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;5806:34:0;;;;;;;;;;5757:4;;5774:80;;5797:7;;5806:47;;5843:10;;5806:47;:::i;:::-;5774:8;:80::i;27135:271::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27229:31:0;::::1;27221:63;;;::::0;-1:-1:-1;;;27221:63:0;;10107:2:1;27221:63:0::1;::::0;::::1;10089:21:1::0;10146:2;10126:18;;;10119:30;-1:-1:-1;;;10165:18:1;;;10158:49;10224:18;;27221:63:0::1;9905:343:1::0;27221:63:0::1;27295:16;:45:::0;;-1:-1:-1;;;;;;27295:45:0::1;-1:-1:-1::0;;;;;27295:45:0;::::1;::::0;;::::1;::::0;;;27356:42:::1;::::0;::::1;::::0;-1:-1:-1;;27356:42:0::1;27135:271:::0;:::o;26508:329::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26612:36:0;::::1;26604:91;;;::::0;-1:-1:-1;;;26604:91:0;;10455:2:1;26604:91:0::1;::::0;::::1;10437:21:1::0;10494:2;10474:18;;;10467:30;10533:34;10513:18;;;10506:62;-1:-1:-1;;;10584:18:1;;;10577:40;10634:19;;26604:91:0::1;10253:406:1::0;26604:91:0::1;26706:21;:55:::0;;-1:-1:-1;;;;;;26706:55:0::1;-1:-1:-1::0;;;;;26706:55:0;::::1;::::0;;::::1;::::0;;;26777:52:::1;::::0;::::1;::::0;-1:-1:-1;;26777:52:0::1;26508:329:::0;:::o;26845:281::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26937:30:0;::::1;26929:79;;;::::0;-1:-1:-1;;;26929:79:0;;10866:2:1;26929:79:0::1;::::0;::::1;10848:21:1::0;10905:2;10885:18;;;10878:30;10944:34;10924:18;;;10917:62;-1:-1:-1;;;10995:18:1;;;10988:34;11039:19;;26929:79:0::1;10664:400:1::0;26929:79:0::1;27019:15;:43:::0;;-1:-1:-1;;;;;;27019:43:0::1;-1:-1:-1::0;;;;;27019:43:0;::::1;::::0;;::::1;::::0;;;27078:40:::1;::::0;::::1;::::0;-1:-1:-1;;27078:40:0::1;26845:281:::0;:::o;27871:::-;27953:24;;27931:7;;27953:24;;27950:195;;;28029:25;;28000:26;;:54;;;;:::i;:::-;27993:61;;27871:281;:::o;27950:195::-;-1:-1:-1;28103:1:0;;27871:281::o;8159:150::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;8252:6:::1;::::0;8231:40:::1;::::0;8268:1:::1;::::0;-1:-1:-1;;;;;8252:6:0::1;::::0;8231:40:::1;::::0;8268:1;;8231:40:::1;8282:6;:19:::0;;-1:-1:-1;;;;;;8282:19:0::1;::::0;;8159:150::o;14499:154::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;14553:14:::1;:22:::0;;-1:-1:-1;;14553:22:0;;::::1;::::0;;;14586:20:::1;:28:::0;;;;::::1;::::0;;14630:15:::1;::::0;::::1;::::0;14570:5:::1;::::0;14630:15:::1;14499:154::o:0;16952:267::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;17048:4:::1;17044:111;;17086:13;-1:-1:-1::0;;;;;17076:23:0::1;:6;-1:-1:-1::0;;;;;17076:23:0::1;::::0;17068:75:::1;;;::::0;-1:-1:-1;;;17068:75:0;;11271:2:1;17068:75:0::1;::::0;::::1;11253:21:1::0;11310:2;11290:18;;;11283:30;11349:34;11329:18;;;11322:62;-1:-1:-1;;;11400:18:1;;;11393:37;11447:19;;17068:75:0::1;11069:403:1::0;17068:75:0::1;-1:-1:-1::0;;;;;17165:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;17165:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;16952:267::o;28160:501::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;28248:29:::1;:27;:29::i;:::-;28229:15;:48;;:85;;;;;28313:1;28281:29;:27;:29::i;:::-;:33;28229:85;28221:120;;;::::0;-1:-1:-1;;;28221:120:0;;11679:2:1;28221:120:0::1;::::0;::::1;11661:21:1::0;11718:2;11698:18;;;11691:30;-1:-1:-1;;;11737:18:1;;;11730:52;11799:18;;28221:120:0::1;11477:346:1::0;28221:120:0::1;28381:1;28352:26;:30:::0;;;28393:24:::1;:32:::0;;-1:-1:-1;;28393:32:0::1;::::0;;28520:16:::1;::::0;28462:55:::1;::::0;-1:-1:-1;;;28462:55:0;;28511:4:::1;28462:55;::::0;::::1;1543:51:1::0;28539:3:0::1;::::0;28520:16;28477:13:::1;-1:-1:-1::0;;;;;28462:40:0::1;::::0;::::1;::::0;1516:18:1;;28462:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:74;;;;:::i;:::-;:80;;;;:::i;:::-;28582:1;28563:16;:20:::0;28596:57:::1;::::0;-1:-1:-1;;;28596:57:0;;28627:10:::1;28596:57;::::0;::::1;12191:51:1::0;12258:18;;;12251:34;;;28438:104:0;;-1:-1:-1;28603:13:0::1;-1:-1:-1::0;;;;;28596:30:0::1;::::0;::::1;::::0;12164:18:1;;28596:57:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28210:451;28160:501::o:0;17737:411::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;17863:20:::1;:41:::0;;;17915:15:::1;:31:::0;;;17957:14:::1;:29:::0;;;17974:12;18012:38:::1;17933:13:::0;17886:18;18012:38:::1;:::i;:::-;:55;;;;:::i;:::-;17997:12;:70:::0;;;18102:4:::1;-1:-1:-1::0;18086:20:0::1;18078:62;;;::::0;-1:-1:-1;;;18078:62:0;;12748:2:1;18078:62:0::1;::::0;::::1;12730:21:1::0;12787:2;12767:18;;;12760:30;12826:31;12806:18;;;12799:59;12875:18;;18078:62:0::1;12546:353:1::0;25814:456:0;8072:6;;25901:10;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25932:20:0;::::1;25924:59;;;::::0;-1:-1:-1;;;25924:59:0;;13106:2:1;25924:59:0::1;::::0;::::1;13088:21:1::0;13145:2;13125:18;;;13118:30;13184:28;13164:18;;;13157:56;13230:18;;25924:59:0::1;12904:350:1::0;25924:59:0::1;26020:4;-1:-1:-1::0;;;;;26002:23:0;::::1;::::0;25994:64:::1;;;::::0;-1:-1:-1;;;25994:64:0;;13461:2:1;25994:64:0::1;::::0;::::1;13443:21:1::0;13500:2;13480:18;;;13473:30;13539;13519:18;;;13512:58;13587:18;;25994:64:0::1;13259:352:1::0;25994:64:0::1;26096:39;::::0;-1:-1:-1;;;26096:39:0;;26129:4:::1;26096:39;::::0;::::1;1543:51:1::0;26069:24:0::1;::::0;-1:-1:-1;;;;;26096:24:0;::::1;::::0;::::1;::::0;1516:18:1;;26096:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26154:46;::::0;-1:-1:-1;;;26154:46:0;;-1:-1:-1;;;;;12209:32:1;;;26154:46:0::1;::::0;::::1;12191:51:1::0;12258:18;;;12251:34;;;26069:66:0;;-1:-1:-1;26154:23:0;;::::1;::::0;::::1;::::0;12164:18:1;;26154:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26216;::::0;;-1:-1:-1;;;;;12209:32:1;;12191:51;;12273:2;12258:18;;12251:34;;;26146:54:0;;-1:-1:-1;26216:46:0::1;::::0;12164:18:1;26216:46:0::1;;;;;;;25913:357;25814:456:::0;;;;:::o;14194:249::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;14258:13:::1;::::0;::::1;::::0;::::1;;;14257:14;14249:50;;;::::0;-1:-1:-1;;;14249:50:0;;13818:2:1;14249:50:0::1;::::0;::::1;13800:21:1::0;13857:2;13837:18;;;13830:30;13896:25;13876:18;;;13869:53;13939:18;;14249:50:0::1;13616:347:1::0;14249:50:0::1;14310:13;:20:::0;;-1:-1:-1;;14341:18:0;;;;;14391:12:::1;14370:18;:33:::0;14419:16:::1;::::0;::::1;::::0;-1:-1:-1;;14419:16:0::1;14194:249::o:0;4186:104::-;4242:13;4275:7;4268:14;;;;;:::i;17227:246::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;17336:13:::1;-1:-1:-1::0;;;;;17328:21:0::1;:4;-1:-1:-1::0;;;;;17328:21:0::1;::::0;17320:91:::1;;;::::0;-1:-1:-1;;;17320:91:0;;14170:2:1;17320:91:0::1;::::0;::::1;14152:21:1::0;14209:2;14189:18;;;14182:30;14248:34;14228:18;;;14221:62;14319:27;14299:18;;;14292:55;14364:19;;17320:91:0::1;13968:421:1::0;17320:91:0::1;17424:41;17453:4;17459:5;17424:28;:41::i;5892:413::-:0;307:10;5985:4;6029:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6029:34:0;;;;;;;;;;6082:35;;;;6074:85;;;;-1:-1:-1;;;6074:85:0;;14596:2:1;6074:85:0;;;14578:21:1;14635:2;14615:18;;;14608:30;14674:34;14654:18;;;14647:62;-1:-1:-1;;;14725:18:1;;;14718:35;14770:19;;6074:85:0;14394:401:1;6074:85:0;6195:67;307:10;6218:7;6246:15;6227:16;:34;6195:8;:67::i;:::-;-1:-1:-1;6293:4:0;;5892:413;-1:-1:-1;;;5892:413:0:o;4650:175::-;4736:4;4753:42;307:10;4777:9;4788:6;4753:9;:42::i;27414:449::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;27506:24:::1;::::0;::::1;;27505:25;27497:87;;;::::0;-1:-1:-1;;;27497:87:0;;15002:2:1;27497:87:0::1;::::0;::::1;14984:21:1::0;15041:2;15021:18;;;15014:30;15080:34;15060:18;;;15053:62;-1:-1:-1;;;15131:18:1;;;15124:47;15188:19;;27497:87:0::1;14800:413:1::0;27497:87:0::1;27621:3;27603:14;:21;;:43;;;;;27645:1;27628:14;:18;27603:43;27595:82;;;::::0;-1:-1:-1;;;27595:82:0;;15420:2:1;27595:82:0::1;::::0;::::1;15402:21:1::0;15459:2;15439:18;;;15432:30;15498:28;15478:18;;;15471:56;15544:18;;27595:82:0::1;15218:350:1::0;27595:82:0::1;27717:15;27688:26;:44:::0;27743:24:::1;:31:::0;;-1:-1:-1;;27743:31:0::1;27770:4;27743:31;::::0;;27785:16:::1;:33:::0;;;27834:21:::1;::::0;::::1;::::0;27743:24:::1;::::0;27834:21:::1;27414:449:::0;:::o;18584:182::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18669:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;18669:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;18724:34;;1345:41:1;;;18724:34:0::1;::::0;1318:18:1;18724:34:0::1;;;;;;;18584:182:::0;;:::o;18156:420::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;18283:21:::1;:42:::0;;;18336:16:::1;:32:::0;;;18379:15:::1;:30:::0;;;18397:12;18436:40:::1;18355:13:::0;18307:18;18436:40:::1;:::i;:::-;:58;;;;:::i;:::-;18420:13;:74:::0;;;18530:4:::1;-1:-1:-1::0;18513:21:0::1;18505:63;;;::::0;-1:-1:-1;;;18505:63:0;;12748:2:1;18505:63:0::1;::::0;::::1;12730:21:1::0;12787:2;12767:18;;;12760:30;12826:31;12806:18;;;12799:59;12875:18;;18505:63:0::1;12546:353:1::0;15396:284:0;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;15518:4:::1;15512;15492:13;4487:12:::0;;;4399:108;15492:13:::1;:17;::::0;15508:1:::1;15492:17;:::i;:::-;:24;;;;:::i;:::-;15491:31;;;;:::i;:::-;15481:6;:41;;15473:98;;;::::0;-1:-1:-1;;;15473:98:0;;15775:2:1;15473:98:0::1;::::0;::::1;15757:21:1::0;15814:2;15794:18;;;15787:30;15853:34;15833:18;;;15826:62;-1:-1:-1;;;15904:18:1;;;15897:42;15956:19;;15473:98:0::1;15573:408:1::0;15473:98:0::1;15600:17;:6:::0;15610::::1;15600:17;:::i;:::-;15582:15;:35:::0;;;15633:39:::1;::::0;160:25:1;;;15633:39:0::1;::::0;148:2:1;133:18;15633:39:0::1;14:177:1::0;28669:220:0;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;28734:24:::1;:32:::0;;-1:-1:-1;;28734:32:0::1;::::0;;28761:5:::1;28777:16;:20:::0;;;28808:26:::1;:30:::0;;;28854:27:::1;::::0;::::1;::::0;28761:5;28854:27:::1;28669:220::o:0;15750:346::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;15873:6:::1;15853:13;4487:12:::0;;;4399:108;15853:13:::1;:17;::::0;15869:1:::1;15853:17;:::i;:::-;:26;;;;:::i;:::-;15840:9;:39;;15832:105;;;::::0;-1:-1:-1;;;15832:105:0;;16188:2:1;15832:105:0::1;::::0;::::1;16170:21:1::0;16227:2;16207:18;;;16200:30;16266:34;16246:18;;;16239:62;-1:-1:-1;;;16317:18:1;;;16310:51;16378:19;;15832:105:0::1;15986:417:1::0;15832:105:0::1;15988:4;15968:13;4487:12:::0;;;4399:108;15968:13:::1;:17;::::0;15984:1:::1;15968:17;:::i;:::-;:24;;;;:::i;:::-;15955:9;:37;;15947:102;;;::::0;-1:-1:-1;;;15947:102:0;;16610:2:1;15947:102:0::1;::::0;::::1;16592:21:1::0;16649:2;16629:18;;;16622:30;16688:34;16668:18;;;16661:62;-1:-1:-1;;;16739:18:1;;;16732:50;16799:19;;15947:102:0::1;16408:416:1::0;15947:102:0::1;16059:18;:30:::0;15750:346::o;15114:274::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;15234:4:::1;15228;15208:13;4487:12:::0;;;4399:108;15208:13:::1;:17;::::0;15224:1:::1;15208:17;:::i;:::-;:24;;;;:::i;:::-;15207:31;;;;:::i;:::-;15197:6;:41;;15189:96;;;::::0;-1:-1:-1;;;15189:96:0;;17031:2:1;15189:96:0::1;::::0;::::1;17013:21:1::0;17070:2;17050:18;;;17043:30;17109:34;17089:18;;;17082:62;-1:-1:-1;;;17160:18:1;;;17153:40;17210:19;;15189:96:0::1;16829:406:1::0;15189:96:0::1;15312:17;:6:::0;15322::::1;15312:17;:::i;:::-;15296:13;:33:::0;;;15345:35:::1;::::0;160:25:1;;;15345:35:0::1;::::0;148:2:1;133:18;15345:35:0::1;14:177:1::0;14723:98:0;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;14785:20:::1;:28:::0;;-1:-1:-1;;14785:28:0::1;::::0;;14723:98::o;8317:244::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8406:22:0;::::1;8398:73;;;::::0;-1:-1:-1;;;8398:73:0;;17442:2:1;8398:73:0::1;::::0;::::1;17424:21:1::0;17481:2;17461:18;;;17454:30;17520:34;17500:18;;;17493:62;-1:-1:-1;;;17571:18:1;;;17564:36;17617:19;;8398:73:0::1;17240:402:1::0;8398:73:0::1;8508:6;::::0;8487:38:::1;::::0;-1:-1:-1;;;;;8487:38:0;;::::1;::::0;8508:6:::1;::::0;8487:38:::1;::::0;8508:6:::1;::::0;8487:38:::1;8536:6;:17:::0;;-1:-1:-1;;;;;;8536:17:0::1;-1:-1:-1::0;;;;;8536:17:0;;;::::1;::::0;;;::::1;::::0;;8317:244::o;26340:160::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;26434:58:::1;::::0;26398:12:::1;::::0;26442:10:::1;::::0;26466:21:::1;::::0;26398:12;26434:58;26398:12;26434:58;26466:21;26442:10;26434:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;26340:160:0:o;7234:380::-;-1:-1:-1;;;;;7370:19:0;;7362:68;;;;-1:-1:-1;;;7362:68:0;;18059:2:1;7362:68:0;;;18041:21:1;18098:2;18078:18;;;18071:30;18137:34;18117:18;;;18110:62;-1:-1:-1;;;18188:18:1;;;18181:34;18232:19;;7362:68:0;17857:400:1;7362:68:0;-1:-1:-1;;;;;7449:21:0;;7441:68;;;;-1:-1:-1;;;7441:68:0;;18464:2:1;7441:68:0;;;18446:21:1;18503:2;18483:18;;;18476:30;18542:34;18522:18;;;18515:62;-1:-1:-1;;;18593:18:1;;;18586:32;18635:19;;7441:68:0;18262:398:1;7441:68:0;-1:-1:-1;;;;;7522:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;7574:32;;160:25:1;;;7574:32:0;;133:18:1;7574:32:0;;;;;;;7234:380;;;:::o;18774:4371::-;-1:-1:-1;;;;;18874:18:0;;18866:68;;;;-1:-1:-1;;;18866:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18953:16:0;;18945:64;;;;-1:-1:-1;;;18945:64:0;;;;;;;:::i;:::-;19037:1;19028:6;:10;19020:52;;;;-1:-1:-1;;;19020:52:0;;19677:2:1;19020:52:0;;;19659:21:1;19716:2;19696:18;;;19689:30;19755:31;19735:18;;;19728:59;19804:18;;19020:52:0;19475:353:1;19020:52:0;19106:14;;;;19103:1849;;;8010:6;;-1:-1:-1;;;;;19140:15:0;;;8010:6;;19140:15;;;;:32;;-1:-1:-1;8010:6:0;;-1:-1:-1;;;;;19159:13:0;;;8010:6;;19159:13;;19140:32;:52;;;;-1:-1:-1;;;;;;19176:16:0;;;;19140:52;:77;;;;-1:-1:-1;;;;;;19196:21:0;;19210:6;19196:21;;19140:77;19136:1805;;;19241:13;;;;;;;19237:148;;-1:-1:-1;;;;;19286:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;19315:23:0;;;;;;:19;:23;;;;;;;;19286:52;19278:87;;;;-1:-1:-1;;;19278:87:0;;20035:2:1;19278:87:0;;;20017:21:1;20074:2;20054:18;;;20047:30;-1:-1:-1;;;20093:18:1;;;20086:52;20155:18;;19278:87:0;19833:346:1;19278:87:0;19559:20;;;;19555:519;;;19621:15;-1:-1:-1;;;;;19607:30:0;:2;-1:-1:-1;;;;;19607:30:0;;;:62;;;;;19655:13;-1:-1:-1;;;;;19641:28:0;:2;-1:-1:-1;;;;;19641:28:0;;;19607:62;19603:452;;;19747:16;19762:1;19747:12;:16;:::i;:::-;19734:9;19705:39;;;;:28;:39;;;;;;:58;:113;;;;-1:-1:-1;19802:16:0;19817:1;19802:12;:16;:::i;:::-;-1:-1:-1;;;;;19767:32:0;;;;;;:28;:32;;;;;;:51;19705:113;19697:179;;;;-1:-1:-1;;;19697:179:0;;20519:2:1;19697:179:0;;;20501:21:1;20558:2;20538:18;;;20531:30;20597:34;20577:18;;;20570:62;-1:-1:-1;;;20648:18:1;;;20641:51;20709:19;;19697:179:0;20317:417:1;19697:179:0;19932:9;19903:39;;;;:28;:39;;;;;;19945:12;19903:54;;;;-1:-1:-1;;;;;19984:32:0;;;;;;:47;19603:452;-1:-1:-1;;;;;20143:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;20179:35:0;;;;;;:31;:35;;;;;;;;20178:36;20143:71;20139:787;;;20261:12;;20251:6;:22;;20243:75;;;;-1:-1:-1;;;20243:75:0;;20941:2:1;20243:75:0;;;20923:21:1;20980:2;20960:18;;;20953:30;21019:34;20999:18;;;20992:62;-1:-1:-1;;;21070:18:1;;;21063:38;21118:19;;20243:75:0;20739:404:1;20243:75:0;20379:15;;-1:-1:-1;;;;;4616:18:0;;4589:7;4616:18;;;;;;;;;;;20353:22;;:6;:22;:::i;:::-;:41;;20345:78;;;;-1:-1:-1;;;20345:78:0;;21350:2:1;20345:78:0;;;21332:21:1;21389:2;21369:18;;;21362:30;-1:-1:-1;;;21408:18:1;;;21401:54;21472:18;;20345:78:0;21148:348:1;20345:78:0;20139:787;;;-1:-1:-1;;;;;20500:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;20534:37:0;;;;;;:31;:37;;;;;;;;20533:38;20500:71;20496:430;;;20618:13;;20608:6;:23;;20600:78;;;;-1:-1:-1;;;20600:78:0;;21703:2:1;20600:78:0;;;21685:21:1;21742:2;21722:18;;;21715:30;21781:34;21761:18;;;21754:62;-1:-1:-1;;;21832:18:1;;;21825:40;21882:19;;20600:78:0;21501:406:1;20496:430:0;-1:-1:-1;;;;;20727:35:0;;;;;;:31;:35;;;;;;;;20726:36;:78;;;;-1:-1:-1;;;;;;20767:37:0;;;;;;:31;:37;;;;;;;;20766:38;20726:78;20722:204;;;20862:15;;-1:-1:-1;;;;;4616:18:0;;4589:7;4616:18;;;;;;;;;;;20836:22;;:6;:22;:::i;:::-;:41;;20828:78;;;;-1:-1:-1;;;20828:78:0;;21350:2:1;20828:78:0;;;21332:21:1;21389:2;21369:18;;;21362:30;-1:-1:-1;;;21408:18:1;;;21401:54;21472:18;;20828:78:0;21148:348:1;20828:78:0;21013:4;20964:28;4616:18;;;;;;;;;;;21079;;21055:42;;;;;;;21113:22;;-1:-1:-1;21124:11:0;;;;;;;21113:22;:35;;;;-1:-1:-1;21140:8:0;;;;21139:9;21113:35;:71;;;;-1:-1:-1;;;;;;21153:31:0;;;;;;:25;:31;;;;;;;;21152:32;21113:71;:101;;;;-1:-1:-1;;;;;;21189:25:0;;;;;;:19;:25;;;;;;;;21188:26;21113:101;:129;;;;-1:-1:-1;;;;;;21219:23:0;;;;;;:19;:23;;;;;;;;21218:24;21113:129;21110:236;;;21259:8;:15;;-1:-1:-1;;21259:15:0;21270:4;21259:15;;;21291:10;:8;:10::i;:::-;21318:8;:16;;-1:-1:-1;;21318:16:0;;;21110:236;-1:-1:-1;;;;;21476:25:0;;21358:12;21476:25;;;:19;:25;;;;;;21373:4;;21476:25;;;:52;;-1:-1:-1;;;;;;21505:23:0;;;;;;:19;:23;;;;;;;;21476:52;21473:99;;;-1:-1:-1;21555:5:0;21473:99;21592:12;21619:21;21732:7;21729:1363;;;21887:16;:12;21902:1;21887:16;:::i;:::-;21865:18;;:38;;:73;;;;-1:-1:-1;;;;;;21907:31:0;;;;;;:25;:31;;;;;;;;21865:73;21862:1045;;;21988:3;21974:11;:6;21983:2;21974:11;:::i;:::-;:17;;;;:::i;:::-;22032:21;;21958:33;;-1:-1:-1;22010:59:0;;22026:4;;-1:-1:-1;;;;;22032:21:0;21958:33;22010:15;:59::i;:::-;21862:1045;;;-1:-1:-1;;;;;22132:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;22181:1;22165:13;;:17;22132:50;22128:779;;;22233:5;22218:13;;22209:6;:22;;;;:::i;:::-;:29;;;;:::i;:::-;22202:36;;22305:13;;22286:16;;22279:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;22257:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;22395:13:0;;22371:21;;22364:28;;:4;:28;:::i;:::-;:44;;;;:::i;:::-;22337:23;;:71;;;;;;;:::i;:::-;;;;-1:-1:-1;;22473:13:0;;22455:15;;22448:22;;:4;:22;:::i;:::-;:38;;;;:::i;:::-;22427:17;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;22128:779:0;;-1:-1:-1;22128:779:0;;-1:-1:-1;;;;;22547:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;22597:1;22582:12;;:16;22547:51;22544:363;;;22647:5;22632:12;;22623:6;:21;;;;:::i;:::-;:29;;;;:::i;:::-;22616:36;;22715:12;;22697:15;;22690:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;22668:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;22803:12:0;;22780:20;;22773:27;;:4;:27;:::i;:::-;:42;;;;:::i;:::-;22746:23;;:69;;;;;;;:::i;:::-;;;;-1:-1:-1;;22879:12:0;;22862:14;;22855:21;;:4;:21;:::i;:::-;:36;;;;:::i;:::-;22834:17;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;22544:363:0;22938:8;;22935:93;;22970:42;22986:4;23000;23007;22970:15;:42::i;:::-;23060:20;23067:13;23060:4;:20;:::i;:::-;23050:30;;;;:::i;:::-;;;21729:1363;23104:33;23120:4;23126:2;23130:6;23104:15;:33::i;:::-;18853:4292;;;;;18774:4371;;;:::o;17481:248::-;-1:-1:-1;;;;;17564:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;17564:39:0;;;;;;;17624;17564:31;:39;17624:26;:39::i;:::-;17681:40;;;;;;-1:-1:-1;;;;;17681:40:0;;;;;;;;17481:248;;:::o;24295:1511::-;24378:4;24334:23;4616:18;;;;;;;;;;;24334:50;;24395:25;24470:17;;24444:23;;24423:18;;:44;;;;:::i;:::-;:64;;;;:::i;:::-;24395:92;-1:-1:-1;24511:20:0;;;:46;;-1:-1:-1;24535:22:0;;24511:46;24508:60;;;24560:7;;24295:1511::o;24508:60::-;24601:18;;;:23;;;:::i;:::-;24583:15;:41;24580:113;;;24658:18;;;:23;;;:::i;:::-;24640:41;;24580:113;24705:12;24787:23;24872:1;24852:17;24831:18;;24813:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;24787:86;-1:-1:-1;24894:51:0;24911:33;24787:86;24911:15;:33;:::i;:::-;24894:16;:51::i;:::-;25161:18;;24988:21;;;;24967:18;;25161:20;;25180:1;;25161:20;:::i;:::-;25140:42;;:17;:42;:::i;:::-;25113:23;;25100:36;;:10;:36;:::i;:::-;:83;;;;:::i;:::-;25069:114;;25194:22;25293:1;25274:18;;:20;;;;:::i;:::-;25253:42;;:17;:42;:::i;:::-;25232:17;;25219:30;;:10;:30;:::i;:::-;:77;;;;:::i;:::-;25194:102;-1:-1:-1;25328:37:0;25194:102;25328:20;:37;:::i;:::-;25309:56;;;;:::i;:::-;25411:1;25390:18;:22;;;25423:23;:27;;;25461:17;:21;25309:56;-1:-1:-1;25506:19:0;;;;;:42;;;25547:1;25529:15;:19;25506:42;25503:119;;;25564:46;25577:15;25594;25564:12;:46::i;:::-;25655:15;;25647:56;;-1:-1:-1;;;;;25655:15:0;;;;25684:14;;25647:56;;;;25684:14;25655:15;25647:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25737:21:0;;25729:69;;25634;;-1:-1:-1;;;;;;25737:21:0;;25772;;25729:69;;;;25772:21;25737;25729:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24295:1511:0:o;6313:614::-;-1:-1:-1;;;;;6453:20:0;;6445:70;;;;-1:-1:-1;;;6445:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6534:23:0;;6526:71;;;;-1:-1:-1;;;6526:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6634:17:0;;6610:21;6634:17;;;;;;;;;;;6670:23;;;;6662:74;;;;-1:-1:-1;;;6662:74:0;;22114:2:1;6662:74:0;;;22096:21:1;22153:2;22133:18;;;22126:30;22192:34;22172:18;;;22165:62;-1:-1:-1;;;22243:18:1;;;22236:36;22289:19;;6662:74:0;21912:402:1;6662:74:0;-1:-1:-1;;;;;6772:17:0;;;:9;:17;;;;;;;;;;;6792:22;;;6772:42;;6836:20;;;;;;;;:30;;6808:6;;6772:9;6836:30;;6808:6;;6836:30;:::i;:::-;;;;;;;;6901:9;-1:-1:-1;;;;;6884:35:0;6893:6;-1:-1:-1;;;;;6884:35:0;;6912:6;6884:35;;;;160:25:1;;148:2;133:18;;14:177;6884:35:0;;;;;;;;6434:493;6313:614;;;:::o;16108:207::-;-1:-1:-1;;;;;16196:39:0;;;;;;:31;:39;;;;;;;;;:52;;-1:-1:-1;;16196:52:0;;;;;;;;;;16264:43;;22487:51:1;;;22554:18;;;22547:50;16264:43:0;;22460:18:1;16264:43:0;;;;;;;16108:207;;:::o;23153:591::-;23305:16;;;23319:1;23305:16;;;;;;;;23281:21;;23305:16;;;;;;;;;;-1:-1:-1;23305:16:0;23281:40;;23350:4;23332;23337:1;23332:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;23332:23:0;;;-1:-1:-1;;;;;23332:23:0;;;;;23376:15;-1:-1:-1;;;;;23376:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23366:4;23371:1;23366:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;23366:32:0;;;-1:-1:-1;;;;;23366:32:0;;;;;23411:62;23428:4;23443:15;23461:11;23411:8;:62::i;:::-;23512:224;;-1:-1:-1;;;23512:224:0;;-1:-1:-1;;;;;23512:15:0;:66;;;;:224;;23593:11;;23619:1;;23663:4;;23690;;23710:15;;23512:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23208:536;23153:591;:::o;23756:531::-;23904:62;23921:4;23936:15;23954:11;23904:8;:62::i;:::-;24221:16;;24009:270;;-1:-1:-1;;;24009:270:0;;24081:4;24009:270;;;24190:34:1;24240:18;;;24233:34;;;24127:1:0;24283:18:1;;;24276:34;;;24326:18;;;24319:34;-1:-1:-1;;;;;24221:16:0;;;24369:19:1;;;24362:44;24253:15:0;24422:19:1;;;24415:35;24009:15:0;:31;;;;;;24048:9;;24124:19:1;;24009:270:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;23756:531;;:::o;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;804:70;749:131;:::o;885:315::-;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1605:247::-;1664:6;1717:2;1705:9;1696:7;1692:23;1688:32;1685:52;;;1733:1;1730;1723:12;1685:52;1772:9;1759:23;1791:31;1816:5;1791:31;:::i;:::-;1841:5;1605:247;-1:-1:-1;;;1605:247:1:o;2083:127::-;2144:10;2139:3;2135:20;2132:1;2125:31;2175:4;2172:1;2165:15;2199:4;2196:1;2189:15;2215:275;2286:2;2280:9;2351:2;2332:13;;-1:-1:-1;;2328:27:1;2316:40;;2386:18;2371:34;;2407:22;;;2368:62;2365:88;;;2433:18;;:::i;:::-;2469:2;2462:22;2215:275;;-1:-1:-1;2215:275:1:o;2495:183::-;2555:4;2588:18;2580:6;2577:30;2574:56;;;2610:18;;:::i;:::-;-1:-1:-1;2655:1:1;2651:14;2667:4;2647:25;;2495:183::o;2683:662::-;2737:5;2790:3;2783:4;2775:6;2771:17;2767:27;2757:55;;2808:1;2805;2798:12;2757:55;2844:6;2831:20;2870:4;2894:60;2910:43;2950:2;2910:43;:::i;:::-;2894:60;:::i;:::-;2988:15;;;3074:1;3070:10;;;;3058:23;;3054:32;;;3019:12;;;;3098:15;;;3095:35;;;3126:1;3123;3116:12;3095:35;3162:2;3154:6;3150:15;3174:142;3190:6;3185:3;3182:15;3174:142;;;3256:17;;3244:30;;3294:12;;;;3207;;3174:142;;;-1:-1:-1;3334:5:1;2683:662;-1:-1:-1;;;;;;2683:662:1:o;3350:1215::-;3468:6;3476;3529:2;3517:9;3508:7;3504:23;3500:32;3497:52;;;3545:1;3542;3535:12;3497:52;3585:9;3572:23;3614:18;3655:2;3647:6;3644:14;3641:34;;;3671:1;3668;3661:12;3641:34;3709:6;3698:9;3694:22;3684:32;;3754:7;3747:4;3743:2;3739:13;3735:27;3725:55;;3776:1;3773;3766:12;3725:55;3812:2;3799:16;3834:4;3858:60;3874:43;3914:2;3874:43;:::i;3858:60::-;3952:15;;;4034:1;4030:10;;;;4022:19;;4018:28;;;3983:12;;;;4058:19;;;4055:39;;;4090:1;4087;4080:12;4055:39;4114:11;;;;4134:217;4150:6;4145:3;4142:15;4134:217;;;4230:3;4217:17;4247:31;4272:5;4247:31;:::i;:::-;4291:18;;4167:12;;;;4329;;;;4134:217;;;4370:5;-1:-1:-1;;4413:18:1;;4400:32;;-1:-1:-1;;4444:16:1;;;4441:36;;;4473:1;4470;4463:12;4441:36;;4496:63;4551:7;4540:8;4529:9;4525:24;4496:63;:::i;:::-;4486:73;;;3350:1215;;;;;:::o;4570:456::-;4647:6;4655;4663;4716:2;4704:9;4695:7;4691:23;4687:32;4684:52;;;4732:1;4729;4722:12;4684:52;4771:9;4758:23;4790:31;4815:5;4790:31;:::i;:::-;4840:5;-1:-1:-1;4897:2:1;4882:18;;4869:32;4910:33;4869:32;4910:33;:::i;:::-;4570:456;;4962:7;;-1:-1:-1;;;5016:2:1;5001:18;;;;4988:32;;4570:456::o;5031:180::-;5090:6;5143:2;5131:9;5122:7;5118:23;5114:32;5111:52;;;5159:1;5156;5149:12;5111:52;-1:-1:-1;5182:23:1;;5031:180;-1:-1:-1;5031:180:1:o;5405:118::-;5491:5;5484:13;5477:21;5470:5;5467:32;5457:60;;5513:1;5510;5503:12;5528:382;5593:6;5601;5654:2;5642:9;5633:7;5629:23;5625:32;5622:52;;;5670:1;5667;5660:12;5622:52;5709:9;5696:23;5728:31;5753:5;5728:31;:::i;:::-;5778:5;-1:-1:-1;5835:2:1;5820:18;;5807:32;5848:30;5807:32;5848:30;:::i;:::-;5897:7;5887:17;;;5528:382;;;;;:::o;5915:316::-;5992:6;6000;6008;6061:2;6049:9;6040:7;6036:23;6032:32;6029:52;;;6077:1;6074;6067:12;6029:52;-1:-1:-1;;6100:23:1;;;6170:2;6155:18;;6142:32;;-1:-1:-1;6221:2:1;6206:18;;;6193:32;;5915:316;-1:-1:-1;5915:316:1:o;6236:388::-;6304:6;6312;6365:2;6353:9;6344:7;6340:23;6336:32;6333:52;;;6381:1;6378;6371:12;6333:52;6420:9;6407:23;6439:31;6464:5;6439:31;:::i;:::-;6489:5;-1:-1:-1;6546:2:1;6531:18;;6518:32;6559:33;6518:32;6559:33;:::i;6629:380::-;6708:1;6704:12;;;;6751;;;6772:61;;6826:4;6818:6;6814:17;6804:27;;6772:61;6879:2;6871:6;6868:14;6848:18;6845:38;6842:161;;6925:10;6920:3;6916:20;6913:1;6906:31;6960:4;6957:1;6950:15;6988:4;6985:1;6978:15;6842:161;;6629:380;;;:::o;7014:356::-;7216:2;7198:21;;;7235:18;;;7228:30;7294:34;7289:2;7274:18;;7267:62;7361:2;7346:18;;7014:356::o;8157:127::-;8218:10;8213:3;8209:20;8206:1;8199:31;8249:4;8246:1;8239:15;8273:4;8270:1;8263:15;8289:127;8350:10;8345:3;8341:20;8338:1;8331:31;8381:4;8378:1;8371:15;8405:4;8402:1;8395:15;8421:168;8461:7;8527:1;8523;8519:6;8515:14;8512:1;8509:21;8504:1;8497:9;8490:17;8486:45;8483:71;;;8534:18;;:::i;:::-;-1:-1:-1;8574:9:1;;8421:168::o;8594:135::-;8633:3;8654:17;;;8651:43;;8674:18;;:::i;:::-;-1:-1:-1;8721:1:1;8710:13;;8594:135::o;9143:217::-;9183:1;9209;9199:132;;9253:10;9248:3;9244:20;9241:1;9234:31;9288:4;9285:1;9278:15;9316:4;9313:1;9306:15;9199:132;-1:-1:-1;9345:9:1;;9143:217::o;9775:125::-;9840:9;;;9861:10;;;9858:36;;;9874:18;;:::i;11828:184::-;11898:6;11951:2;11939:9;11930:7;11926:23;11922:32;11919:52;;;11967:1;11964;11957:12;11919:52;-1:-1:-1;11990:16:1;;11828:184;-1:-1:-1;11828:184:1:o;12296:245::-;12363:6;12416:2;12404:9;12395:7;12391:23;12387:32;12384:52;;;12432:1;12429;12422:12;12384:52;12464:9;12458:16;12483:28;12505:5;12483:28;:::i;18665:401::-;18867:2;18849:21;;;18906:2;18886:18;;;18879:30;18945:34;18940:2;18925:18;;18918:62;-1:-1:-1;;;19011:2:1;18996:18;;18989:35;19056:3;19041:19;;18665:401::o;19071:399::-;19273:2;19255:21;;;19312:2;19292:18;;;19285:30;19351:34;19346:2;19331:18;;19324:62;-1:-1:-1;;;19417:2:1;19402:18;;19395:33;19460:3;19445:19;;19071:399::o;20184:128::-;20251:9;;;20272:11;;;20269:37;;;20286:18;;:::i;22608:251::-;22678:6;22731:2;22719:9;22710:7;22706:23;22702:32;22699:52;;;22747:1;22744;22737:12;22699:52;22779:9;22773:16;22798:31;22823:5;22798:31;:::i;22864:980::-;23126:4;23174:3;23163:9;23159:19;23205:6;23194:9;23187:25;23231:2;23269:6;23264:2;23253:9;23249:18;23242:34;23312:3;23307:2;23296:9;23292:18;23285:31;23336:6;23371;23365:13;23402:6;23394;23387:22;23440:3;23429:9;23425:19;23418:26;;23479:2;23471:6;23467:15;23453:29;;23500:1;23510:195;23524:6;23521:1;23518:13;23510:195;;;23589:13;;-1:-1:-1;;;;;23585:39:1;23573:52;;23680:15;;;;23645:12;;;;23621:1;23539:9;23510:195;;;-1:-1:-1;;;;;;;23761:32:1;;;;23756:2;23741:18;;23734:60;-1:-1:-1;;;23825:3:1;23810:19;23803:35;23722:3;22864:980;-1:-1:-1;;;22864:980:1:o;24461:306::-;24549:6;24557;24565;24618:2;24606:9;24597:7;24593:23;24589:32;24586:52;;;24634:1;24631;24624:12;24586:52;24663:9;24657:16;24647:26;;24713:2;24702:9;24698:18;24692:25;24682:35;;24757:2;24746:9;24742:18;24736:25;24726:35;;24461:306;;;;;:::o

Swarm Source

ipfs://267fd8fd4d78136583d28ab77cac279254a41a949bb76a71fc9bee69c134f643
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.