ETH Price: $3,410.87 (+1.59%)

Token

OMNI Protocol (OMNI)
 

Overview

Max Total Supply

1,000,000,000 OMNI

Holders

117

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
904,214.822262874 OMNI

Value
$0.00
0xb721bbda1a7e2608cf66bcf3b3b513103cf69df9
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:
OMNI

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-20
*/

/**
https://twitter.com/OMNI_ERC
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.11;

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 IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

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

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

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

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

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

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

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}


contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

    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 9;
    }

    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);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        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");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

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

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

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

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), 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);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

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() public 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;
    }
}



library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != -1 || a != MIN_INT256);

        return a / b;
    }

    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}

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

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

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

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

contract OMNI is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;

    mapping (address => bool) private _isSniper;
    bool private _swapping;
    uint256 private _launchTime;

    address public feeWallet;
    
    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;
        
    bool public limitsInEffect = true;
    bool public tradingActive;
    
    // 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 private _buyDevFee;
    uint256 private _buyLiquidityFee;
    
    uint256 public sellTotalFees;
    uint256 private _sellDevFee;
    uint256 private _sellLiquidityFee;
    
    uint256 private _tokensForDev;
    uint256 private _tokensForLiquidity;
    
    // exclude 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 UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event feeWalletUpdated(address indexed newWallet, address indexed oldWallet);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiquidity);
    event AutoNukeLP();
    event ManualNukeLP();

    constructor() ERC20("OMNI Protocol", "OMNI") {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;
        
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
        
        uint256 buyDevFee = 0;
        uint256 buyLiquidityFee = 0;

        uint256 sellDevFee = 0;
        uint256 sellLiquidityFee = 0;
        
        uint256 totalSupply = 1e9 * 1e9;
        
        maxTransactionAmount = totalSupply * 2 / 100; // 2%
        maxWallet = totalSupply * 2 / 100; // 2%
        swapTokensAtAmount = totalSupply * 30 / 10000;

        _buyDevFee = buyDevFee;
        _buyLiquidityFee = buyLiquidityFee;
        buyTotalFees = _buyDevFee + _buyLiquidityFee;
        
        _sellDevFee = sellDevFee;
        _sellLiquidityFee = sellLiquidityFee;
        sellTotalFees = _sellDevFee + _sellLiquidityFee;
        
        feeWallet = address(owner()); // set as fee wallet

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
        
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(msg.sender, totalSupply);
    }

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        _launchTime = block.timestamp;
    }
    
    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }
    
    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool) {
        transferDelayEnabled = false;
        return true;
    }
    
     // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool) {
  	    require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
  	    require(newAmount <= totalSupply() * 5 / 1000, "Swap amount cannot be higher than 0.5% total supply.");
  	    swapTokensAtAmount = newAmount;
  	    return true;
  	}
    
    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000) / 1e9, "Cannot set maxTransactionAmount lower than 0.1%");
        maxTransactionAmount = newNum * 1e9;
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 5 / 1000)/1e9, "Cannot set maxWallet lower than 0.5%");
        maxWallet = newNum * 1e9;
    }
    
    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }
    
    function updateBuyFees(uint256 devFee, uint256 liquidityFee) external onlyOwner {
        _buyDevFee = devFee;
        _buyLiquidityFee = liquidityFee;
        buyTotalFees = _buyDevFee + _buyLiquidityFee;
        require(buyTotalFees <= 7, "Must keep fees at 7% or less");
    }
    
    function updateSellFees(uint256 devFee, uint256 liquidityFee) external onlyOwner {
        _sellDevFee = devFee;
        _sellLiquidityFee = liquidityFee;
        sellTotalFees = _sellDevFee + _sellLiquidityFee;
    }

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

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

        _setAutomatedMarketMakerPair(pair, value);
    }

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }
    
    function updateFeeWallet(address newWallet) external onlyOwner {
        emit feeWalletUpdated(newWallet, feeWallet);
        feeWallet = newWallet;
    }

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }
    
    function setSnipers(address[] memory snipers_) public onlyOwner() {
        for (uint i = 0; i < snipers_.length; i++) {
            if (snipers_[i] != uniswapV2Pair && snipers_[i] != address(uniswapV2Router)) {
                _isSniper[snipers_[i]] = true;
            }
        }
    }
    
    function delSnipers(address[] memory snipers_) public onlyOwner() {
        for (uint i = 0; i < snipers_.length; i++) {
            _isSniper[snipers_[i]] = false;
        }
    }
    
    function isSniper(address addr) public view returns (bool) {
        return _isSniper[addr];
    }

    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(!_isSniper[from], "Your address has been marked as a sniper, you are unable to transfer or swap.");
        
         if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }
        
        if (block.timestamp == _launchTime) _isSniper[to] = true;
        
        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !_swapping
            ) {
                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 != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }
                 
                // when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
                
                // when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if (!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
            }
        }
        
		uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;
        if (
            canSwap &&
            !_swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            _swapping = true;
            swapBack();
            _swapping = false;
        }

        bool takeFee = !_swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = amount.mul(sellTotalFees).div(100);
                _tokensForLiquidity += fees * _sellLiquidityFee / sellTotalFees;
                _tokensForDev += fees * _sellDevFee / sellTotalFees;
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
        	    fees = amount.mul(buyTotalFees).div(100);
        	    _tokensForLiquidity += fees * _buyLiquidityFee / buyTotalFees;
                _tokensForDev += fees * _buyDevFee / buyTotalFees;
            }
            
            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees;
        }

        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
            owner(),
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = _tokensForLiquidity + _tokensForDev;
        
        if (contractBalance == 0 || totalTokensToSwap == 0) return;
        if (contractBalance > swapTokensAtAmount * 20) {
          contractBalance = swapTokensAtAmount * 20;
        }
        
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * _tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        
        uint256 initialETHBalance = address(this).balance;

        _swapTokensForEth(amountToSwapForETH); 
        
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        uint256 ethForDev = ethBalance.mul(_tokensForDev).div(totalTokensToSwap);
        uint256 ethForLiquidity = ethBalance - ethForDev;
        
        _tokensForLiquidity = 0;
        _tokensForDev = 0;
                
        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            _addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, _tokensForLiquidity);
        }
    }

    function withdrawFees() external {
        payable(feeWallet).transfer(address(this).balance);
    }

    receive() external payable {}
}

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":"AutoNukeLP","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":[],"name":"ManualNukeLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"feeWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"snipers_","type":"address[]"}],"name":"delSnipers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"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":[],"name":"feeWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTotalFees","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":"snipers_","type":"address[]"}],"name":"setSnipers","outputs":[],"stateMutability":"nonpayable","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":"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":[{"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":"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":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"devFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateFeeWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"devFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526001600d60006101000a81548160ff0219169083151502179055506001600f60006101000a81548160ff0219169083151502179055503480156200004757600080fd5b506040518060400160405280600d81526020017f4f4d4e492050726f746f636f6c000000000000000000000000000000000000008152506040518060400160405280600481526020017f4f4d4e49000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000cc92919062000aba565b508060049080519060200190620000e592919062000aba565b5050506000620000fa6200058660201b60201c565b905080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506000737a250d5630b4cf539739df2c5dacb4c659f2488d9050620001c58160016200058e60201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000245573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026b919062000bd4565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002d3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f9919062000bd4565b6040518363ffffffff1660e01b81526004016200031892919062000c17565b6020604051808303816000875af115801562000338573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200035e919062000bd4565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050620003a660a05160016200058e60201b60201c565b620003bb60a05160016200068b60201b60201c565b6000806000806000670de0b6b3a764000090506064600282620003df919062000c7d565b620003eb919062000d0d565b600a81905550606460028262000402919062000c7d565b6200040e919062000d0d565b600c81905550612710601e8262000426919062000c7d565b62000432919062000d0d565b600b81905550846011819055508360128190555060125460115462000458919062000d45565b60108190555082601481905550816015819055506015546014546200047e919062000d45565b601381905550620004946200072c60201b60201c565b600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004f6620004e86200072c60201b60201c565b60016200075660201b60201c565b620005093060016200075660201b60201c565b6200051e61dead60016200075660201b60201c565b62000540620005326200072c60201b60201c565b60016200058e60201b60201c565b620005533060016200058e60201b60201c565b6200056861dead60016200058e60201b60201c565b6200057a3382620008a360201b60201c565b50505050505062000fd6565b600033905090565b6200059e6200058660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000630576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006279062000e03565b60405180910390fd5b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620007666200058660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614620007f8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007ef9062000e03565b60405180910390fd5b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405162000897919062000e42565b60405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000916576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200090d9062000eaf565b60405180910390fd5b6200092a6000838362000a5260201b60201c565b620009468160025462000a5760201b620024011790919060201c565b600281905550620009a4816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205462000a5760201b620024011790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000a46919062000ee2565b60405180910390a35050565b505050565b600080828462000a68919062000d45565b90508381101562000ab0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000aa79062000f4f565b60405180910390fd5b8091505092915050565b82805462000ac89062000fa0565b90600052602060002090601f01602090048101928262000aec576000855562000b38565b82601f1062000b0757805160ff191683800117855562000b38565b8280016001018555821562000b38579182015b8281111562000b3757825182559160200191906001019062000b1a565b5b50905062000b47919062000b4b565b5090565b5b8082111562000b6657600081600090555060010162000b4c565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000b9c8262000b6f565b9050919050565b62000bae8162000b8f565b811462000bba57600080fd5b50565b60008151905062000bce8162000ba3565b92915050565b60006020828403121562000bed5762000bec62000b6a565b5b600062000bfd8482850162000bbd565b91505092915050565b62000c118162000b8f565b82525050565b600060408201905062000c2e600083018562000c06565b62000c3d602083018462000c06565b9392505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000c8a8262000c44565b915062000c978362000c44565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000cd35762000cd262000c4e565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000d1a8262000c44565b915062000d278362000c44565b92508262000d3a5762000d3962000cde565b5b828204905092915050565b600062000d528262000c44565b915062000d5f8362000c44565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000d975762000d9662000c4e565b5b828201905092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000deb60208362000da2565b915062000df88262000db3565b602082019050919050565b6000602082019050818103600083015262000e1e8162000ddc565b9050919050565b60008115159050919050565b62000e3c8162000e25565b82525050565b600060208201905062000e59600083018462000e31565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000e97601f8362000da2565b915062000ea48262000e5f565b602082019050919050565b6000602082019050818103600083015262000eca8162000e88565b9050919050565b62000edc8162000c44565b82525050565b600060208201905062000ef9600083018462000ed1565b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b600062000f37601b8362000da2565b915062000f448262000eff565b602082019050919050565b6000602082019050818103600083015262000f6a8162000f28565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000fb957607f821691505b6020821081141562000fd05762000fcf62000f71565b5b50919050565b60805160a0516153716200104260003960008181610f98015281816110c801528181611b1c0152612ada015260008181610c480152818161113901528181612a8201528181613a0701528181613ae801528181613b0f01528181613bab0152613bd201526153716000f3fe60806040526004361061026b5760003560e01c80637571336a11610144578063c18bc195116100b6578063dd62ed3e1161007a578063dd62ed3e1461094f578063e2f456051461098c578063e884f260146109b7578063f25f4b56146109e2578063f2fde38b14610a0d578063f8b45b0514610a3657610272565b8063c18bc19514610868578063c876d0b914610891578063c8c8ebe4146108bc578063d257b34f146108e7578063d85ba0631461092457610272565b80639a7a23d6116101085780639a7a23d614610734578063a457c2d71461075d578063a9059cbb1461079a578063b62496f5146107d7578063bbc0c74214610814578063c02466681461083f57610272565b80637571336a14610675578063892ba4081461069e5780638a8c523c146106c75780638da5cb5b146106de57806395d89b411461070957610272565b8063476343ee116101dd57806366718524116101a1578063667185241461057957806366ca9b83146105a25780636a486a8e146105cb57806370a08231146105f6578063715018a614610633578063751039fc1461064a57610272565b8063476343ee146104a657806349bd5a5e146104bd5780634a62bb65146104e85780634fbee193146105135780635e80148e1461055057610272565b80631694505e1161022f5780631694505e1461038257806318160ddd146103ad578063203e727e146103d857806323b872dd14610401578063313ce5671461043e578063395093511461046957610272565b806302dbd8f81461027757806306fdde03146102a0578063095ea7b3146102cb5780630f3a325f1461030857806310d5de531461034557610272565b3661027257005b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613d33565b610a61565b005b3480156102ac57600080fd5b506102b5610b20565b6040516102c29190613e0c565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190613e8c565b610bb2565b6040516102ff9190613ee7565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190613f02565b610bd0565b60405161033c9190613ee7565b60405180910390f35b34801561035157600080fd5b5061036c60048036038101906103679190613f02565b610c26565b6040516103799190613ee7565b60405180910390f35b34801561038e57600080fd5b50610397610c46565b6040516103a49190613f8e565b60405180910390f35b3480156103b957600080fd5b506103c2610c6a565b6040516103cf9190613fb8565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613fd3565b610c74565b005b34801561040d57600080fd5b5061042860048036038101906104239190614000565b610d96565b6040516104359190613ee7565b60405180910390f35b34801561044a57600080fd5b50610453610e6f565b604051610460919061406f565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190613e8c565b610e78565b60405161049d9190613ee7565b60405180910390f35b3480156104b257600080fd5b506104bb610f2b565b005b3480156104c957600080fd5b506104d2610f96565b6040516104df9190614099565b60405180910390f35b3480156104f457600080fd5b506104fd610fba565b60405161050a9190613ee7565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190613f02565b610fcd565b6040516105479190613ee7565b60405180910390f35b34801561055c57600080fd5b50610577600480360381019061057291906141fc565b611023565b005b34801561058557600080fd5b506105a0600480360381019061059b9190613f02565b611231565b005b3480156105ae57600080fd5b506105c960048036038101906105c49190613d33565b611388565b005b3480156105d757600080fd5b506105e061148d565b6040516105ed9190613fb8565b60405180910390f35b34801561060257600080fd5b5061061d60048036038101906106189190613f02565b611493565b60405161062a9190613fb8565b60405180910390f35b34801561063f57600080fd5b506106486114db565b005b34801561065657600080fd5b5061065f611633565b60405161066c9190613ee7565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190614271565b6116ee565b005b3480156106aa57600080fd5b506106c560048036038101906106c091906141fc565b6117e0565b005b3480156106d357600080fd5b506106dc61190c565b005b3480156106ea57600080fd5b506106f36119c7565b6040516107009190614099565b60405180910390f35b34801561071557600080fd5b5061071e6119f1565b60405161072b9190613e0c565b60405180910390f35b34801561074057600080fd5b5061075b60048036038101906107569190614271565b611a83565b005b34801561076957600080fd5b50610784600480360381019061077f9190613e8c565b611bb7565b6040516107919190613ee7565b60405180910390f35b3480156107a657600080fd5b506107c160048036038101906107bc9190613e8c565b611c84565b6040516107ce9190613ee7565b60405180910390f35b3480156107e357600080fd5b506107fe60048036038101906107f99190613f02565b611ca2565b60405161080b9190613ee7565b60405180910390f35b34801561082057600080fd5b50610829611cc2565b6040516108369190613ee7565b60405180910390f35b34801561084b57600080fd5b5061086660048036038101906108619190614271565b611cd5565b005b34801561087457600080fd5b5061088f600480360381019061088a9190613fd3565b611e15565b005b34801561089d57600080fd5b506108a6611f37565b6040516108b39190613ee7565b60405180910390f35b3480156108c857600080fd5b506108d1611f4a565b6040516108de9190613fb8565b60405180910390f35b3480156108f357600080fd5b5061090e60048036038101906109099190613fd3565b611f50565b60405161091b9190613ee7565b60405180910390f35b34801561093057600080fd5b506109396120c0565b6040516109469190613fb8565b60405180910390f35b34801561095b57600080fd5b50610976600480360381019061097191906142b1565b6120c6565b6040516109839190613fb8565b60405180910390f35b34801561099857600080fd5b506109a161214d565b6040516109ae9190613fb8565b60405180910390f35b3480156109c357600080fd5b506109cc612153565b6040516109d99190613ee7565b60405180910390f35b3480156109ee57600080fd5b506109f761220e565b604051610a049190614099565b60405180910390f35b348015610a1957600080fd5b50610a346004803603810190610a2f9190613f02565b612234565b005b348015610a4257600080fd5b50610a4b6123fb565b604051610a589190613fb8565b60405180910390f35b610a6961245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610af8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aef9061433d565b60405180910390fd5b8160148190555080601581905550601554601454610b16919061438c565b6013819055505050565b606060038054610b2f90614411565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5b90614411565b8015610ba85780601f10610b7d57610100808354040283529160200191610ba8565b820191906000526020600020905b815481529060010190602001808311610b8b57829003601f168201915b5050505050905090565b6000610bc6610bbf61245f565b8484612467565b6001905092915050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60196020528060005260406000206000915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600254905090565b610c7c61245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d029061433d565b60405180910390fd5b633b9aca006103e86001610d1d610c6a565b610d279190614443565b610d3191906144cc565b610d3b91906144cc565b811015610d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d749061456f565b60405180910390fd5b633b9aca0081610d8d9190614443565b600a8190555050565b6000610da3848484612632565b610e6484610daf61245f565b610e5f856040518060600160405280602881526020016152ef60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e1561245f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461333e9092919063ffffffff16565b612467565b600190509392505050565b60006009905090565b6000610f21610e8561245f565b84610f1c8560016000610e9661245f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461240190919063ffffffff16565b612467565b6001905092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610f93573d6000803e3d6000fd5b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b600d60009054906101000a900460ff1681565b6000601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61102b61245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b19061433d565b60405180910390fd5b60005b815181101561122d577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168282815181106111105761110f61458f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141580156111a257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168282815181106111815761118061458f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b1561121a576001600660008484815181106111c0576111bf61458f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8080611225906145be565b9150506110bd565b5050565b61123961245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bf9061433d565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f5deb5ef622431f0df5a39b72dd556892f68ba42aa0f3aaf0800e166ce866492860405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61139061245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461141f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114169061433d565b60405180910390fd5b816011819055508060128190555060125460115461143d919061438c565b60108190555060076010541115611489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148090614653565b60405180910390fd5b5050565b60135481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114e361245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611572576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115699061433d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600061163d61245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c39061433d565b60405180910390fd5b6000600d60006101000a81548160ff0219169083151502179055506001905090565b6116f661245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c9061433d565b60405180910390fd5b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6117e861245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186e9061433d565b60405180910390fd5b60005b81518110156119085760006006600084848151811061189c5761189b61458f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611900906145be565b91505061187a565b5050565b61191461245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199a9061433d565b60405180910390fd5b6001600d60016101000a81548160ff02191690831515021790555042600881905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611a0090614411565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2c90614411565b8015611a795780601f10611a4e57610100808354040283529160200191611a79565b820191906000526020600020905b815481529060010190602001808311611a5c57829003601f168201915b5050505050905090565b611a8b61245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b119061433d565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba0906146e5565b60405180910390fd5b611bb382826133a2565b5050565b6000611c7a611bc461245f565b84611c75856040518060600160405280602581526020016153176025913960016000611bee61245f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461333e9092919063ffffffff16565b612467565b6001905092915050565b6000611c98611c9161245f565b8484612632565b6001905092915050565b601a6020528060005260406000206000915054906101000a900460ff1681565b600d60019054906101000a900460ff1681565b611cdd61245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d639061433d565b60405180910390fd5b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611e099190613ee7565b60405180910390a25050565b611e1d61245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea39061433d565b60405180910390fd5b633b9aca006103e86005611ebe610c6a565b611ec89190614443565b611ed291906144cc565b611edc91906144cc565b811015611f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1590614777565b60405180910390fd5b633b9aca0081611f2e9190614443565b600c8190555050565b600f60009054906101000a900460ff1681565b600a5481565b6000611f5a61245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe09061433d565b60405180910390fd5b620186a06001611ff7610c6a565b6120019190614443565b61200b91906144cc565b82101561204d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204490614809565b60405180910390fd5b6103e8600561205a610c6a565b6120649190614443565b61206e91906144cc565b8211156120b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a79061489b565b60405180910390fd5b81600b8190555060019050919050565b60105481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600b5481565b600061215d61245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e39061433d565b60405180910390fd5b6000600f60006101000a81548160ff0219169083151502179055506001905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61223c61245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c29061433d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561233b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123329061492d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b6000808284612410919061438c565b905083811015612455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244c90614999565b60405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ce90614a2b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253e90614abd565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516126259190613fb8565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269990614b4f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270990614be1565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561279f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279690614c99565b60405180910390fd5b60008114156127b9576127b483836000613443565b613339565b60085442141561281c576001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600d60009054906101000a900460ff1615612edf576128396119c7565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156128a757506128776119c7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156128e05750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561291a575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156129335750600760009054906101000a900460ff16155b15612ede57600d60019054906101000a900460ff16612a2d57601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806129ed5750601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2390614d05565b60405180910390fd5b5b600f60009054906101000a900460ff1615612bf557612a4a6119c7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015612ad157507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612b2957507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612bf45743600e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba690614dbd565b60405180910390fd5b43600e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612c985750601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612d3f57600a54811115612ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd990614e4f565b60405180910390fd5b600c54612cee83611493565b82612cf9919061438c565b1115612d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3190614ebb565b60405180910390fd5b612edd565b601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612de25750601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612e3157600a54811115612e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2390614f4d565b60405180910390fd5b612edc565b601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612edb57600c54612e8e83611493565b82612e99919061438c565b1115612eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed190614ebb565b60405180910390fd5b5b5b5b5b5b6000612eea30611493565b90506000600b548210159050808015612f105750600760009054906101000a900460ff16155b8015612f665750601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612fbc5750601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156130125750601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613056576001600760006101000a81548160ff02191690831515021790555061303a6136d8565b6000600760006101000a81548160ff0219169083151502179055505b6000600760009054906101000a900460ff16159050601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061310c5750601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561311657600090505b6000811561332957601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561317957506000601354115b15613213576131a660646131986013548861385490919063ffffffff16565b6138cf90919063ffffffff16565b9050601354601554826131b99190614443565b6131c391906144cc565b601760008282546131d4919061438c565b92505081905550601354601454826131ec9190614443565b6131f691906144cc565b60166000828254613207919061438c565b92505081905550613305565b601a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561326e57506000601054115b156133045761329b606461328d6010548861385490919063ffffffff16565b6138cf90919063ffffffff16565b9050601054601254826132ae9190614443565b6132b891906144cc565b601760008282546132c9919061438c565b92505081905550601054601154826132e19190614443565b6132eb91906144cc565b601660008282546132fc919061438c565b925050819055505b5b600081111561331a57613319873083613443565b5b80856133269190614f6d565b94505b613334878787613443565b505050505b505050565b6000838311158290613386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337d9190613e0c565b60405180910390fd5b50600083856133959190614f6d565b9050809150509392505050565b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134aa90614b4f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351a90614be1565b60405180910390fd5b61352e838383613919565b613599816040518060600160405280602681526020016152c9602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461333e9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061362c816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461240190919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516136cb9190613fb8565b60405180910390a3505050565b60006136e330611493565b905060006016546017546136f7919061438c565b905060008214806137085750600081145b15613714575050613852565b6014600b546137239190614443565b82111561373c576014600b546137399190614443565b91505b60006002826017548561374f9190614443565b61375991906144cc565b61376391906144cc565b9050600061377a828561391e90919063ffffffff16565b9050600047905061378a82613968565b600061379f824761391e90919063ffffffff16565b905060006137ca866137bc6016548561385490919063ffffffff16565b6138cf90919063ffffffff16565b9050600081836137da9190614f6d565b9050600060178190555060006016819055506000861180156137fc5750600081115b156138495761380b8682613ba5565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561858260175460405161384093929190614fa1565b60405180910390a15b50505050505050505b565b60008083141561386757600090506138c9565b600082846138759190614443565b905082848261388491906144cc565b146138c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138bb9061504a565b60405180910390fd5b809150505b92915050565b600061391183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c86565b905092915050565b505050565b600061396083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061333e565b905092915050565b6000600267ffffffffffffffff811115613985576139846140b9565b5b6040519080825280602002602001820160405280156139b35781602001602082028036833780820191505090505b50905030816000815181106139cb576139ca61458f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a94919061507f565b81600181518110613aa857613aa761458f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613b0d307f000000000000000000000000000000000000000000000000000000000000000084612467565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613b6f9594939291906151a5565b600060405180830381600087803b158015613b8957600080fd5b505af1158015613b9d573d6000803e3d6000fd5b505050505050565b613bd0307f000000000000000000000000000000000000000000000000000000000000000084612467565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080613c1a6119c7565b426040518863ffffffff1660e01b8152600401613c3c969594939291906151ff565b60606040518083038185885af1158015613c5a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613c7f9190615275565b5050505050565b60008083118290613ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cc49190613e0c565b60405180910390fd5b5060008385613cdc91906144cc565b9050809150509392505050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b613d1081613cfd565b8114613d1b57600080fd5b50565b600081359050613d2d81613d07565b92915050565b60008060408385031215613d4a57613d49613cf3565b5b6000613d5885828601613d1e565b9250506020613d6985828601613d1e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613dad578082015181840152602081019050613d92565b83811115613dbc576000848401525b50505050565b6000601f19601f8301169050919050565b6000613dde82613d73565b613de88185613d7e565b9350613df8818560208601613d8f565b613e0181613dc2565b840191505092915050565b60006020820190508181036000830152613e268184613dd3565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e5982613e2e565b9050919050565b613e6981613e4e565b8114613e7457600080fd5b50565b600081359050613e8681613e60565b92915050565b60008060408385031215613ea357613ea2613cf3565b5b6000613eb185828601613e77565b9250506020613ec285828601613d1e565b9150509250929050565b60008115159050919050565b613ee181613ecc565b82525050565b6000602082019050613efc6000830184613ed8565b92915050565b600060208284031215613f1857613f17613cf3565b5b6000613f2684828501613e77565b91505092915050565b6000819050919050565b6000613f54613f4f613f4a84613e2e565b613f2f565b613e2e565b9050919050565b6000613f6682613f39565b9050919050565b6000613f7882613f5b565b9050919050565b613f8881613f6d565b82525050565b6000602082019050613fa36000830184613f7f565b92915050565b613fb281613cfd565b82525050565b6000602082019050613fcd6000830184613fa9565b92915050565b600060208284031215613fe957613fe8613cf3565b5b6000613ff784828501613d1e565b91505092915050565b60008060006060848603121561401957614018613cf3565b5b600061402786828701613e77565b935050602061403886828701613e77565b925050604061404986828701613d1e565b9150509250925092565b600060ff82169050919050565b61406981614053565b82525050565b60006020820190506140846000830184614060565b92915050565b61409381613e4e565b82525050565b60006020820190506140ae600083018461408a565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6140f182613dc2565b810181811067ffffffffffffffff821117156141105761410f6140b9565b5b80604052505050565b6000614123613ce9565b905061412f82826140e8565b919050565b600067ffffffffffffffff82111561414f5761414e6140b9565b5b602082029050602081019050919050565b600080fd5b600061417861417384614134565b614119565b9050808382526020820190506020840283018581111561419b5761419a614160565b5b835b818110156141c457806141b08882613e77565b84526020840193505060208101905061419d565b5050509392505050565b600082601f8301126141e3576141e26140b4565b5b81356141f3848260208601614165565b91505092915050565b60006020828403121561421257614211613cf3565b5b600082013567ffffffffffffffff8111156142305761422f613cf8565b5b61423c848285016141ce565b91505092915050565b61424e81613ecc565b811461425957600080fd5b50565b60008135905061426b81614245565b92915050565b6000806040838503121561428857614287613cf3565b5b600061429685828601613e77565b92505060206142a78582860161425c565b9150509250929050565b600080604083850312156142c8576142c7613cf3565b5b60006142d685828601613e77565b92505060206142e785828601613e77565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614327602083613d7e565b9150614332826142f1565b602082019050919050565b600060208201905081810360008301526143568161431a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061439782613cfd565b91506143a283613cfd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143d7576143d661435d565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061442957607f821691505b6020821081141561443d5761443c6143e2565b5b50919050565b600061444e82613cfd565b915061445983613cfd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144925761449161435d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144d782613cfd565b91506144e283613cfd565b9250826144f2576144f161449d565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060008201527f6c6f776572207468616e20302e31250000000000000000000000000000000000602082015250565b6000614559602f83613d7e565b9150614564826144fd565b604082019050919050565b600060208201905081810360008301526145888161454c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006145c982613cfd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145fc576145fb61435d565b5b600182019050919050565b7f4d757374206b6565702066656573206174203725206f72206c65737300000000600082015250565b600061463d601c83613d7e565b915061464882614607565b602082019050919050565b6000602082019050818103600083015261466c81614630565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b60006146cf603983613d7e565b91506146da82614673565b604082019050919050565b600060208201905081810360008301526146fe816146c2565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b6000614761602483613d7e565b915061476c82614705565b604082019050919050565b6000602082019050818103600083015261479081614754565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b60006147f3603583613d7e565b91506147fe82614797565b604082019050919050565b60006020820190508181036000830152614822816147e6565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b6000614885603483613d7e565b915061489082614829565b604082019050919050565b600060208201905081810360008301526148b481614878565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614917602683613d7e565b9150614922826148bb565b604082019050919050565b600060208201905081810360008301526149468161490a565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614983601b83613d7e565b915061498e8261494d565b602082019050919050565b600060208201905081810360008301526149b281614976565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614a15602483613d7e565b9150614a20826149b9565b604082019050919050565b60006020820190508181036000830152614a4481614a08565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614aa7602283613d7e565b9150614ab282614a4b565b604082019050919050565b60006020820190508181036000830152614ad681614a9a565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614b39602583613d7e565b9150614b4482614add565b604082019050919050565b60006020820190508181036000830152614b6881614b2c565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614bcb602383613d7e565b9150614bd682614b6f565b604082019050919050565b60006020820190508181036000830152614bfa81614bbe565b9050919050565b7f596f7572206164647265737320686173206265656e206d61726b65642061732060008201527f6120736e697065722c20796f752061726520756e61626c6520746f207472616e60208201527f73666572206f7220737761702e00000000000000000000000000000000000000604082015250565b6000614c83604d83613d7e565b9150614c8e82614c01565b606082019050919050565b60006020820190508181036000830152614cb281614c76565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b6000614cef601683613d7e565b9150614cfa82614cb9565b602082019050919050565b60006020820190508181036000830152614d1e81614ce2565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b6000614da7604983613d7e565b9150614db282614d25565b606082019050919050565b60006020820190508181036000830152614dd681614d9a565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b6000614e39603583613d7e565b9150614e4482614ddd565b604082019050919050565b60006020820190508181036000830152614e6881614e2c565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b6000614ea5601383613d7e565b9150614eb082614e6f565b602082019050919050565b60006020820190508181036000830152614ed481614e98565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b6000614f37603683613d7e565b9150614f4282614edb565b604082019050919050565b60006020820190508181036000830152614f6681614f2a565b9050919050565b6000614f7882613cfd565b9150614f8383613cfd565b925082821015614f9657614f9561435d565b5b828203905092915050565b6000606082019050614fb66000830186613fa9565b614fc36020830185613fa9565b614fd06040830184613fa9565b949350505050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000615034602183613d7e565b915061503f82614fd8565b604082019050919050565b6000602082019050818103600083015261506381615027565b9050919050565b60008151905061507981613e60565b92915050565b60006020828403121561509557615094613cf3565b5b60006150a38482850161506a565b91505092915050565b6000819050919050565b60006150d16150cc6150c7846150ac565b613f2f565b613cfd565b9050919050565b6150e1816150b6565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61511c81613e4e565b82525050565b600061512e8383615113565b60208301905092915050565b6000602082019050919050565b6000615152826150e7565b61515c81856150f2565b935061516783615103565b8060005b8381101561519857815161517f8882615122565b975061518a8361513a565b92505060018101905061516b565b5085935050505092915050565b600060a0820190506151ba6000830188613fa9565b6151c760208301876150d8565b81810360408301526151d98186615147565b90506151e8606083018561408a565b6151f56080830184613fa9565b9695505050505050565b600060c082019050615214600083018961408a565b6152216020830188613fa9565b61522e60408301876150d8565b61523b60608301866150d8565b615248608083018561408a565b61525560a0830184613fa9565b979650505050505050565b60008151905061526f81613d07565b92915050565b60008060006060848603121561528e5761528d613cf3565b5b600061529c86828701615260565b93505060206152ad86828701615260565b92505060406152be86828701615260565b915050925092509256fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e7f994dc752259b5411f29255f05604f8f5d02b7e88fc2437cbe21135b9c2d0064736f6c634300080b0033

Deployed Bytecode

0x60806040526004361061026b5760003560e01c80637571336a11610144578063c18bc195116100b6578063dd62ed3e1161007a578063dd62ed3e1461094f578063e2f456051461098c578063e884f260146109b7578063f25f4b56146109e2578063f2fde38b14610a0d578063f8b45b0514610a3657610272565b8063c18bc19514610868578063c876d0b914610891578063c8c8ebe4146108bc578063d257b34f146108e7578063d85ba0631461092457610272565b80639a7a23d6116101085780639a7a23d614610734578063a457c2d71461075d578063a9059cbb1461079a578063b62496f5146107d7578063bbc0c74214610814578063c02466681461083f57610272565b80637571336a14610675578063892ba4081461069e5780638a8c523c146106c75780638da5cb5b146106de57806395d89b411461070957610272565b8063476343ee116101dd57806366718524116101a1578063667185241461057957806366ca9b83146105a25780636a486a8e146105cb57806370a08231146105f6578063715018a614610633578063751039fc1461064a57610272565b8063476343ee146104a657806349bd5a5e146104bd5780634a62bb65146104e85780634fbee193146105135780635e80148e1461055057610272565b80631694505e1161022f5780631694505e1461038257806318160ddd146103ad578063203e727e146103d857806323b872dd14610401578063313ce5671461043e578063395093511461046957610272565b806302dbd8f81461027757806306fdde03146102a0578063095ea7b3146102cb5780630f3a325f1461030857806310d5de531461034557610272565b3661027257005b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613d33565b610a61565b005b3480156102ac57600080fd5b506102b5610b20565b6040516102c29190613e0c565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190613e8c565b610bb2565b6040516102ff9190613ee7565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190613f02565b610bd0565b60405161033c9190613ee7565b60405180910390f35b34801561035157600080fd5b5061036c60048036038101906103679190613f02565b610c26565b6040516103799190613ee7565b60405180910390f35b34801561038e57600080fd5b50610397610c46565b6040516103a49190613f8e565b60405180910390f35b3480156103b957600080fd5b506103c2610c6a565b6040516103cf9190613fb8565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613fd3565b610c74565b005b34801561040d57600080fd5b5061042860048036038101906104239190614000565b610d96565b6040516104359190613ee7565b60405180910390f35b34801561044a57600080fd5b50610453610e6f565b604051610460919061406f565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190613e8c565b610e78565b60405161049d9190613ee7565b60405180910390f35b3480156104b257600080fd5b506104bb610f2b565b005b3480156104c957600080fd5b506104d2610f96565b6040516104df9190614099565b60405180910390f35b3480156104f457600080fd5b506104fd610fba565b60405161050a9190613ee7565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190613f02565b610fcd565b6040516105479190613ee7565b60405180910390f35b34801561055c57600080fd5b50610577600480360381019061057291906141fc565b611023565b005b34801561058557600080fd5b506105a0600480360381019061059b9190613f02565b611231565b005b3480156105ae57600080fd5b506105c960048036038101906105c49190613d33565b611388565b005b3480156105d757600080fd5b506105e061148d565b6040516105ed9190613fb8565b60405180910390f35b34801561060257600080fd5b5061061d60048036038101906106189190613f02565b611493565b60405161062a9190613fb8565b60405180910390f35b34801561063f57600080fd5b506106486114db565b005b34801561065657600080fd5b5061065f611633565b60405161066c9190613ee7565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190614271565b6116ee565b005b3480156106aa57600080fd5b506106c560048036038101906106c091906141fc565b6117e0565b005b3480156106d357600080fd5b506106dc61190c565b005b3480156106ea57600080fd5b506106f36119c7565b6040516107009190614099565b60405180910390f35b34801561071557600080fd5b5061071e6119f1565b60405161072b9190613e0c565b60405180910390f35b34801561074057600080fd5b5061075b60048036038101906107569190614271565b611a83565b005b34801561076957600080fd5b50610784600480360381019061077f9190613e8c565b611bb7565b6040516107919190613ee7565b60405180910390f35b3480156107a657600080fd5b506107c160048036038101906107bc9190613e8c565b611c84565b6040516107ce9190613ee7565b60405180910390f35b3480156107e357600080fd5b506107fe60048036038101906107f99190613f02565b611ca2565b60405161080b9190613ee7565b60405180910390f35b34801561082057600080fd5b50610829611cc2565b6040516108369190613ee7565b60405180910390f35b34801561084b57600080fd5b5061086660048036038101906108619190614271565b611cd5565b005b34801561087457600080fd5b5061088f600480360381019061088a9190613fd3565b611e15565b005b34801561089d57600080fd5b506108a6611f37565b6040516108b39190613ee7565b60405180910390f35b3480156108c857600080fd5b506108d1611f4a565b6040516108de9190613fb8565b60405180910390f35b3480156108f357600080fd5b5061090e60048036038101906109099190613fd3565b611f50565b60405161091b9190613ee7565b60405180910390f35b34801561093057600080fd5b506109396120c0565b6040516109469190613fb8565b60405180910390f35b34801561095b57600080fd5b50610976600480360381019061097191906142b1565b6120c6565b6040516109839190613fb8565b60405180910390f35b34801561099857600080fd5b506109a161214d565b6040516109ae9190613fb8565b60405180910390f35b3480156109c357600080fd5b506109cc612153565b6040516109d99190613ee7565b60405180910390f35b3480156109ee57600080fd5b506109f761220e565b604051610a049190614099565b60405180910390f35b348015610a1957600080fd5b50610a346004803603810190610a2f9190613f02565b612234565b005b348015610a4257600080fd5b50610a4b6123fb565b604051610a589190613fb8565b60405180910390f35b610a6961245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610af8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aef9061433d565b60405180910390fd5b8160148190555080601581905550601554601454610b16919061438c565b6013819055505050565b606060038054610b2f90614411565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5b90614411565b8015610ba85780601f10610b7d57610100808354040283529160200191610ba8565b820191906000526020600020905b815481529060010190602001808311610b8b57829003601f168201915b5050505050905090565b6000610bc6610bbf61245f565b8484612467565b6001905092915050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60196020528060005260406000206000915054906101000a900460ff1681565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b610c7c61245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d029061433d565b60405180910390fd5b633b9aca006103e86001610d1d610c6a565b610d279190614443565b610d3191906144cc565b610d3b91906144cc565b811015610d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d749061456f565b60405180910390fd5b633b9aca0081610d8d9190614443565b600a8190555050565b6000610da3848484612632565b610e6484610daf61245f565b610e5f856040518060600160405280602881526020016152ef60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e1561245f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461333e9092919063ffffffff16565b612467565b600190509392505050565b60006009905090565b6000610f21610e8561245f565b84610f1c8560016000610e9661245f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461240190919063ffffffff16565b612467565b6001905092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610f93573d6000803e3d6000fd5b50565b7f0000000000000000000000003b594d450f6b953dc4a881ad4f1f57ec594d0f5a81565b600d60009054906101000a900460ff1681565b6000601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61102b61245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b19061433d565b60405180910390fd5b60005b815181101561122d577f0000000000000000000000003b594d450f6b953dc4a881ad4f1f57ec594d0f5a73ffffffffffffffffffffffffffffffffffffffff168282815181106111105761110f61458f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141580156111a257507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168282815181106111815761118061458f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b1561121a576001600660008484815181106111c0576111bf61458f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8080611225906145be565b9150506110bd565b5050565b61123961245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bf9061433d565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f5deb5ef622431f0df5a39b72dd556892f68ba42aa0f3aaf0800e166ce866492860405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61139061245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461141f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114169061433d565b60405180910390fd5b816011819055508060128190555060125460115461143d919061438c565b60108190555060076010541115611489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148090614653565b60405180910390fd5b5050565b60135481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114e361245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611572576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115699061433d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600061163d61245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c39061433d565b60405180910390fd5b6000600d60006101000a81548160ff0219169083151502179055506001905090565b6116f661245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c9061433d565b60405180910390fd5b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6117e861245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186e9061433d565b60405180910390fd5b60005b81518110156119085760006006600084848151811061189c5761189b61458f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611900906145be565b91505061187a565b5050565b61191461245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199a9061433d565b60405180910390fd5b6001600d60016101000a81548160ff02191690831515021790555042600881905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611a0090614411565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2c90614411565b8015611a795780601f10611a4e57610100808354040283529160200191611a79565b820191906000526020600020905b815481529060010190602001808311611a5c57829003601f168201915b5050505050905090565b611a8b61245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b119061433d565b60405180910390fd5b7f0000000000000000000000003b594d450f6b953dc4a881ad4f1f57ec594d0f5a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba0906146e5565b60405180910390fd5b611bb382826133a2565b5050565b6000611c7a611bc461245f565b84611c75856040518060600160405280602581526020016153176025913960016000611bee61245f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461333e9092919063ffffffff16565b612467565b6001905092915050565b6000611c98611c9161245f565b8484612632565b6001905092915050565b601a6020528060005260406000206000915054906101000a900460ff1681565b600d60019054906101000a900460ff1681565b611cdd61245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d639061433d565b60405180910390fd5b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611e099190613ee7565b60405180910390a25050565b611e1d61245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea39061433d565b60405180910390fd5b633b9aca006103e86005611ebe610c6a565b611ec89190614443565b611ed291906144cc565b611edc91906144cc565b811015611f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1590614777565b60405180910390fd5b633b9aca0081611f2e9190614443565b600c8190555050565b600f60009054906101000a900460ff1681565b600a5481565b6000611f5a61245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe09061433d565b60405180910390fd5b620186a06001611ff7610c6a565b6120019190614443565b61200b91906144cc565b82101561204d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204490614809565b60405180910390fd5b6103e8600561205a610c6a565b6120649190614443565b61206e91906144cc565b8211156120b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a79061489b565b60405180910390fd5b81600b8190555060019050919050565b60105481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600b5481565b600061215d61245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e39061433d565b60405180910390fd5b6000600f60006101000a81548160ff0219169083151502179055506001905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61223c61245f565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c29061433d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561233b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123329061492d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b6000808284612410919061438c565b905083811015612455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244c90614999565b60405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ce90614a2b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253e90614abd565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516126259190613fb8565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269990614b4f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270990614be1565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561279f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279690614c99565b60405180910390fd5b60008114156127b9576127b483836000613443565b613339565b60085442141561281c576001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600d60009054906101000a900460ff1615612edf576128396119c7565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156128a757506128776119c7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156128e05750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561291a575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156129335750600760009054906101000a900460ff16155b15612ede57600d60019054906101000a900460ff16612a2d57601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806129ed5750601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2390614d05565b60405180910390fd5b5b600f60009054906101000a900460ff1615612bf557612a4a6119c7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015612ad157507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612b2957507f0000000000000000000000003b594d450f6b953dc4a881ad4f1f57ec594d0f5a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612bf45743600e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba690614dbd565b60405180910390fd5b43600e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612c985750601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612d3f57600a54811115612ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd990614e4f565b60405180910390fd5b600c54612cee83611493565b82612cf9919061438c565b1115612d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3190614ebb565b60405180910390fd5b612edd565b601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612de25750601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612e3157600a54811115612e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2390614f4d565b60405180910390fd5b612edc565b601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612edb57600c54612e8e83611493565b82612e99919061438c565b1115612eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed190614ebb565b60405180910390fd5b5b5b5b5b5b6000612eea30611493565b90506000600b548210159050808015612f105750600760009054906101000a900460ff16155b8015612f665750601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612fbc5750601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156130125750601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613056576001600760006101000a81548160ff02191690831515021790555061303a6136d8565b6000600760006101000a81548160ff0219169083151502179055505b6000600760009054906101000a900460ff16159050601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061310c5750601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561311657600090505b6000811561332957601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561317957506000601354115b15613213576131a660646131986013548861385490919063ffffffff16565b6138cf90919063ffffffff16565b9050601354601554826131b99190614443565b6131c391906144cc565b601760008282546131d4919061438c565b92505081905550601354601454826131ec9190614443565b6131f691906144cc565b60166000828254613207919061438c565b92505081905550613305565b601a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561326e57506000601054115b156133045761329b606461328d6010548861385490919063ffffffff16565b6138cf90919063ffffffff16565b9050601054601254826132ae9190614443565b6132b891906144cc565b601760008282546132c9919061438c565b92505081905550601054601154826132e19190614443565b6132eb91906144cc565b601660008282546132fc919061438c565b925050819055505b5b600081111561331a57613319873083613443565b5b80856133269190614f6d565b94505b613334878787613443565b505050505b505050565b6000838311158290613386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337d9190613e0c565b60405180910390fd5b50600083856133959190614f6d565b9050809150509392505050565b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134aa90614b4f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351a90614be1565b60405180910390fd5b61352e838383613919565b613599816040518060600160405280602681526020016152c9602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461333e9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061362c816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461240190919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516136cb9190613fb8565b60405180910390a3505050565b60006136e330611493565b905060006016546017546136f7919061438c565b905060008214806137085750600081145b15613714575050613852565b6014600b546137239190614443565b82111561373c576014600b546137399190614443565b91505b60006002826017548561374f9190614443565b61375991906144cc565b61376391906144cc565b9050600061377a828561391e90919063ffffffff16565b9050600047905061378a82613968565b600061379f824761391e90919063ffffffff16565b905060006137ca866137bc6016548561385490919063ffffffff16565b6138cf90919063ffffffff16565b9050600081836137da9190614f6d565b9050600060178190555060006016819055506000861180156137fc5750600081115b156138495761380b8682613ba5565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561858260175460405161384093929190614fa1565b60405180910390a15b50505050505050505b565b60008083141561386757600090506138c9565b600082846138759190614443565b905082848261388491906144cc565b146138c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138bb9061504a565b60405180910390fd5b809150505b92915050565b600061391183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c86565b905092915050565b505050565b600061396083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061333e565b905092915050565b6000600267ffffffffffffffff811115613985576139846140b9565b5b6040519080825280602002602001820160405280156139b35781602001602082028036833780820191505090505b50905030816000815181106139cb576139ca61458f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a94919061507f565b81600181518110613aa857613aa761458f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613b0d307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612467565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613b6f9594939291906151a5565b600060405180830381600087803b158015613b8957600080fd5b505af1158015613b9d573d6000803e3d6000fd5b505050505050565b613bd0307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612467565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080613c1a6119c7565b426040518863ffffffff1660e01b8152600401613c3c969594939291906151ff565b60606040518083038185885af1158015613c5a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613c7f9190615275565b5050505050565b60008083118290613ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cc49190613e0c565b60405180910390fd5b5060008385613cdc91906144cc565b9050809150509392505050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b613d1081613cfd565b8114613d1b57600080fd5b50565b600081359050613d2d81613d07565b92915050565b60008060408385031215613d4a57613d49613cf3565b5b6000613d5885828601613d1e565b9250506020613d6985828601613d1e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613dad578082015181840152602081019050613d92565b83811115613dbc576000848401525b50505050565b6000601f19601f8301169050919050565b6000613dde82613d73565b613de88185613d7e565b9350613df8818560208601613d8f565b613e0181613dc2565b840191505092915050565b60006020820190508181036000830152613e268184613dd3565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e5982613e2e565b9050919050565b613e6981613e4e565b8114613e7457600080fd5b50565b600081359050613e8681613e60565b92915050565b60008060408385031215613ea357613ea2613cf3565b5b6000613eb185828601613e77565b9250506020613ec285828601613d1e565b9150509250929050565b60008115159050919050565b613ee181613ecc565b82525050565b6000602082019050613efc6000830184613ed8565b92915050565b600060208284031215613f1857613f17613cf3565b5b6000613f2684828501613e77565b91505092915050565b6000819050919050565b6000613f54613f4f613f4a84613e2e565b613f2f565b613e2e565b9050919050565b6000613f6682613f39565b9050919050565b6000613f7882613f5b565b9050919050565b613f8881613f6d565b82525050565b6000602082019050613fa36000830184613f7f565b92915050565b613fb281613cfd565b82525050565b6000602082019050613fcd6000830184613fa9565b92915050565b600060208284031215613fe957613fe8613cf3565b5b6000613ff784828501613d1e565b91505092915050565b60008060006060848603121561401957614018613cf3565b5b600061402786828701613e77565b935050602061403886828701613e77565b925050604061404986828701613d1e565b9150509250925092565b600060ff82169050919050565b61406981614053565b82525050565b60006020820190506140846000830184614060565b92915050565b61409381613e4e565b82525050565b60006020820190506140ae600083018461408a565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6140f182613dc2565b810181811067ffffffffffffffff821117156141105761410f6140b9565b5b80604052505050565b6000614123613ce9565b905061412f82826140e8565b919050565b600067ffffffffffffffff82111561414f5761414e6140b9565b5b602082029050602081019050919050565b600080fd5b600061417861417384614134565b614119565b9050808382526020820190506020840283018581111561419b5761419a614160565b5b835b818110156141c457806141b08882613e77565b84526020840193505060208101905061419d565b5050509392505050565b600082601f8301126141e3576141e26140b4565b5b81356141f3848260208601614165565b91505092915050565b60006020828403121561421257614211613cf3565b5b600082013567ffffffffffffffff8111156142305761422f613cf8565b5b61423c848285016141ce565b91505092915050565b61424e81613ecc565b811461425957600080fd5b50565b60008135905061426b81614245565b92915050565b6000806040838503121561428857614287613cf3565b5b600061429685828601613e77565b92505060206142a78582860161425c565b9150509250929050565b600080604083850312156142c8576142c7613cf3565b5b60006142d685828601613e77565b92505060206142e785828601613e77565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614327602083613d7e565b9150614332826142f1565b602082019050919050565b600060208201905081810360008301526143568161431a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061439782613cfd565b91506143a283613cfd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143d7576143d661435d565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061442957607f821691505b6020821081141561443d5761443c6143e2565b5b50919050565b600061444e82613cfd565b915061445983613cfd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144925761449161435d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144d782613cfd565b91506144e283613cfd565b9250826144f2576144f161449d565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060008201527f6c6f776572207468616e20302e31250000000000000000000000000000000000602082015250565b6000614559602f83613d7e565b9150614564826144fd565b604082019050919050565b600060208201905081810360008301526145888161454c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006145c982613cfd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145fc576145fb61435d565b5b600182019050919050565b7f4d757374206b6565702066656573206174203725206f72206c65737300000000600082015250565b600061463d601c83613d7e565b915061464882614607565b602082019050919050565b6000602082019050818103600083015261466c81614630565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b60006146cf603983613d7e565b91506146da82614673565b604082019050919050565b600060208201905081810360008301526146fe816146c2565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b6000614761602483613d7e565b915061476c82614705565b604082019050919050565b6000602082019050818103600083015261479081614754565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b60006147f3603583613d7e565b91506147fe82614797565b604082019050919050565b60006020820190508181036000830152614822816147e6565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b6000614885603483613d7e565b915061489082614829565b604082019050919050565b600060208201905081810360008301526148b481614878565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614917602683613d7e565b9150614922826148bb565b604082019050919050565b600060208201905081810360008301526149468161490a565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614983601b83613d7e565b915061498e8261494d565b602082019050919050565b600060208201905081810360008301526149b281614976565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614a15602483613d7e565b9150614a20826149b9565b604082019050919050565b60006020820190508181036000830152614a4481614a08565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614aa7602283613d7e565b9150614ab282614a4b565b604082019050919050565b60006020820190508181036000830152614ad681614a9a565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614b39602583613d7e565b9150614b4482614add565b604082019050919050565b60006020820190508181036000830152614b6881614b2c565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614bcb602383613d7e565b9150614bd682614b6f565b604082019050919050565b60006020820190508181036000830152614bfa81614bbe565b9050919050565b7f596f7572206164647265737320686173206265656e206d61726b65642061732060008201527f6120736e697065722c20796f752061726520756e61626c6520746f207472616e60208201527f73666572206f7220737761702e00000000000000000000000000000000000000604082015250565b6000614c83604d83613d7e565b9150614c8e82614c01565b606082019050919050565b60006020820190508181036000830152614cb281614c76565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b6000614cef601683613d7e565b9150614cfa82614cb9565b602082019050919050565b60006020820190508181036000830152614d1e81614ce2565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b6000614da7604983613d7e565b9150614db282614d25565b606082019050919050565b60006020820190508181036000830152614dd681614d9a565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b6000614e39603583613d7e565b9150614e4482614ddd565b604082019050919050565b60006020820190508181036000830152614e6881614e2c565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b6000614ea5601383613d7e565b9150614eb082614e6f565b602082019050919050565b60006020820190508181036000830152614ed481614e98565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b6000614f37603683613d7e565b9150614f4282614edb565b604082019050919050565b60006020820190508181036000830152614f6681614f2a565b9050919050565b6000614f7882613cfd565b9150614f8383613cfd565b925082821015614f9657614f9561435d565b5b828203905092915050565b6000606082019050614fb66000830186613fa9565b614fc36020830185613fa9565b614fd06040830184613fa9565b949350505050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000615034602183613d7e565b915061503f82614fd8565b604082019050919050565b6000602082019050818103600083015261506381615027565b9050919050565b60008151905061507981613e60565b92915050565b60006020828403121561509557615094613cf3565b5b60006150a38482850161506a565b91505092915050565b6000819050919050565b60006150d16150cc6150c7846150ac565b613f2f565b613cfd565b9050919050565b6150e1816150b6565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61511c81613e4e565b82525050565b600061512e8383615113565b60208301905092915050565b6000602082019050919050565b6000615152826150e7565b61515c81856150f2565b935061516783615103565b8060005b8381101561519857815161517f8882615122565b975061518a8361513a565b92505060018101905061516b565b5085935050505092915050565b600060a0820190506151ba6000830188613fa9565b6151c760208301876150d8565b81810360408301526151d98186615147565b90506151e8606083018561408a565b6151f56080830184613fa9565b9695505050505050565b600060c082019050615214600083018961408a565b6152216020830188613fa9565b61522e60408301876150d8565b61523b60608301866150d8565b615248608083018561408a565b61525560a0830184613fa9565b979650505050505050565b60008151905061526f81613d07565b92915050565b60008060006060848603121561528e5761528d613cf3565b5b600061529c86828701615260565b93505060206152ad86828701615260565b92505060406152be86828701615260565b915050925092509256fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e7f994dc752259b5411f29255f05604f8f5d02b7e88fc2437cbe21135b9c2d0064736f6c634300080b0033

Deployed Bytecode Sourcemap

17548:14207:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23314:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4967:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5880:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24989:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18730:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17622:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5287:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22403:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6057:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5187:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6420:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31613:102;;;;;;;;;;;;;:::i;:::-;;17680:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18002:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24350:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24487:294;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24185:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23018:284;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18418:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5403:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10922:148;;;;;;;;;;;;;:::i;:::-;;21613:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22862:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24793:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21434:123;;;;;;;;;;;;;:::i;:::-;;10708:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5075:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23733:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6646:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5538:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18952:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18042:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23543:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22641:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18258:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17879:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22009:382;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18306:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5721:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17921:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21799:135;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17842:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11078:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17961:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23314:221;10845:12;:10;:12::i;:::-;10835:22;;:6;;;;;;;;;;;:22;;;10827:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;23420:6:::1;23406:11;:20;;;;23457:12;23437:17;:32;;;;23510:17;;23496:11;;:31;;;;:::i;:::-;23480:13;:47;;;;23314:221:::0;;:::o;4967:100::-;5021:13;5054:5;5047:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4967:100;:::o;5880:169::-;5963:4;5980:39;5989:12;:10;:12::i;:::-;6003:7;6012:6;5980:8;:39::i;:::-;6037:4;6030:11;;5880:169;;;;:::o;24989:100::-;25042:4;25066:9;:15;25076:4;25066:15;;;;;;;;;;;;;;;;;;;;;;;;;25059:22;;24989:100;;;:::o;18730:64::-;;;;;;;;;;;;;;;;;;;;;;:::o;17622:51::-;;;:::o;5287:108::-;5348:7;5375:12;;5368:19;;5287:108;:::o;22403:230::-;10845:12;:10;:12::i;:::-;10835:22;;:6;;;;;;;;;;;:22;;;10827:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;22524:3:::1;22516:4;22512:1;22496:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;22495:32;;;;:::i;:::-;22485:6;:42;;22477:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;22622:3;22613:6;:12;;;;:::i;:::-;22590:20;:35;;;;22403:230:::0;:::o;6057:355::-;6197:4;6214:36;6224:6;6232:9;6243:6;6214:9;:36::i;:::-;6261:121;6270:6;6278:12;:10;:12::i;:::-;6292:89;6330:6;6292:89;;;;;;;;;;;;;;;;;:11;:19;6304:6;6292:19;;;;;;;;;;;;;;;:33;6312:12;:10;:12::i;:::-;6292:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;6261:8;:121::i;:::-;6400:4;6393:11;;6057:355;;;;;:::o;5187:92::-;5245:5;5270:1;5263:8;;5187:92;:::o;6420:218::-;6508:4;6525:83;6534:12;:10;:12::i;:::-;6548:7;6557:50;6596:10;6557:11;:25;6569:12;:10;:12::i;:::-;6557:25;;;;;;;;;;;;;;;:34;6583:7;6557:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;6525:8;:83::i;:::-;6626:4;6619:11;;6420:218;;;;:::o;31613:102::-;31665:9;;;;;;;;;;;31657:27;;:50;31685:21;31657:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31613:102::o;17680:38::-;;;:::o;18002:33::-;;;;;;;;;;;;;:::o;24350:125::-;24415:4;24439:19;:28;24459:7;24439:28;;;;;;;;;;;;;;;;;;;;;;;;;24432:35;;24350:125;;;:::o;24487:294::-;10845:12;:10;:12::i;:::-;10835:22;;:6;;;;;;;;;;;:22;;;10827:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24569:6:::1;24564:210;24585:8;:15;24581:1;:19;24564:210;;;24641:13;24626:28;;:8;24635:1;24626:11;;;;;;;;:::i;:::-;;;;;;;;:28;;;;:71;;;;;24681:15;24658:39;;:8;24667:1;24658:11;;;;;;;;:::i;:::-;;;;;;;;:39;;;;24626:71;24622:141;;;24743:4;24718:9;:22;24728:8;24737:1;24728:11;;;;;;;;:::i;:::-;;;;;;;;24718:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;24622:141;24602:3;;;;;:::i;:::-;;;;24564:210;;;;24487:294:::0;:::o;24185:157::-;10845:12;:10;:12::i;:::-;10835:22;;:6;;;;;;;;;;;:22;;;10827:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24292:9:::1;;;;;;;;;;;24264:38;;24281:9;24264:38;;;;;;;;;;;;24325:9;24313;;:21;;;;;;;;;;;;;;;;;;24185:157:::0;:::o;23018:284::-;10845:12;:10;:12::i;:::-;10835:22;;:6;;;;;;;;;;;:22;;;10827:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;23122:6:::1;23109:10;:19;;;;23158:12;23139:16;:31;;;;23209:16;;23196:10;;:29;;;;:::i;:::-;23181:12;:44;;;;23260:1;23244:12;;:17;;23236:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;23018:284:::0;;:::o;18418:28::-;;;;:::o;5403:127::-;5477:7;5504:9;:18;5514:7;5504:18;;;;;;;;;;;;;;;;5497:25;;5403:127;;;:::o;10922:148::-;10845:12;:10;:12::i;:::-;10835:22;;:6;;;;;;;;;;;:22;;;10827:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;11029:1:::1;10992:40;;11013:6;;;;;;;;;;;10992:40;;;;;;;;;;;;11060:1;11043:6;;:19;;;;;;;;;;;;;;;;;;10922:148::o:0;21613:121::-;21665:4;10845:12;:10;:12::i;:::-;10835:22;;:6;;;;;;;;;;;:22;;;10827:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;21699:5:::1;21682:14;;:22;;;;;;;;;;;;;;;;;;21722:4;21715:11;;21613:121:::0;:::o;22862:144::-;10845:12;:10;:12::i;:::-;10835:22;;:6;;;;;;;;;;;:22;;;10827:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;22994:4:::1;22952:31;:39;22984:6;22952:39;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;22862:144:::0;;:::o;24793:184::-;10845:12;:10;:12::i;:::-;10835:22;;:6;;;;;;;;;;;:22;;;10827:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24875:6:::1;24870:100;24891:8;:15;24887:1;:19;24870:100;;;24953:5;24928:9;:22;24938:8;24947:1;24938:11;;;;;;;;:::i;:::-;;;;;;;;24928:22;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;24908:3;;;;;:::i;:::-;;;;24870:100;;;;24793:184:::0;:::o;21434:123::-;10845:12;:10;:12::i;:::-;10835:22;;:6;;;;;;;;;;;:22;;;10827:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;21505:4:::1;21489:13;;:20;;;;;;;;;;;;;;;;;;21534:15;21520:11;:29;;;;21434:123::o:0;10708:79::-;10746:7;10773:6;;;;;;;;;;;10766:13;;10708:79;:::o;5075:104::-;5131:13;5164:7;5157:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5075:104;:::o;23733:244::-;10845:12;:10;:12::i;:::-;10835:22;;:6;;;;;;;;;;;:22;;;10827:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;23840:13:::1;23832:21;;:4;:21;;;;23824:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;23928:41;23957:4;23963:5;23928:28;:41::i;:::-;23733:244:::0;;:::o;6646:269::-;6739:4;6756:129;6765:12;:10;:12::i;:::-;6779:7;6788:96;6827:15;6788:96;;;;;;;;;;;;;;;;;:11;:25;6800:12;:10;:12::i;:::-;6788:25;;;;;;;;;;;;;;;:34;6814:7;6788:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;6756:8;:129::i;:::-;6903:4;6896:11;;6646:269;;;;:::o;5538:175::-;5624:4;5641:42;5651:12;:10;:12::i;:::-;5665:9;5676:6;5641:9;:42::i;:::-;5701:4;5694:11;;5538:175;;;;:::o;18952:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;18042:25::-;;;;;;;;;;;;;:::o;23543:182::-;10845:12;:10;:12::i;:::-;10835:22;;:6;;;;;;;;;;;:22;;;10827:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;23659:8:::1;23628:19;:28;23648:7;23628:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;23699:7;23683:34;;;23708:8;23683:34;;;;;;:::i;:::-;;;;;;;;23543:182:::0;;:::o;22641:209::-;10845:12;:10;:12::i;:::-;10835:22;;:6;;;;;;;;;;;:22;;;10827:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;22763:3:::1;22757:4;22753:1;22737:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;22736:30;;;;:::i;:::-;22726:6;:40;;22718:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;22839:3;22830:6;:12;;;;:::i;:::-;22818:9;:24;;;;22641:209:::0;:::o;18258:39::-;;;;;;;;;;;;;:::o;17879:35::-;;;;:::o;22009:382::-;22090:4;10845:12;:10;:12::i;:::-;10835:22;;:6;;;;;;;;;;;:22;;;10827:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;22147:6:::1;22143:1;22127:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:26;;;;:::i;:::-;22114:9;:39;;22106:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;22262:4;22258:1;22242:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;22229:9;:37;;22221:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;22354:9;22333:18;:30;;;;22380:4;22373:11;;22009:382:::0;;;:::o;18306:27::-;;;;:::o;5721:151::-;5810:7;5837:11;:18;5849:5;5837:18;;;;;;;;;;;;;;;:27;5856:7;5837:27;;;;;;;;;;;;;;;;5830:34;;5721:151;;;;:::o;17921:33::-;;;;:::o;21799:135::-;21859:4;10845:12;:10;:12::i;:::-;10835:22;;:6;;;;;;;;;;;:22;;;10827:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;21899:5:::1;21876:20;;:28;;;;;;;;;;;;;;;;;;21922:4;21915:11;;21799:135:::0;:::o;17842:24::-;;;;;;;;;;;;;:::o;11078:244::-;10845:12;:10;:12::i;:::-;10835:22;;:6;;;;;;;;;;;:22;;;10827:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;11187:1:::1;11167:22;;:8;:22;;;;11159:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11277:8;11248:38;;11269:6;;;;;;;;;;;11248:38;;;;;;;;;;;;11306:8;11297:6;;:17;;;;;;;;;;;;;;;;;;11078:244:::0;:::o;17961:24::-;;;;:::o;8860:181::-;8918:7;8938:9;8954:1;8950;:5;;;;:::i;:::-;8938:17;;8979:1;8974;:6;;8966:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;9032:1;9025:8;;;8860:181;;;;:::o;136:98::-;189:7;216:10;209:17;;136:98;:::o;8316:380::-;8469:1;8452:19;;:5;:19;;;;8444:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8550:1;8531:21;;:7;:21;;;;8523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8634:6;8604:11;:18;8616:5;8604:18;;;;;;;;;;;;;;;:27;8623:7;8604:27;;;;;;;;;;;;;;;:36;;;;8672:7;8656:32;;8665:5;8656:32;;;8681:6;8656:32;;;;;;:::i;:::-;;;;;;;;8316:380;;;:::o;25097:4107::-;25245:1;25229:18;;:4;:18;;;;25221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25322:1;25308:16;;:2;:16;;;;25300:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;25384:9;:15;25394:4;25384:15;;;;;;;;;;;;;;;;;;;;;;;;;25383:16;25375:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;25517:1;25507:6;:11;25503:93;;;25535:28;25551:4;25557:2;25561:1;25535:15;:28::i;:::-;25578:7;;25503:93;25639:11;;25620:15;:30;25616:56;;;25668:4;25652:9;:13;25662:2;25652:13;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;25616:56;25697:14;;;;;;;;;;;25693:1838;;;25758:7;:5;:7::i;:::-;25750:15;;:4;:15;;;;:49;;;;;25792:7;:5;:7::i;:::-;25786:13;;:2;:13;;;;25750:49;:86;;;;;25834:1;25820:16;;:2;:16;;;;25750:86;:128;;;;;25871:6;25857:21;;:2;:21;;;;25750:128;:159;;;;;25900:9;;;;;;;;;;;25899:10;25750:159;25728:1792;;;25949:13;;;;;;;;;;;25944:150;;25995:19;:25;26015:4;25995:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;26024:19;:23;26044:2;26024:23;;;;;;;;;;;;;;;;;;;;;;;;;25995:52;25987:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;25944:150;26252:20;;;;;;;;;;;26248:423;;;26306:7;:5;:7::i;:::-;26300:13;;:2;:13;;;;:47;;;;;26331:15;26317:30;;:2;:30;;;;26300:47;:79;;;;;26365:13;26351:28;;:2;:28;;;;26300:79;26296:356;;;26457:12;26415:28;:39;26444:9;26415:39;;;;;;;;;;;;;;;;:54;26407:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;26616:12;26574:28;:39;26603:9;26574:39;;;;;;;;;;;;;;;:54;;;;26296:356;26248:423;26741:25;:31;26767:4;26741:31;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;26777:31;:35;26809:2;26777:35;;;;;;;;;;;;;;;;;;;;;;;;;26776:36;26741:71;26737:768;;;26855:20;;26845:6;:30;;26837:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;26990:9;;26973:13;26983:2;26973:9;:13::i;:::-;26964:6;:22;;;;:::i;:::-;:35;;26956:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26737:768;;;27118:25;:29;27144:2;27118:29;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;27152:31;:37;27184:4;27152:37;;;;;;;;;;;;;;;;;;;;;;;;;27151:38;27118:71;27114:391;;;27232:20;;27222:6;:30;;27214:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;27114:391;;;27359:31;:35;27391:2;27359:35;;;;;;;;;;;;;;;;;;;;;;;;;27354:151;;27452:9;;27435:13;27445:2;27435:9;:13::i;:::-;27426:6;:22;;;;:::i;:::-;:35;;27418:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27354:151;27114:391;26737:768;25728:1792;25693:1838;27545:28;27576:24;27594:4;27576:9;:24::i;:::-;27545:55;;27611:12;27650:18;;27626:20;:42;;27611:57;;27697:7;:34;;;;;27722:9;;;;;;;;;;;27721:10;27697:34;:83;;;;;27749:25;:31;27775:4;27749:31;;;;;;;;;;;;;;;;;;;;;;;;;27748:32;27697:83;:126;;;;;27798:19;:25;27818:4;27798:25;;;;;;;;;;;;;;;;;;;;;;;;;27797:26;27697:126;:167;;;;;27841:19;:23;27861:2;27841:23;;;;;;;;;;;;;;;;;;;;;;;;;27840:24;27697:167;27679:297;;;27903:4;27891:9;;:16;;;;;;;;;;;;;;;;;;27922:10;:8;:10::i;:::-;27959:5;27947:9;;:17;;;;;;;;;;;;;;;;;;27679:297;27988:12;28004:9;;;;;;;;;;;28003:10;27988:25;;28115:19;:25;28135:4;28115:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;28144:19;:23;28164:2;28144:23;;;;;;;;;;;;;;;;;;;;;;;;;28115:52;28111:100;;;28194:5;28184:15;;28111:100;28231:12;28336:7;28332:819;;;28388:25;:29;28414:2;28388:29;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;;28437:1;28421:13;;:17;28388:50;28384:600;;;28466:34;28496:3;28466:25;28477:13;;28466:6;:10;;:25;;;;:::i;:::-;:29;;:34;;;;:::i;:::-;28459:41;;28569:13;;28549:17;;28542:4;:24;;;;:::i;:::-;:40;;;;:::i;:::-;28519:19;;:63;;;;;;;:::i;:::-;;;;;;;;28639:13;;28625:11;;28618:4;:18;;;;:::i;:::-;:34;;;;:::i;:::-;28601:13;;:51;;;;;;;:::i;:::-;;;;;;;;28384:600;;;28714:25;:31;28740:4;28714:31;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;;28764:1;28749:12;;:16;28714:51;28710:274;;;28790:33;28819:3;28790:24;28801:12;;28790:6;:10;;:24;;;;:::i;:::-;:28;;:33;;;;:::i;:::-;28783:40;;28888:12;;28869:16;;28862:4;:23;;;;:::i;:::-;:38;;;;:::i;:::-;28839:19;;:61;;;;;;;:::i;:::-;;;;;;;;28956:12;;28943:10;;28936:4;:17;;;;:::i;:::-;:32;;;;:::i;:::-;28919:13;;:49;;;;;;;:::i;:::-;;;;;;;;28710:274;28384:600;29023:1;29016:4;:8;29012:91;;;29045:42;29061:4;29075;29082;29045:15;:42::i;:::-;29012:91;29135:4;29125:14;;;;;:::i;:::-;;;28332:819;29163:33;29179:4;29185:2;29189:6;29163:15;:33::i;:::-;25210:3994;;;;25097:4107;;;;:::o;9193:192::-;9279:7;9312:1;9307;:6;;9315:12;9299:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;9339:9;9355:1;9351;:5;;;;:::i;:::-;9339:17;;9376:1;9369:8;;;9193:192;;;;;:::o;23985:188::-;24102:5;24068:25;:31;24094:4;24068:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;24159:5;24125:40;;24153:4;24125:40;;;;;;;;;;;;23985:188;;:::o;6923:573::-;7081:1;7063:20;;:6;:20;;;;7055:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;7165:1;7144:23;;:9;:23;;;;7136:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;7220:47;7241:6;7249:9;7260:6;7220:20;:47::i;:::-;7300:71;7322:6;7300:71;;;;;;;;;;;;;;;;;:9;:17;7310:6;7300:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;7280:9;:17;7290:6;7280:17;;;;;;;;;;;;;;;:91;;;;7405:32;7430:6;7405:9;:20;7415:9;7405:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;7382:9;:20;7392:9;7382:20;;;;;;;;;;;;;;;:55;;;;7470:9;7453:35;;7462:6;7453:35;;;7481:6;7453:35;;;;;;:::i;:::-;;;;;;;;6923:573;;;:::o;30336:1269::-;30375:23;30401:24;30419:4;30401:9;:24::i;:::-;30375:50;;30436:25;30486:13;;30464:19;;:35;;;;:::i;:::-;30436:63;;30543:1;30524:15;:20;:46;;;;30569:1;30548:17;:22;30524:46;30520:59;;;30572:7;;;;30520:59;30632:2;30611:18;;:23;;;;:::i;:::-;30593:15;:41;30589:113;;;30688:2;30667:18;;:23;;;;:::i;:::-;30649:41;;30589:113;30771:23;30857:1;30837:17;30815:19;;30797:15;:37;;;;:::i;:::-;:57;;;;:::i;:::-;:61;;;;:::i;:::-;30771:87;;30869:26;30898:36;30918:15;30898;:19;;:36;;;;:::i;:::-;30869:65;;30955:25;30983:21;30955:49;;31017:37;31035:18;31017:17;:37::i;:::-;31076:18;31097:44;31123:17;31097:21;:25;;:44;;;;:::i;:::-;31076:65;;31152:17;31172:52;31206:17;31172:29;31187:13;;31172:10;:14;;:29;;;;:::i;:::-;:33;;:52;;;;:::i;:::-;31152:72;;31235:23;31274:9;31261:10;:22;;;;:::i;:::-;31235:48;;31326:1;31304:19;:23;;;;31354:1;31338:13;:17;;;;31406:1;31388:15;:19;:42;;;;;31429:1;31411:15;:19;31388:42;31384:214;;;31447:47;31461:15;31478;31447:13;:47::i;:::-;31514:72;31529:18;31549:15;31566:19;;31514:72;;;;;;;;:::i;:::-;;;;;;;;31384:214;30364:1241;;;;;;;;30336:1269;:::o;9393:250::-;9451:7;9480:1;9475;:6;9471:47;;;9505:1;9498:8;;;;9471:47;9530:9;9546:1;9542;:5;;;;:::i;:::-;9530:17;;9575:1;9570;9566;:5;;;;:::i;:::-;:10;9558:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;9634:1;9627:8;;;9393:250;;;;;:::o;9651:132::-;9709:7;9736:39;9740:1;9743;9736:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;9729:46;;9651:132;;;;:::o;8704:125::-;;;;:::o;9049:136::-;9107:7;9134:43;9138:1;9141;9134:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;9127:50;;9049:136;;;;:::o;29212:590::-;29339:21;29377:1;29363:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29339:40;;29408:4;29390;29395:1;29390:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;29434:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29424:4;29429:1;29424:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;29469:62;29486:4;29501:15;29519:11;29469:8;:62::i;:::-;29570:15;:66;;;29651:11;29677:1;29721:4;29748;29768:15;29570:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29268:534;29212:590;:::o;29814:514::-;29963:62;29980:4;29995:15;30013:11;29963:8;:62::i;:::-;30068:15;:31;;;30107:9;30140:4;30160:11;30186:1;30229;30272:7;:5;:7::i;:::-;30294:15;30068:252;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;29814:514;;:::o;9791:278::-;9877:7;9909:1;9905;:5;9912:12;9897:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;9936:9;9952:1;9948;:5;;;;:::i;:::-;9936:17;;10060:1;10053:8;;;9791:278;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:474::-;758:6;766;815:2;803:9;794:7;790:23;786:32;783:119;;;821:79;;:::i;:::-;783:119;941:1;966:53;1011:7;1002:6;991:9;987:22;966:53;:::i;:::-;956:63;;912:117;1068:2;1094:53;1139:7;1130:6;1119:9;1115:22;1094:53;:::i;:::-;1084:63;;1039:118;690:474;;;;;:::o;1170:99::-;1222:6;1256:5;1250:12;1240:22;;1170:99;;;:::o;1275:169::-;1359:11;1393:6;1388:3;1381:19;1433:4;1428:3;1424:14;1409:29;;1275:169;;;;:::o;1450:307::-;1518:1;1528:113;1542:6;1539:1;1536:13;1528:113;;;1627:1;1622:3;1618:11;1612:18;1608:1;1603:3;1599:11;1592:39;1564:2;1561:1;1557:10;1552:15;;1528:113;;;1659:6;1656:1;1653:13;1650:101;;;1739:1;1730:6;1725:3;1721:16;1714:27;1650:101;1499:258;1450:307;;;:::o;1763:102::-;1804:6;1855:2;1851:7;1846:2;1839:5;1835:14;1831:28;1821:38;;1763:102;;;:::o;1871:364::-;1959:3;1987:39;2020:5;1987:39;:::i;:::-;2042:71;2106:6;2101:3;2042:71;:::i;:::-;2035:78;;2122:52;2167:6;2162:3;2155:4;2148:5;2144:16;2122:52;:::i;:::-;2199:29;2221:6;2199:29;:::i;:::-;2194:3;2190:39;2183:46;;1963:272;1871:364;;;;:::o;2241:313::-;2354:4;2392:2;2381:9;2377:18;2369:26;;2441:9;2435:4;2431:20;2427:1;2416:9;2412:17;2405:47;2469:78;2542:4;2533:6;2469:78;:::i;:::-;2461:86;;2241:313;;;;:::o;2560:126::-;2597:7;2637:42;2630:5;2626:54;2615:65;;2560:126;;;:::o;2692:96::-;2729:7;2758:24;2776:5;2758:24;:::i;:::-;2747:35;;2692:96;;;:::o;2794:122::-;2867:24;2885:5;2867:24;:::i;:::-;2860:5;2857:35;2847:63;;2906:1;2903;2896:12;2847:63;2794:122;:::o;2922:139::-;2968:5;3006:6;2993:20;2984:29;;3022:33;3049:5;3022:33;:::i;:::-;2922:139;;;;:::o;3067:474::-;3135:6;3143;3192:2;3180:9;3171:7;3167:23;3163:32;3160:119;;;3198:79;;:::i;:::-;3160:119;3318:1;3343:53;3388:7;3379:6;3368:9;3364:22;3343:53;:::i;:::-;3333:63;;3289:117;3445:2;3471:53;3516:7;3507:6;3496:9;3492:22;3471:53;:::i;:::-;3461:63;;3416:118;3067:474;;;;;:::o;3547:90::-;3581:7;3624:5;3617:13;3610:21;3599:32;;3547:90;;;:::o;3643:109::-;3724:21;3739:5;3724:21;:::i;:::-;3719:3;3712:34;3643:109;;:::o;3758:210::-;3845:4;3883:2;3872:9;3868:18;3860:26;;3896:65;3958:1;3947:9;3943:17;3934:6;3896:65;:::i;:::-;3758:210;;;;:::o;3974:329::-;4033:6;4082:2;4070:9;4061:7;4057:23;4053:32;4050:119;;;4088:79;;:::i;:::-;4050:119;4208:1;4233:53;4278:7;4269:6;4258:9;4254:22;4233:53;:::i;:::-;4223:63;;4179:117;3974:329;;;;:::o;4309:60::-;4337:3;4358:5;4351:12;;4309:60;;;:::o;4375:142::-;4425:9;4458:53;4476:34;4485:24;4503:5;4485:24;:::i;:::-;4476:34;:::i;:::-;4458:53;:::i;:::-;4445:66;;4375:142;;;:::o;4523:126::-;4573:9;4606:37;4637:5;4606:37;:::i;:::-;4593:50;;4523:126;;;:::o;4655:153::-;4732:9;4765:37;4796:5;4765:37;:::i;:::-;4752:50;;4655:153;;;:::o;4814:185::-;4928:64;4986:5;4928:64;:::i;:::-;4923:3;4916:77;4814:185;;:::o;5005:276::-;5125:4;5163:2;5152:9;5148:18;5140:26;;5176:98;5271:1;5260:9;5256:17;5247:6;5176:98;:::i;:::-;5005:276;;;;:::o;5287:118::-;5374:24;5392:5;5374:24;:::i;:::-;5369:3;5362:37;5287:118;;:::o;5411:222::-;5504:4;5542:2;5531:9;5527:18;5519:26;;5555:71;5623:1;5612:9;5608:17;5599:6;5555:71;:::i;:::-;5411:222;;;;:::o;5639:329::-;5698:6;5747:2;5735:9;5726:7;5722:23;5718:32;5715:119;;;5753:79;;:::i;:::-;5715:119;5873:1;5898:53;5943:7;5934:6;5923:9;5919:22;5898:53;:::i;:::-;5888:63;;5844:117;5639:329;;;;:::o;5974:619::-;6051:6;6059;6067;6116:2;6104:9;6095:7;6091:23;6087:32;6084:119;;;6122:79;;:::i;:::-;6084:119;6242:1;6267:53;6312:7;6303:6;6292:9;6288:22;6267:53;:::i;:::-;6257:63;;6213:117;6369:2;6395:53;6440:7;6431:6;6420:9;6416:22;6395:53;:::i;:::-;6385:63;;6340:118;6497:2;6523:53;6568:7;6559:6;6548:9;6544:22;6523:53;:::i;:::-;6513:63;;6468:118;5974:619;;;;;:::o;6599:86::-;6634:7;6674:4;6667:5;6663:16;6652:27;;6599:86;;;:::o;6691:112::-;6774:22;6790:5;6774:22;:::i;:::-;6769:3;6762:35;6691:112;;:::o;6809:214::-;6898:4;6936:2;6925:9;6921:18;6913:26;;6949:67;7013:1;7002:9;6998:17;6989:6;6949:67;:::i;:::-;6809:214;;;;:::o;7029:118::-;7116:24;7134:5;7116:24;:::i;:::-;7111:3;7104:37;7029:118;;:::o;7153:222::-;7246:4;7284:2;7273:9;7269:18;7261:26;;7297:71;7365:1;7354:9;7350:17;7341:6;7297:71;:::i;:::-;7153:222;;;;:::o;7381:117::-;7490:1;7487;7480:12;7504:180;7552:77;7549:1;7542:88;7649:4;7646:1;7639:15;7673:4;7670:1;7663:15;7690:281;7773:27;7795:4;7773:27;:::i;:::-;7765:6;7761:40;7903:6;7891:10;7888:22;7867:18;7855:10;7852:34;7849:62;7846:88;;;7914:18;;:::i;:::-;7846:88;7954:10;7950:2;7943:22;7733:238;7690:281;;:::o;7977:129::-;8011:6;8038:20;;:::i;:::-;8028:30;;8067:33;8095:4;8087:6;8067:33;:::i;:::-;7977:129;;;:::o;8112:311::-;8189:4;8279:18;8271:6;8268:30;8265:56;;;8301:18;;:::i;:::-;8265:56;8351:4;8343:6;8339:17;8331:25;;8411:4;8405;8401:15;8393:23;;8112:311;;;:::o;8429:117::-;8538:1;8535;8528:12;8569:710;8665:5;8690:81;8706:64;8763:6;8706:64;:::i;:::-;8690:81;:::i;:::-;8681:90;;8791:5;8820:6;8813:5;8806:21;8854:4;8847:5;8843:16;8836:23;;8907:4;8899:6;8895:17;8887:6;8883:30;8936:3;8928:6;8925:15;8922:122;;;8955:79;;:::i;:::-;8922:122;9070:6;9053:220;9087:6;9082:3;9079:15;9053:220;;;9162:3;9191:37;9224:3;9212:10;9191:37;:::i;:::-;9186:3;9179:50;9258:4;9253:3;9249:14;9242:21;;9129:144;9113:4;9108:3;9104:14;9097:21;;9053:220;;;9057:21;8671:608;;8569:710;;;;;:::o;9302:370::-;9373:5;9422:3;9415:4;9407:6;9403:17;9399:27;9389:122;;9430:79;;:::i;:::-;9389:122;9547:6;9534:20;9572:94;9662:3;9654:6;9647:4;9639:6;9635:17;9572:94;:::i;:::-;9563:103;;9379:293;9302:370;;;;:::o;9678:539::-;9762:6;9811:2;9799:9;9790:7;9786:23;9782:32;9779:119;;;9817:79;;:::i;:::-;9779:119;9965:1;9954:9;9950:17;9937:31;9995:18;9987:6;9984:30;9981:117;;;10017:79;;:::i;:::-;9981:117;10122:78;10192:7;10183:6;10172:9;10168:22;10122:78;:::i;:::-;10112:88;;9908:302;9678:539;;;;:::o;10223:116::-;10293:21;10308:5;10293:21;:::i;:::-;10286:5;10283:32;10273:60;;10329:1;10326;10319:12;10273:60;10223:116;:::o;10345:133::-;10388:5;10426:6;10413:20;10404:29;;10442:30;10466:5;10442:30;:::i;:::-;10345:133;;;;:::o;10484:468::-;10549:6;10557;10606:2;10594:9;10585:7;10581:23;10577:32;10574:119;;;10612:79;;:::i;:::-;10574:119;10732:1;10757:53;10802:7;10793:6;10782:9;10778:22;10757:53;:::i;:::-;10747:63;;10703:117;10859:2;10885:50;10927:7;10918:6;10907:9;10903:22;10885:50;:::i;:::-;10875:60;;10830:115;10484:468;;;;;:::o;10958:474::-;11026:6;11034;11083:2;11071:9;11062:7;11058:23;11054:32;11051:119;;;11089:79;;:::i;:::-;11051:119;11209:1;11234:53;11279:7;11270:6;11259:9;11255:22;11234:53;:::i;:::-;11224:63;;11180:117;11336:2;11362:53;11407:7;11398:6;11387:9;11383:22;11362:53;:::i;:::-;11352:63;;11307:118;10958:474;;;;;:::o;11438:182::-;11578:34;11574:1;11566:6;11562:14;11555:58;11438:182;:::o;11626:366::-;11768:3;11789:67;11853:2;11848:3;11789:67;:::i;:::-;11782:74;;11865:93;11954:3;11865:93;:::i;:::-;11983:2;11978:3;11974:12;11967:19;;11626:366;;;:::o;11998:419::-;12164:4;12202:2;12191:9;12187:18;12179:26;;12251:9;12245:4;12241:20;12237:1;12226:9;12222:17;12215:47;12279:131;12405:4;12279:131;:::i;:::-;12271:139;;11998:419;;;:::o;12423:180::-;12471:77;12468:1;12461:88;12568:4;12565:1;12558:15;12592:4;12589:1;12582:15;12609:305;12649:3;12668:20;12686:1;12668:20;:::i;:::-;12663:25;;12702:20;12720:1;12702:20;:::i;:::-;12697:25;;12856:1;12788:66;12784:74;12781:1;12778:81;12775:107;;;12862:18;;:::i;:::-;12775:107;12906:1;12903;12899:9;12892:16;;12609:305;;;;:::o;12920:180::-;12968:77;12965:1;12958:88;13065:4;13062:1;13055:15;13089:4;13086:1;13079:15;13106:320;13150:6;13187:1;13181:4;13177:12;13167:22;;13234:1;13228:4;13224:12;13255:18;13245:81;;13311:4;13303:6;13299:17;13289:27;;13245:81;13373:2;13365:6;13362:14;13342:18;13339:38;13336:84;;;13392:18;;:::i;:::-;13336:84;13157:269;13106:320;;;:::o;13432:348::-;13472:7;13495:20;13513:1;13495:20;:::i;:::-;13490:25;;13529:20;13547:1;13529:20;:::i;:::-;13524:25;;13717:1;13649:66;13645:74;13642:1;13639:81;13634:1;13627:9;13620:17;13616:105;13613:131;;;13724:18;;:::i;:::-;13613:131;13772:1;13769;13765:9;13754:20;;13432:348;;;;:::o;13786:180::-;13834:77;13831:1;13824:88;13931:4;13928:1;13921:15;13955:4;13952:1;13945:15;13972:185;14012:1;14029:20;14047:1;14029:20;:::i;:::-;14024:25;;14063:20;14081:1;14063:20;:::i;:::-;14058:25;;14102:1;14092:35;;14107:18;;:::i;:::-;14092:35;14149:1;14146;14142:9;14137:14;;13972:185;;;;:::o;14163:234::-;14303:34;14299:1;14291:6;14287:14;14280:58;14372:17;14367:2;14359:6;14355:15;14348:42;14163:234;:::o;14403:366::-;14545:3;14566:67;14630:2;14625:3;14566:67;:::i;:::-;14559:74;;14642:93;14731:3;14642:93;:::i;:::-;14760:2;14755:3;14751:12;14744:19;;14403:366;;;:::o;14775:419::-;14941:4;14979:2;14968:9;14964:18;14956:26;;15028:9;15022:4;15018:20;15014:1;15003:9;14999:17;14992:47;15056:131;15182:4;15056:131;:::i;:::-;15048:139;;14775:419;;;:::o;15200:180::-;15248:77;15245:1;15238:88;15345:4;15342:1;15335:15;15369:4;15366:1;15359:15;15386:233;15425:3;15448:24;15466:5;15448:24;:::i;:::-;15439:33;;15494:66;15487:5;15484:77;15481:103;;;15564:18;;:::i;:::-;15481:103;15611:1;15604:5;15600:13;15593:20;;15386:233;;;:::o;15625:178::-;15765:30;15761:1;15753:6;15749:14;15742:54;15625:178;:::o;15809:366::-;15951:3;15972:67;16036:2;16031:3;15972:67;:::i;:::-;15965:74;;16048:93;16137:3;16048:93;:::i;:::-;16166:2;16161:3;16157:12;16150:19;;15809:366;;;:::o;16181:419::-;16347:4;16385:2;16374:9;16370:18;16362:26;;16434:9;16428:4;16424:20;16420:1;16409:9;16405:17;16398:47;16462:131;16588:4;16462:131;:::i;:::-;16454:139;;16181:419;;;:::o;16606:244::-;16746:34;16742:1;16734:6;16730:14;16723:58;16815:27;16810:2;16802:6;16798:15;16791:52;16606:244;:::o;16856:366::-;16998:3;17019:67;17083:2;17078:3;17019:67;:::i;:::-;17012:74;;17095:93;17184:3;17095:93;:::i;:::-;17213:2;17208:3;17204:12;17197:19;;16856:366;;;:::o;17228:419::-;17394:4;17432:2;17421:9;17417:18;17409:26;;17481:9;17475:4;17471:20;17467:1;17456:9;17452:17;17445:47;17509:131;17635:4;17509:131;:::i;:::-;17501:139;;17228:419;;;:::o;17653:223::-;17793:34;17789:1;17781:6;17777:14;17770:58;17862:6;17857:2;17849:6;17845:15;17838:31;17653:223;:::o;17882:366::-;18024:3;18045:67;18109:2;18104:3;18045:67;:::i;:::-;18038:74;;18121:93;18210:3;18121:93;:::i;:::-;18239:2;18234:3;18230:12;18223:19;;17882:366;;;:::o;18254:419::-;18420:4;18458:2;18447:9;18443:18;18435:26;;18507:9;18501:4;18497:20;18493:1;18482:9;18478:17;18471:47;18535:131;18661:4;18535:131;:::i;:::-;18527:139;;18254:419;;;:::o;18679:240::-;18819:34;18815:1;18807:6;18803:14;18796:58;18888:23;18883:2;18875:6;18871:15;18864:48;18679:240;:::o;18925:366::-;19067:3;19088:67;19152:2;19147:3;19088:67;:::i;:::-;19081:74;;19164:93;19253:3;19164:93;:::i;:::-;19282:2;19277:3;19273:12;19266:19;;18925:366;;;:::o;19297:419::-;19463:4;19501:2;19490:9;19486:18;19478:26;;19550:9;19544:4;19540:20;19536:1;19525:9;19521:17;19514:47;19578:131;19704:4;19578:131;:::i;:::-;19570:139;;19297:419;;;:::o;19722:239::-;19862:34;19858:1;19850:6;19846:14;19839:58;19931:22;19926:2;19918:6;19914:15;19907:47;19722:239;:::o;19967:366::-;20109:3;20130:67;20194:2;20189:3;20130:67;:::i;:::-;20123:74;;20206:93;20295:3;20206:93;:::i;:::-;20324:2;20319:3;20315:12;20308:19;;19967:366;;;:::o;20339:419::-;20505:4;20543:2;20532:9;20528:18;20520:26;;20592:9;20586:4;20582:20;20578:1;20567:9;20563:17;20556:47;20620:131;20746:4;20620:131;:::i;:::-;20612:139;;20339:419;;;:::o;20764:225::-;20904:34;20900:1;20892:6;20888:14;20881:58;20973:8;20968:2;20960:6;20956:15;20949:33;20764:225;:::o;20995:366::-;21137:3;21158:67;21222:2;21217:3;21158:67;:::i;:::-;21151:74;;21234:93;21323:3;21234:93;:::i;:::-;21352:2;21347:3;21343:12;21336:19;;20995:366;;;:::o;21367:419::-;21533:4;21571:2;21560:9;21556:18;21548:26;;21620:9;21614:4;21610:20;21606:1;21595:9;21591:17;21584:47;21648:131;21774:4;21648:131;:::i;:::-;21640:139;;21367:419;;;:::o;21792:177::-;21932:29;21928:1;21920:6;21916:14;21909:53;21792:177;:::o;21975:366::-;22117:3;22138:67;22202:2;22197:3;22138:67;:::i;:::-;22131:74;;22214:93;22303:3;22214:93;:::i;:::-;22332:2;22327:3;22323:12;22316:19;;21975:366;;;:::o;22347:419::-;22513:4;22551:2;22540:9;22536:18;22528:26;;22600:9;22594:4;22590:20;22586:1;22575:9;22571:17;22564:47;22628:131;22754:4;22628:131;:::i;:::-;22620:139;;22347:419;;;:::o;22772:223::-;22912:34;22908:1;22900:6;22896:14;22889:58;22981:6;22976:2;22968:6;22964:15;22957:31;22772:223;:::o;23001:366::-;23143:3;23164:67;23228:2;23223:3;23164:67;:::i;:::-;23157:74;;23240:93;23329:3;23240:93;:::i;:::-;23358:2;23353:3;23349:12;23342:19;;23001:366;;;:::o;23373:419::-;23539:4;23577:2;23566:9;23562:18;23554:26;;23626:9;23620:4;23616:20;23612:1;23601:9;23597:17;23590:47;23654:131;23780:4;23654:131;:::i;:::-;23646:139;;23373:419;;;:::o;23798:221::-;23938:34;23934:1;23926:6;23922:14;23915:58;24007:4;24002:2;23994:6;23990:15;23983:29;23798:221;:::o;24025:366::-;24167:3;24188:67;24252:2;24247:3;24188:67;:::i;:::-;24181:74;;24264:93;24353:3;24264:93;:::i;:::-;24382:2;24377:3;24373:12;24366:19;;24025:366;;;:::o;24397:419::-;24563:4;24601:2;24590:9;24586:18;24578:26;;24650:9;24644:4;24640:20;24636:1;24625:9;24621:17;24614:47;24678:131;24804:4;24678:131;:::i;:::-;24670:139;;24397:419;;;:::o;24822:224::-;24962:34;24958:1;24950:6;24946:14;24939:58;25031:7;25026:2;25018:6;25014:15;25007:32;24822:224;:::o;25052:366::-;25194:3;25215:67;25279:2;25274:3;25215:67;:::i;:::-;25208:74;;25291:93;25380:3;25291:93;:::i;:::-;25409:2;25404:3;25400:12;25393:19;;25052:366;;;:::o;25424:419::-;25590:4;25628:2;25617:9;25613:18;25605:26;;25677:9;25671:4;25667:20;25663:1;25652:9;25648:17;25641:47;25705:131;25831:4;25705:131;:::i;:::-;25697:139;;25424:419;;;:::o;25849:222::-;25989:34;25985:1;25977:6;25973:14;25966:58;26058:5;26053:2;26045:6;26041:15;26034:30;25849:222;:::o;26077:366::-;26219:3;26240:67;26304:2;26299:3;26240:67;:::i;:::-;26233:74;;26316:93;26405:3;26316:93;:::i;:::-;26434:2;26429:3;26425:12;26418:19;;26077:366;;;:::o;26449:419::-;26615:4;26653:2;26642:9;26638:18;26630:26;;26702:9;26696:4;26692:20;26688:1;26677:9;26673:17;26666:47;26730:131;26856:4;26730:131;:::i;:::-;26722:139;;26449:419;;;:::o;26874:301::-;27014:34;27010:1;27002:6;26998:14;26991:58;27083:34;27078:2;27070:6;27066:15;27059:59;27152:15;27147:2;27139:6;27135:15;27128:40;26874:301;:::o;27181:366::-;27323:3;27344:67;27408:2;27403:3;27344:67;:::i;:::-;27337:74;;27420:93;27509:3;27420:93;:::i;:::-;27538:2;27533:3;27529:12;27522:19;;27181:366;;;:::o;27553:419::-;27719:4;27757:2;27746:9;27742:18;27734:26;;27806:9;27800:4;27796:20;27792:1;27781:9;27777:17;27770:47;27834:131;27960:4;27834:131;:::i;:::-;27826:139;;27553:419;;;:::o;27978:172::-;28118:24;28114:1;28106:6;28102:14;28095:48;27978:172;:::o;28156:366::-;28298:3;28319:67;28383:2;28378:3;28319:67;:::i;:::-;28312:74;;28395:93;28484:3;28395:93;:::i;:::-;28513:2;28508:3;28504:12;28497:19;;28156:366;;;:::o;28528:419::-;28694:4;28732:2;28721:9;28717:18;28709:26;;28781:9;28775:4;28771:20;28767:1;28756:9;28752:17;28745:47;28809:131;28935:4;28809:131;:::i;:::-;28801:139;;28528:419;;;:::o;28953:297::-;29093:34;29089:1;29081:6;29077:14;29070:58;29162:34;29157:2;29149:6;29145:15;29138:59;29231:11;29226:2;29218:6;29214:15;29207:36;28953:297;:::o;29256:366::-;29398:3;29419:67;29483:2;29478:3;29419:67;:::i;:::-;29412:74;;29495:93;29584:3;29495:93;:::i;:::-;29613:2;29608:3;29604:12;29597:19;;29256:366;;;:::o;29628:419::-;29794:4;29832:2;29821:9;29817:18;29809:26;;29881:9;29875:4;29871:20;29867:1;29856:9;29852:17;29845:47;29909:131;30035:4;29909:131;:::i;:::-;29901:139;;29628:419;;;:::o;30053:240::-;30193:34;30189:1;30181:6;30177:14;30170:58;30262:23;30257:2;30249:6;30245:15;30238:48;30053:240;:::o;30299:366::-;30441:3;30462:67;30526:2;30521:3;30462:67;:::i;:::-;30455:74;;30538:93;30627:3;30538:93;:::i;:::-;30656:2;30651:3;30647:12;30640:19;;30299:366;;;:::o;30671:419::-;30837:4;30875:2;30864:9;30860:18;30852:26;;30924:9;30918:4;30914:20;30910:1;30899:9;30895:17;30888:47;30952:131;31078:4;30952:131;:::i;:::-;30944:139;;30671:419;;;:::o;31096:169::-;31236:21;31232:1;31224:6;31220:14;31213:45;31096:169;:::o;31271:366::-;31413:3;31434:67;31498:2;31493:3;31434:67;:::i;:::-;31427:74;;31510:93;31599:3;31510:93;:::i;:::-;31628:2;31623:3;31619:12;31612:19;;31271:366;;;:::o;31643:419::-;31809:4;31847:2;31836:9;31832:18;31824:26;;31896:9;31890:4;31886:20;31882:1;31871:9;31867:17;31860:47;31924:131;32050:4;31924:131;:::i;:::-;31916:139;;31643:419;;;:::o;32068:241::-;32208:34;32204:1;32196:6;32192:14;32185:58;32277:24;32272:2;32264:6;32260:15;32253:49;32068:241;:::o;32315:366::-;32457:3;32478:67;32542:2;32537:3;32478:67;:::i;:::-;32471:74;;32554:93;32643:3;32554:93;:::i;:::-;32672:2;32667:3;32663:12;32656:19;;32315:366;;;:::o;32687:419::-;32853:4;32891:2;32880:9;32876:18;32868:26;;32940:9;32934:4;32930:20;32926:1;32915:9;32911:17;32904:47;32968:131;33094:4;32968:131;:::i;:::-;32960:139;;32687:419;;;:::o;33112:191::-;33152:4;33172:20;33190:1;33172:20;:::i;:::-;33167:25;;33206:20;33224:1;33206:20;:::i;:::-;33201:25;;33245:1;33242;33239:8;33236:34;;;33250:18;;:::i;:::-;33236:34;33295:1;33292;33288:9;33280:17;;33112:191;;;;:::o;33309:442::-;33458:4;33496:2;33485:9;33481:18;33473:26;;33509:71;33577:1;33566:9;33562:17;33553:6;33509:71;:::i;:::-;33590:72;33658:2;33647:9;33643:18;33634:6;33590:72;:::i;:::-;33672;33740:2;33729:9;33725:18;33716:6;33672:72;:::i;:::-;33309:442;;;;;;:::o;33757:220::-;33897:34;33893:1;33885:6;33881:14;33874:58;33966:3;33961:2;33953:6;33949:15;33942:28;33757:220;:::o;33983:366::-;34125:3;34146:67;34210:2;34205:3;34146:67;:::i;:::-;34139:74;;34222:93;34311:3;34222:93;:::i;:::-;34340:2;34335:3;34331:12;34324:19;;33983:366;;;:::o;34355:419::-;34521:4;34559:2;34548:9;34544:18;34536:26;;34608:9;34602:4;34598:20;34594:1;34583:9;34579:17;34572:47;34636:131;34762:4;34636:131;:::i;:::-;34628:139;;34355:419;;;:::o;34780:143::-;34837:5;34868:6;34862:13;34853:22;;34884:33;34911:5;34884:33;:::i;:::-;34780:143;;;;:::o;34929:351::-;34999:6;35048:2;35036:9;35027:7;35023:23;35019:32;35016:119;;;35054:79;;:::i;:::-;35016:119;35174:1;35199:64;35255:7;35246:6;35235:9;35231:22;35199:64;:::i;:::-;35189:74;;35145:128;34929:351;;;;:::o;35286:85::-;35331:7;35360:5;35349:16;;35286:85;;;:::o;35377:158::-;35435:9;35468:61;35486:42;35495:32;35521:5;35495:32;:::i;:::-;35486:42;:::i;:::-;35468:61;:::i;:::-;35455:74;;35377:158;;;:::o;35541:147::-;35636:45;35675:5;35636:45;:::i;:::-;35631:3;35624:58;35541:147;;:::o;35694:114::-;35761:6;35795:5;35789:12;35779:22;;35694:114;;;:::o;35814:184::-;35913:11;35947:6;35942:3;35935:19;35987:4;35982:3;35978:14;35963:29;;35814:184;;;;:::o;36004:132::-;36071:4;36094:3;36086:11;;36124:4;36119:3;36115:14;36107:22;;36004:132;;;:::o;36142:108::-;36219:24;36237:5;36219:24;:::i;:::-;36214:3;36207:37;36142:108;;:::o;36256:179::-;36325:10;36346:46;36388:3;36380:6;36346:46;:::i;:::-;36424:4;36419:3;36415:14;36401:28;;36256:179;;;;:::o;36441:113::-;36511:4;36543;36538:3;36534:14;36526:22;;36441:113;;;:::o;36590:732::-;36709:3;36738:54;36786:5;36738:54;:::i;:::-;36808:86;36887:6;36882:3;36808:86;:::i;:::-;36801:93;;36918:56;36968:5;36918:56;:::i;:::-;36997:7;37028:1;37013:284;37038:6;37035:1;37032:13;37013:284;;;37114:6;37108:13;37141:63;37200:3;37185:13;37141:63;:::i;:::-;37134:70;;37227:60;37280:6;37227:60;:::i;:::-;37217:70;;37073:224;37060:1;37057;37053:9;37048:14;;37013:284;;;37017:14;37313:3;37306:10;;36714:608;;;36590:732;;;;:::o;37328:831::-;37591:4;37629:3;37618:9;37614:19;37606:27;;37643:71;37711:1;37700:9;37696:17;37687:6;37643:71;:::i;:::-;37724:80;37800:2;37789:9;37785:18;37776:6;37724:80;:::i;:::-;37851:9;37845:4;37841:20;37836:2;37825:9;37821:18;37814:48;37879:108;37982:4;37973:6;37879:108;:::i;:::-;37871:116;;37997:72;38065:2;38054:9;38050:18;38041:6;37997:72;:::i;:::-;38079:73;38147:3;38136:9;38132:19;38123:6;38079:73;:::i;:::-;37328:831;;;;;;;;:::o;38165:807::-;38414:4;38452:3;38441:9;38437:19;38429:27;;38466:71;38534:1;38523:9;38519:17;38510:6;38466:71;:::i;:::-;38547:72;38615:2;38604:9;38600:18;38591:6;38547:72;:::i;:::-;38629:80;38705:2;38694:9;38690:18;38681:6;38629:80;:::i;:::-;38719;38795:2;38784:9;38780:18;38771:6;38719:80;:::i;:::-;38809:73;38877:3;38866:9;38862:19;38853:6;38809:73;:::i;:::-;38892;38960:3;38949:9;38945:19;38936:6;38892:73;:::i;:::-;38165:807;;;;;;;;;:::o;38978:143::-;39035:5;39066:6;39060:13;39051:22;;39082:33;39109:5;39082:33;:::i;:::-;38978:143;;;;:::o;39127:663::-;39215:6;39223;39231;39280:2;39268:9;39259:7;39255:23;39251:32;39248:119;;;39286:79;;:::i;:::-;39248:119;39406:1;39431:64;39487:7;39478:6;39467:9;39463:22;39431:64;:::i;:::-;39421:74;;39377:128;39544:2;39570:64;39626:7;39617:6;39606:9;39602:22;39570:64;:::i;:::-;39560:74;;39515:129;39683:2;39709:64;39765:7;39756:6;39745:9;39741:22;39709:64;:::i;:::-;39699:74;;39654:129;39127:663;;;;;:::o

Swarm Source

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