ETH Price: $3,175.63 (-3.36%)

Token

NECTRai (NECTR)
 

Overview

Max Total Supply

100,000,000 NECTR

Holders

182

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
7,071.231696808 NECTR

Value
$0.00
0x4F9314C3B204290CfE9d023c5fC3eabC94626a8B
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:
NECTRai

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-09-15
*/

pragma solidity ^0.8.19;
// SPDX-License-Identifier: Unlicensed

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


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;
        // Detect overflow when multiplying MIN_INT256 with -1
        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) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != - 1 || a != MIN_INT256);
        // Solidity already throws when dividing by 0.
        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;
    }
}

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

library Address {

    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {codehash := extcodehash(account)}
        return (codehash != accountHash && codehash != 0x0);
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success,) = recipient.call{value : amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value : weiValue}(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

contract Ownable {
    address private _owner = msg.sender;

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

    constructor () {
    }

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

    modifier onlyOwner() {
        require(_owner == msg.sender, "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;
    }

}

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

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] memory path) external view returns (uint[] memory amounts);
}


contract NECTRai is IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;
    event HolderBuySell(address holder, string actionType, uint256 ethAmount, uint256 ethBalance);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    modifier lockTheSwap { inSwapAndLiquify = true; _; inSwapAndLiquify = false; }

    struct Distribution {
        uint256 development;
        uint256 rewards;
    }

    struct TaxFees {
        uint256 buyFee;
        uint256 sellFee;
    }

    struct BuySellHistory {
        string actionType;
        uint amount;
    }
    
    IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public uniswapV2Pair = address(0);
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcludedFromRewards;
    mapping(address => BuySellHistory[]) private buySellHistoryMapping;
    
    string private _name = "NECTRai";
    string private _symbol = "NECTR";
    uint8 private _decimals = 9;
    uint256 private _tTotal = 100_000_000 * 10 ** _decimals;
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    uint256 public ethPriceToSwap = .3 ether;
    uint256 public _maxWalletAmount = 2_000_000 * 10 ** _decimals;
    address developmentAddress = 0xB3c23622d29fF68B6A7FdCe2253f1e22cC54eE07;
    address public deadWallet = address(0xdead);
    event ProcessedRewards(uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, address indexed processor);
    event SendRewards(uint256 EthAmount);
    IterableMapping private holderBalanceMap = new IterableMapping();

    TaxFees public taxFees;
    RewardsTracker public rewardsTracker;
    Distribution public distribution = Distribution(100,0);

    constructor () {
        _balances[address(this)] = _tTotal;
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[0xC61Ec46C142dd8b64063A09a217172EaeBe73847] = true; //30% Roadmap
        _isExcludedFromFee[0x9c0D07510936C426D81d3d5549Ad66Cd3257Eb59] = true; //5% Exholders
        _isExcludedFromFee[0x320aD2d83faB9a8242706a56350b7835561b8A8b] = true; //7.4% Marketing
        _isExcludedFromFee[0x7969dE392cE5bFC347c8a35170956D34a6fFDa20] = true; //10% Team
        _isExcludedFromRewards[owner()] = true;
        _isExcludedFromRewards[deadWallet] = true;
        _isExcludedFromRewards[uniswapV2Pair] = true;
        taxFees = TaxFees(80, 98);
        emit Transfer(address(0), msg.sender, _tTotal);
    }

    function openTrading() external onlyOwner() {
        require(uniswapV2Pair == address(0),"14");
        _approve(address(this), address(uniswapV2Router), _tTotal);
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        uniswapV2Router.addLiquidityETH{value: address(this).balance}(
            address(this),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp);
        IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint).max);
    }

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

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

    function decimals() public view returns (uint8) {
        return _decimals;
    }

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

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

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

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

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

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "1"));
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "2"));
        return true;
    }

    function ethHolderBalance(address account) public view returns (uint) {
        return holderBalanceMap.get(account);
    }

    function updateHolderBalance(address account, uint newBalance) external onlyOwner {
        holderBalanceMap.set(account, newBalance);
    }

    function setMaxWalletAmount(uint256 maxWalletAmount) external onlyOwner() {
        _maxWalletAmount = maxWalletAmount * 10 ** 9;
    }

    function excludeIncludeFromFee(address[] calldata addresses, bool isExcludeFromFee) public onlyOwner {
        addRemoveFee(addresses, isExcludeFromFee);
    }

    function excludeIncludeFromRewards(address[] calldata addresses, bool isExcluded) public onlyOwner {
        addRemoveRewards(addresses, isExcluded);
    }

    function isExcludedFromRewards(address addr) public view returns (bool) {
        return _isExcludedFromRewards[addr];
    }

    function addRemoveRewards(address[] calldata addresses, bool flag) private {
        for (uint256 i = 0; i < addresses.length; i++) {
            address addr = addresses[i];
            _isExcludedFromRewards[addr] = flag;
        }
    }

    function getBuySellHistory(address account) public view returns(BuySellHistory[] memory) {
        return buySellHistoryMapping[account];
    }

    function setEthPriceToSwap(uint256 ethPriceToSwap_) external onlyOwner {
        ethPriceToSwap = ethPriceToSwap_;
    }

    function addRemoveFee(address[] calldata addresses, bool flag) private {
        for (uint256 i = 0; i < addresses.length; i++) {
            address addr = addresses[i];
            _isExcludedFromFee[addr] = flag;
        }
    }

    function setTaxFees(uint256 buyFee, uint256 sellFee) external onlyOwner {
        require(buyFee <= 20, "3");
        require(sellFee <= 20, "4");
        taxFees.buyFee = buyFee;
        taxFees.sellFee = sellFee;
    }

    receive() external payable {}

    function getTokenAmountByEthPrice() public view returns (uint256)  {
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(this);
        return uniswapV2Router.getAmountsOut(ethPriceToSwap, path)[1];
    }

    function isExcludedFromFee(address account) public view returns (bool) {
        return _isExcludedFromFee[account];
    }

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "5");
        require(spender != address(0), "6");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "7");
        require(to != address(0), "8");
        require(amount > 0, "9");
        bool takeFees = !_isExcludedFromFee[from] && !_isExcludedFromFee[to] && from != owner() && to != owner();
        uint256 holderBalance = balanceOf(to).add(amount);
        uint256 taxAmount = 0;
        //block the bots, but allow them to transfer to dead wallet if they are blocked
        if (from != owner() && to != owner() && to != deadWallet && from != address(this) && to != address(this)) {
            if (from == uniswapV2Pair) {
                if(takeFees) {
                    require(holderBalance <= _maxWalletAmount, "10");
                }
                taxAmount = takeFees ? amount.mul(taxFees.buyFee).div(100) :  0;
                uint ethBuy = getEthValueFromTokens(amount);
                uint newBalance = holderBalanceMap.get(to).add(ethBuy);
                holderBalanceMap.set(to, newBalance);
                buySellHistoryMapping[to].push(BuySellHistory("BUY", ethBuy));
                emit HolderBuySell(to, "BUY", ethBuy,  newBalance);
            }
            if (from != uniswapV2Pair && to == uniswapV2Pair) {
                taxAmount = takeFees ? amount.mul(taxFees.sellFee).div(100) : 0;
                uint ethSell = getEthValueFromTokens(amount);
                int val = int(holderBalanceMap.get(from)) - int(ethSell);
                uint256 newBalance = val <= 0 ? 0 : uint256(val);
                holderBalanceMap.set(from, newBalance);
                buySellHistoryMapping[from].push(BuySellHistory("SELL", ethSell));
                emit HolderBuySell(from, "SELL", ethSell,  newBalance);
                swapTokens();
            }
            if (from != uniswapV2Pair && to != uniswapV2Pair) {
                require(holderBalance <= _maxWalletAmount, "11");
                //remove holder from eth rewards
                holderBalanceMap.set(from, 0);
            }
            syncRewards(from, to);
        }
        uint256 transferAmount = amount.sub(taxAmount);
        _balances[from] = _balances[from].sub(amount);
        _balances[to] = _balances[to].add(transferAmount);
        _balances[address(this)] = _balances[address(this)].add(taxAmount);
        emit Transfer(from, to, amount);
    }

    function airDrops(address[] calldata holders, uint256[] calldata amounts, uint256[] calldata ethSaleValues) external onlyOwner {
        require(holders.length == amounts.length && holders.length == ethSaleValues.length, "12");
        require(address(rewardsTracker) != address(0), "13");
        address from = address(this);
        for(uint256 i=0; i < holders.length; i++) {
            address to = holders[i];
            uint256 amount = amounts[i];
            _balances[from] = _balances[from].sub(amount);
            _balances[to] = _balances[to].add(amount);
            holderBalanceMap.set(to, ethSaleValues[i]);
            syncRewards(from, to);
            emit Transfer(from, to, amount);
        }
    }

    function updateHolderBalances(address holder, uint256 ethAmount) external  onlyOwner {
        holderBalanceMap.set(holder, ethAmount);
    }

    function syncRewards(address from, address to) private {
        try rewardsTracker.setTokenBalance(from) {} catch{}
        try rewardsTracker.setTokenBalance(to) {} catch{}
        try rewardsTracker.process() returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
            emit ProcessedRewards(iterations, claims, lastProcessedIndex, true, tx.origin);
        }catch {}
    }

    function swapTokens() private {
        uint256 contractTokenBalance = balanceOf(address(this));
        if (contractTokenBalance > 0) {
            uint256 tokenAmount = getTokenAmountByEthPrice();
            if (contractTokenBalance >= tokenAmount && !inSwapAndLiquify && swapAndLiquifyEnabled) {
                //send eth to wallets investment and dev
                swapTokensForEth(tokenAmount);
                distributeShares();
            }
        }
    }

    function getEthValueFromTokens(uint tokenAmount) public view returns (uint)  {
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(this);
        return uniswapV2Router.getAmountsIn(tokenAmount, path)[0];
    }

    function distributeShares() private lockTheSwap {
        uint256 ethBalance = address(this).balance;
        uint256 development = ethBalance.mul(distribution.development).div(100);
        uint256 rewards = ethBalance.mul(distribution.rewards).div(100);
        payable(developmentAddress).transfer(development);
        sendEthRewards(rewards);
    }

    function manualSwap() external {
        uint256 contractTokenBalance = balanceOf(address(this));
        if (contractTokenBalance > 0) {
            if (!inSwapAndLiquify) {
                swapTokensForEth(contractTokenBalance);
                distributeShares();
            }
        }
    }

    function setDistribution(uint256 development, uint256 rewards) external onlyOwner {
        distribution.development = development;
        distribution.rewards = rewards;
    }

    function setRewardsTracker(address rewardsContractAddress) external onlyOwner {
        rewardsTracker = RewardsTracker(payable(rewardsContractAddress));
    }

    function sendEthRewards(uint256 rewards) private {
        (bool success,) = address(rewardsTracker).call{value : rewards}("");
        if (success) {
            emit SendRewards(rewards);
        }
    }

    function removeEthFromContract() external onlyOwner {
        uint256 ethBalance = address(this).balance;
        payable(owner()).transfer(ethBalance);
    }

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

contract IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint) values;
        mapping(address => uint) indexOf;
        mapping(address => bool) inserted;
    }

    Map private map;

    function get(address key) public view returns (uint) {
        return map.values[key];
    }

    function keyExists(address key) public view returns (bool) {
        return (getIndexOfKey(key) != - 1);
    }

    function getIndexOfKey(address key) public view returns (int) {
        if (!map.inserted[key]) {
            return - 1;
        }
        return int(map.indexOf[key]);
    }

    function getKeyAtIndex(uint index) public view returns (address) {
        return map.keys[index];
    }

    function size() public view returns (uint) {
        return map.keys.length;
    }

    function set(address key, uint val) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(address key) public {
        if (!map.inserted[key]) {
            return;
        }
        delete map.inserted[key];
        delete map.values[key];
        uint index = map.indexOf[key];
        uint lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];
        map.indexOf[lastKey] = index;
        delete map.indexOf[key];
        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

contract RewardsTracker is IERC20, Ownable {
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;
    uint256 constant internal magnitude = 2 ** 128;
    uint256 internal magnifiedRewardPerShare;
    mapping(address => int256) internal magnifiedRewardCorrections;
    mapping(address => uint256) internal withdrawnRewards;
    mapping(address => uint256) internal claimedRewards;
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    uint256 private _totalSupply;
    string private _name = "NECTRai Tracker";
    string private _symbol = "NECTREWARDS";
    uint8 private _decimals = 9;
    uint256 public totalRewardsDistributed;
    IterableMapping private tokenHoldersMap = new IterableMapping();
    uint256 public gasForProcessing = 50000;
    NECTRai private nectrErc20;

    event updateBalance(address addr, uint256 amount);
    event RewardsDistributed(address indexed from, uint256 weiAmount);
    event RewardsWithdrawn(address indexed to, uint256 weiAmount);

    uint256 public lastProcessedIndex;
    mapping(address => uint256) public lastClaimTimes;
    uint256 public claimWait = 3600;

    event ExcludeFromRewards(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event Claim(address indexed account, uint256 amount, bool indexed automatic);
    IUniswapV2Router02 uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

    struct UpdateRewardsTiers {
        uint Scout;
        uint Gatherer;
        uint Gaurdian;
        uint Royal;
    }
        
    UpdateRewardsTiers public updateRewardsTiers;
    constructor() {
        updateRewardsTiers = UpdateRewardsTiers(
            .2 ether,
            1 ether,
            2 ether,
            5 ether);
    }

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

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

    function decimals() public view returns (uint8) {
        return _decimals;
    }

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

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

    function getRewardsLevel(uint256 amount) public view returns (uint) {
        uint tierLevel = 0;
        if(amount >= updateRewardsTiers.Scout) {
            tierLevel = 100;
        }
        if(amount >= updateRewardsTiers.Gatherer) {
            tierLevel = 1_000;
        }
        if(amount >= updateRewardsTiers.Gaurdian) {
            tierLevel = 5_000;
        }
        if(amount >= updateRewardsTiers.Royal) {
            tierLevel = 20_000;
        }
        return tierLevel;
    }

    function transfer(address, uint256) public pure returns (bool) {
        require(false, "No transfers allowed in reward tracker");
        return true;
    }

    function transferFrom(address, address, uint256) public pure override returns (bool) {
        require(false, "No transfers allowed in reward tracker");
        return true;
    }

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

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

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function _approve(address owner, address spender, uint256 amount) private {
        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 updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(newValue != gasForProcessing, "Cannot update gasForProcessing to same value");
        gasForProcessing = newValue;
    }

    function setTokenBalance(address account) public {
        uint256 balance = nectrErc20.ethHolderBalance(account);
        if (!nectrErc20.isExcludedFromRewards(account)) {
            uint tierLevel = getRewardsLevel(balance);
            if (tierLevel > 100) {
                _setBalance(account, tierLevel);
                tokenHoldersMap.set(account, tierLevel);
            }
            else {
                _setBalance(account, 0);
                tokenHoldersMap.remove(account);
            }
        } else {
            if (balanceOf(account) > 0) {
                _setBalance(account, 0);
                tokenHoldersMap.remove(account);
            }
        }
        processAccount(payable(account), true);
    }

    function updateTokenBalances(address[] memory accounts) external {
        uint256 index = 0;
        while (index < accounts.length) {
            setTokenBalance(accounts[index]);
            index += 1;
        }
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
        magnifiedRewardCorrections[account] = magnifiedRewardCorrections[account]
        .sub((magnifiedRewardPerShare.mul(amount)).toInt256Safe());
    }

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

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);

        magnifiedRewardCorrections[account] = magnifiedRewardCorrections[account]
        .add((magnifiedRewardPerShare.mul(amount)).toInt256Safe());
    }

    receive() external payable {
        distributeRewards();
    }

    function setNectrContract(address contractAddr) external onlyOwner {
        nectrErc20 = NECTRai(payable(contractAddr));
    }

    function excludeFromRewards(address account) external onlyOwner {
        _setBalance(account, 0);
        tokenHoldersMap.remove(account);
        emit ExcludeFromRewards(account);
    }

    function distributeRewards() public payable {
        require(totalSupply() > 0);

        if (msg.value > 0) {
            magnifiedRewardPerShare = magnifiedRewardPerShare.add(
                (msg.value).mul(magnitude) / totalSupply()
            );
            emit RewardsDistributed(msg.sender, msg.value);
            totalRewardsDistributed = totalRewardsDistributed.add(msg.value);
        }
    }

    function withdrawReward() public virtual {
        _withdrawRewardOfUser(payable(msg.sender));
    }

    function _withdrawRewardOfUser(address payable user) internal returns (uint256) {
        uint256 _withdrawableReward = withdrawableRewardOf(user);
        if (_withdrawableReward > 0) {
            withdrawnRewards[user] = withdrawnRewards[user].add(_withdrawableReward);
            emit RewardsWithdrawn(user, _withdrawableReward);
            (bool success,) = user.call{value : _withdrawableReward, gas : 3000}("");
            if (!success) {
                withdrawnRewards[user] = withdrawnRewards[user].sub(_withdrawableReward);
                return 0;
            }
            return _withdrawableReward;
        }
        return 0;
    }

    function rewardOf(address _owner) public view returns (uint256) {
        return withdrawableRewardOf(_owner);
    }

    function withdrawableRewardOf(address _owner) public view returns (uint256) {
        return accumulativeRewardOf(_owner).sub(withdrawnRewards[_owner]);
    }

    function withdrawnRewardOf(address _owner) public view returns (uint256) {
        return withdrawnRewards[_owner];
    }

    function accumulativeRewardOf(address _owner) public view returns (uint256) {
        return magnifiedRewardPerShare.mul(balanceOf(_owner)).toInt256Safe()
        .add(magnifiedRewardCorrections[_owner]).toUint256Safe() / magnitude;
    }


    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 3600 && newClaimWait <= 86400, "ClaimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "Cannot update claimWait to same value");
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return lastProcessedIndex;
    }

    function getNumberOfTokenHolders() external view returns (uint256) {
        return tokenHoldersMap.size();
    }

    function getNumberOfTokenHoldersByLevel(uint amount) external view returns (uint256) {
        uint256 total = 0;
        for(uint256 i=0; i < tokenHoldersMap.size(); i++) {
           address account = tokenHoldersMap.getKeyAtIndex(i);
           uint256 balance = balanceOf(account);
           if(balance == amount) {
            total += 1;
           }
        }
        return total;
    }

    function getAccount(address _account) public view returns (address account, int256 index, int256 iterationsUntilProcessed,
        uint256 withdrawableRewards, uint256 totalRewards, uint256 lastClaimTime,
        uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable) {
        account = _account;
        index = tokenHoldersMap.getIndexOfKey(account);
        iterationsUntilProcessed = - 1;
        if (index >= 0) {
            if (uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(int256(lastProcessedIndex));
            }
            else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.size() > lastProcessedIndex ?
                tokenHoldersMap.size().sub(lastProcessedIndex) : 0;
                iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray));
            }
        }
        withdrawableRewards = withdrawableRewardOf(account);
        totalRewards = accumulativeRewardOf(account);
        lastClaimTime = lastClaimTimes[account];
        nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0;
        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0;
    }

    function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
        if (lastClaimTime > block.timestamp) {
            return false;
        }
        return block.timestamp.sub(lastClaimTime) >= claimWait;
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = balanceOf(account);
        if (newBalance > currentBalance) {
            uint256 mintAmount = newBalance.sub(currentBalance);
            _mint(account, mintAmount);
        } else if (newBalance < currentBalance) {
            uint256 burnAmount = currentBalance.sub(newBalance);
            _burn(account, burnAmount);
        }
    }

    function process() public returns (uint256, uint256, uint256) {
        uint256 numberOfTokenHolders = tokenHoldersMap.size();

        if (numberOfTokenHolders == 0) {
            return (0, 0, lastProcessedIndex);
        }
        uint256 _lastProcessedIndex = lastProcessedIndex;
        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();
        uint256 iterations = 0;
        uint256 claims = 0;
        while (gasUsed < gasForProcessing && iterations < numberOfTokenHolders) {
            _lastProcessedIndex++;
            if (_lastProcessedIndex >= tokenHoldersMap.size()) {
                _lastProcessedIndex = 0;
            }
            address account = tokenHoldersMap.getKeyAtIndex(_lastProcessedIndex);
            if (canAutoClaim(lastClaimTimes[account])) {
                if (processAccount(payable(account), true)) {
                    claims++;
                }
            }
            iterations++;
            uint256 newGasLeft = gasleft();
            if (gasLeft > newGasLeft) {
                gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
            }
            gasLeft = newGasLeft;
        }
        lastProcessedIndex = _lastProcessedIndex;
        return (iterations, claims, lastProcessedIndex);
    }

    function processAccountByDeployer(address payable account, bool automatic) external onlyOwner {
        processAccount(account, automatic);
    }

    function totalRewardClaimed(address account) public view returns (uint256) {
        return claimedRewards[account];
    }

    function processAccount(address payable account, bool automatic) private returns (bool) {
        uint256 amount = _withdrawRewardOfUser(account);
        if (amount > 0) {
            uint256 totalClaimed = claimedRewards[account];
            claimedRewards[account] = amount.add(totalClaimed);
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount, automatic);
            return true;
        }
        return false;
    }

    //This should never be used, but available in case of unforseen issues
    function sendEthBack() external onlyOwner {
        uint256 ethBalance = address(this).balance;
        payable(owner()).transfer(ethBalance);
    }

}

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":[{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"string","name":"actionType","type":"string"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethBalance","type":"uint256"}],"name":"HolderBuySell","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"EthAmount","type":"uint256"}],"name":"SendRewards","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":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"holders","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"ethSaleValues","type":"uint256[]"}],"name":"airDrops","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distribution","outputs":[{"internalType":"uint256","name":"development","type":"uint256"},{"internalType":"uint256","name":"rewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ethHolderBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethPriceToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"isExcludeFromFee","type":"bool"}],"name":"excludeIncludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"excludeIncludeFromRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getBuySellHistory","outputs":[{"components":[{"internalType":"string","name":"actionType","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct NECTRai.BuySellHistory[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"getEthValueFromTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenAmountByEthPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isExcludedFromRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeEthFromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsTracker","outputs":[{"internalType":"contract RewardsTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"development","type":"uint256"},{"internalType":"uint256","name":"rewards","type":"uint256"}],"name":"setDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethPriceToSwap_","type":"uint256"}],"name":"setEthPriceToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWalletAmount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rewardsContractAddress","type":"address"}],"name":"setRewardsTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"}],"name":"setTaxFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxFees","outputs":[{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"address","name":"account","type":"address"},{"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"updateHolderBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"updateHolderBalances","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d60015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600781526020017f4e45435452616900000000000000000000000000000000000000000000000000815250600890816200011d919062000a11565b506040518060400160405280600581526020017f4e454354520000000000000000000000000000000000000000000000000000008152506009908162000164919062000a11565b506009600a5f6101000a81548160ff021916908360ff160217905550600a5f9054906101000a900460ff16600a6200019d919062000c7e565b6305f5e100620001ae919062000cce565b600b556001600c60016101000a81548160ff021916908315150217905550670429d069189e0000600d55600a5f9054906101000a900460ff16600a620001f5919062000c7e565b621e848062000205919062000cce565b600e5573b3c23622d29ff68b6a7fdce2253f1e22cc54ee07600f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061dead60105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051620002ac906200079f565b604051809103905ff080158015620002c6573d5f803e3d5ffd5b5060115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280606481526020015f81525060155f820151815f01556020820151816001015550503480156200033e575f80fd5b50600b5460035f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600160055f620003986200077860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160055f73c61ec46c142dd8b64063a09a217172eaebe7384773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160055f739c0d07510936c426d81d3d5549ad66cd3257eb5973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160055f73320ad2d83fab9a8242706a56350b7835561b8a8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160055f737969de392ce5bfc347c8a35170956d34a6ffda2073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160065f620005a06200077860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160065f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160065f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550604051806040016040528060508152602001606281525060125f820151815f0155602082015181600101559050503373ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600b546040516200076a919062000d29565b60405180910390a362000d44565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610a968062006ae083390190565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200082957607f821691505b6020821081036200083f576200083e620007e4565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620008a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000866565b620008af868362000866565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620008f9620008f3620008ed84620008c7565b620008d0565b620008c7565b9050919050565b5f819050919050565b6200091483620008d9565b6200092c620009238262000900565b84845462000872565b825550505050565b5f90565b6200094262000934565b6200094f81848462000909565b505050565b5b8181101562000976576200096a5f8262000938565b60018101905062000955565b5050565b601f821115620009c5576200098f8162000845565b6200099a8462000857565b81016020851015620009aa578190505b620009c2620009b98562000857565b83018262000954565b50505b505050565b5f82821c905092915050565b5f620009e75f1984600802620009ca565b1980831691505092915050565b5f62000a018383620009d6565b9150826002028217905092915050565b62000a1c82620007ad565b67ffffffffffffffff81111562000a385762000a37620007b7565b5b62000a44825462000811565b62000a518282856200097a565b5f60209050601f83116001811462000a87575f841562000a72578287015190505b62000a7e8582620009f4565b86555062000aed565b601f19841662000a978662000845565b5f5b8281101562000ac05784890151825560018201915060208501945060208101905062000a99565b8683101562000ae0578489015162000adc601f891682620009d6565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111562000b7f5780860481111562000b575762000b5662000af5565b5b600185161562000b675780820291505b808102905062000b778562000b22565b945062000b37565b94509492505050565b5f8262000b99576001905062000c6b565b8162000ba8575f905062000c6b565b816001811462000bc1576002811462000bcc5762000c02565b600191505062000c6b565b60ff84111562000be15762000be062000af5565b5b8360020a91508482111562000bfb5762000bfa62000af5565b5b5062000c6b565b5060208310610133831016604e8410600b841016171562000c3c5782820a90508381111562000c365762000c3562000af5565b5b62000c6b565b62000c4b848484600162000b2e565b9250905081840481111562000c655762000c6462000af5565b5b81810290505b9392505050565b5f60ff82169050919050565b5f62000c8a82620008c7565b915062000c978362000c72565b925062000cc67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000b88565b905092915050565b5f62000cda82620008c7565b915062000ce783620008c7565b925082820262000cf781620008c7565b9150828204841483151762000d115762000d1062000af5565b5b5092915050565b62000d2381620008c7565b82525050565b5f60208201905062000d3e5f83018462000d18565b92915050565b615d8e8062000d525f395ff3fe608060405260043610610254575f3560e01c806359a05f89116101385780638da5cb5b116100b5578063b2abbbc411610079578063b2abbbc4146108c5578063ba385abb146108ed578063c9567bf914610915578063dd62ed3e1461092b578063f18dba2614610967578063f2fde38b1461098f5761025b565b80638da5cb5b146107cf57806395d89b41146107f95780639799570614610823578063a457c2d71461084d578063a9059cbb146108895761025b565b806371cd56af116100fc57806371cd56af1461070557806376f7b5bc1461072d57806379c2e2001461075557806381230a831461077d57806385141a77146107a55761025b565b806359a05f89146106345780635ee58efc1461065e5780636c0a24eb1461068957806370a08231146106b3578063715018a6146106ef5761025b565b8063280d3821116101d157806349bd5a5e1161019557806349bd5a5e146105285780634a74bb02146105525780634fda2e121461057c57806351bc3c85146105b85780635342acb4146105ce57806354a5df1f1461060a5761025b565b8063280d382114610448578063313ce5671461045e578063345487d01461048857806339509351146104c4578063441d801f146105005761025b565b806314f944bd1161021857806314f944bd146103545780631694505e1461039057806318160ddd146103ba57806323b872dd146103e457806327a14fc2146104205761025b565b806306fdde031461025f578063095ea7b3146102895780630ddc0976146102c55780630e832273146102f057806311f0b5161461032c5761025b565b3661025b57005b5f80fd5b34801561026a575f80fd5b506102736109b7565b604051610280919061445b565b60405180910390f35b348015610294575f80fd5b506102af60048036038101906102aa9190614519565b610a47565b6040516102bc9190614571565b60405180910390f35b3480156102d0575f80fd5b506102d9610a5d565b6040516102e7929190614599565b60405180910390f35b3480156102fb575f80fd5b50610316600480360381019061031191906145c0565b610a6e565b6040516103239190614571565b60405180910390f35b348015610337575f80fd5b50610352600480360381019061034d91906146a1565b610ac0565b005b34801561035f575f80fd5b5061037a60048036038101906103759190614751565b610ee0565b604051610387919061477c565b60405180910390f35b34801561039b575f80fd5b506103a4611118565b6040516103b191906147f0565b60405180910390f35b3480156103c5575f80fd5b506103ce61113d565b6040516103db919061477c565b60405180910390f35b3480156103ef575f80fd5b5061040a60048036038101906104059190614809565b611146565b6040516104179190614571565b60405180910390f35b34801561042b575f80fd5b5061044660048036038101906104419190614751565b611229565b005b348015610453575f80fd5b5061045c6112cf565b005b348015610469575f80fd5b506104726113ae565b60405161047f9190614874565b60405180910390f35b348015610493575f80fd5b506104ae60048036038101906104a991906145c0565b6113c3565b6040516104bb919061477c565b60405180910390f35b3480156104cf575f80fd5b506104ea60048036038101906104e59190614519565b611464565b6040516104f79190614571565b60405180910390f35b34801561050b575f80fd5b50610526600480360381019061052191906148b7565b611504565b005b348015610533575f80fd5b5061053c6115a1565b6040516105499190614923565b60405180910390f35b34801561055d575f80fd5b506105666115c6565b6040516105739190614571565b60405180910390f35b348015610587575f80fd5b506105a2600480360381019061059d91906145c0565b6115d9565b6040516105af9190614a88565b60405180910390f35b3480156105c3575f80fd5b506105cc61170b565b005b3480156105d9575f80fd5b506105f460048036038101906105ef91906145c0565b611748565b6040516106019190614571565b60405180910390f35b348015610615575f80fd5b5061061e61179a565b60405161062b919061477c565b60405180910390f35b34801561063f575f80fd5b506106486117a0565b6040516106559190614ad9565b60405180910390f35b348015610669575f80fd5b506106726117c5565b604051610680929190614599565b60405180910390f35b348015610694575f80fd5b5061069d6117d6565b6040516106aa919061477c565b60405180910390f35b3480156106be575f80fd5b506106d960048036038101906106d491906145c0565b6117dc565b6040516106e6919061477c565b60405180910390f35b3480156106fa575f80fd5b50610703611822565b005b348015610710575f80fd5b5061072b600480360381019061072691906148b7565b611969565b005b348015610738575f80fd5b50610753600480360381019061074e9190614519565b611a06565b005b348015610760575f80fd5b5061077b60048036038101906107769190614519565b611b20565b005b348015610788575f80fd5b506107a3600480360381019061079e9190614af2565b611c3a565b005b3480156107b0575f80fd5b506107b9611d66565b6040516107c69190614923565b60405180910390f35b3480156107da575f80fd5b506107e3611d8b565b6040516107f09190614923565b60405180910390f35b348015610804575f80fd5b5061080d611db2565b60405161081a919061445b565b60405180910390f35b34801561082e575f80fd5b50610837611e42565b604051610844919061477c565b60405180910390f35b348015610858575f80fd5b50610873600480360381019061086e9190614519565b61207b565b6040516108809190614571565b60405180910390f35b348015610894575f80fd5b506108af60048036038101906108aa9190614519565b612152565b6040516108bc9190614571565b60405180910390f35b3480156108d0575f80fd5b506108eb60048036038101906108e69190614751565b612168565b005b3480156108f8575f80fd5b50610913600480360381019061090e91906145c0565b6121ff565b005b348015610920575f80fd5b506109296122cf565b005b348015610936575f80fd5b50610951600480360381019061094c9190614b30565b612785565b60405161095e919061477c565b60405180910390f35b348015610972575f80fd5b5061098d60048036038101906109889190614af2565b612807565b005b34801561099a575f80fd5b506109b560048036038101906109b091906145c0565b6128ab565b005b6060600880546109c690614b9b565b80601f01602080910402602001604051908101604052809291908181526020018280546109f290614b9b565b8015610a3d5780601f10610a1457610100808354040283529160200191610a3d565b820191905f5260205f20905b815481529060010190602001808311610a2057829003601f168201915b5050505050905090565b5f610a53338484612a61565b6001905092915050565b6012805f0154908060010154905082565b5f60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4490614c15565b60405180910390fd5b8383905086869050148015610b6757508181905086869050145b610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d90614c7d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2c90614ce5565b60405180910390fd5b5f3090505f5b87879050811015610ed6575f888883818110610c5a57610c59614d03565b5b9050602002016020810190610c6f91906145c0565b90505f878784818110610c8557610c84614d03565b5b905060200201359050610cde8160035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612c2490919063ffffffff16565b60035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610d6f8160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612c6d90919063ffffffff16565b60035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82883888887818110610e0157610e00614d03565b5b905060200201356040518363ffffffff1660e01b8152600401610e25929190614d30565b5f604051808303815f87803b158015610e3c575f80fd5b505af1158015610e4e573d5f803e3d5ffd5b50505050610e5c8483612cca565b8173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610eb9919061477c565b60405180910390a350508080610ece90614d84565b915050610c3b565b5050505050505050565b5f80600267ffffffffffffffff811115610efd57610efc614dcb565b5b604051908082528060200260200182016040528015610f2b5781602001602082028036833780820191505090505b50905060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f98573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fbc9190614e0c565b815f81518110610fcf57610fce614d03565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050308160018151811061101e5761101d614d03565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631f00ca7484836040518363ffffffff1660e01b81526004016110b4929190614eee565b5f60405180830381865afa1580156110ce573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906110f6919061503b565b5f8151811061110857611107614d03565b5b6020026020010151915050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600b54905090565b5f611152848484612ebd565b61121e8433611219856040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525060045f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054613c8d9092919063ffffffff16565b612a61565b600190509392505050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad90614c15565b60405180910390fd5b633b9aca00816112c69190615082565b600e8190555050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614c15565b60405180910390fd5b5f479050611368611d8b565b73ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156113aa573d5f803e3d5ffd5b5050565b5f600a5f9054906101000a900460ff16905090565b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c2bc2efc836040518263ffffffff1660e01b815260040161141e9190614923565b602060405180830381865afa158015611439573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061145d91906150c3565b9050919050565b5f6114fa33846114f58560045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612c6d90919063ffffffff16565b612a61565b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158890614c15565b60405180910390fd5b61159c838383613cef565b505050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60019054906101000a900460ff1681565b606060075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480602002602001604051908101604052809291908181526020015f905b82821015611700578382905f5260205f2090600202016040518060400160405290815f8201805461166790614b9b565b80601f016020809104026020016040519081016040528092919081815260200182805461169390614b9b565b80156116de5780601f106116b5576101008083540402835291602001916116de565b820191905f5260205f20905b8154815290600101906020018083116116c157829003601f168201915b5050505050815260200160018201548152505081526020019060010190611637565b505050509050919050565b5f611715306117dc565b90505f81111561174557600c5f9054906101000a900460ff166117445761173b81613d95565b611743613fcb565b5b5b50565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b600d5481565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6015805f0154908060010154905082565b600e5481565b5f60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a690614c15565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ed90614c15565b60405180910390fd5b611a018383836140d0565b505050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8a90614c15565b60405180910390fd5b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82883836040518363ffffffff1660e01b8152600401611aef929190614d30565b5f604051808303815f87803b158015611b06575f80fd5b505af1158015611b18573d5f803e3d5ffd5b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba490614c15565b60405180910390fd5b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82883836040518363ffffffff1660e01b8152600401611c09929190614d30565b5f604051808303815f87803b158015611c20575f80fd5b505af1158015611c32573d5f803e3d5ffd5b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe90614c15565b60405180910390fd5b6014821115611d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0290615138565b60405180910390fd5b6014811115611d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d46906151a0565b60405180910390fd5b8160125f0181905550806012600101819055505050565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060098054611dc190614b9b565b80601f0160208091040260200160405190810160405280929190818152602001828054611ded90614b9b565b8015611e385780601f10611e0f57610100808354040283529160200191611e38565b820191905f5260205f20905b815481529060010190602001808311611e1b57829003601f168201915b5050505050905090565b5f80600267ffffffffffffffff811115611e5f57611e5e614dcb565b5b604051908082528060200260200182016040528015611e8d5781602001602082028036833780820191505090505b50905060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611efa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1e9190614e0c565b815f81518110611f3157611f30614d03565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110611f8057611f7f614d03565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f600d54836040518363ffffffff1660e01b8152600401612018929190614eee565b5f60405180830381865afa158015612032573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061205a919061503b565b60018151811061206d5761206c614d03565b5b602002602001015191505090565b5f6121483384612143856040518060400160405280600181526020017f320000000000000000000000000000000000000000000000000000000000000081525060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054613c8d9092919063ffffffff16565b612a61565b6001905092915050565b5f61215e338484612ebd565b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ec90614c15565b60405180910390fd5b80600d8190555050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461228c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228390614c15565b60405180910390fd5b8060145f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461235c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235390614c15565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e290615208565b60405180910390fd5b6124193060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b54612a61565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612483573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124a79190614e0c565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561252d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125519190614e0c565b6040518363ffffffff1660e01b815260040161256e929190615226565b6020604051808303815f875af115801561258a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125ae9190614e0c565b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7194730612635306117dc565b5f8061263f611d8b565b426040518863ffffffff1660e01b815260040161266196959493929190615286565b60606040518083038185885af115801561267d573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906126a291906152e5565b50505060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b360015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401612742929190614d30565b6020604051808303815f875af115801561275e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127829190615349565b50565b5f60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288b90614c15565b60405180910390fd5b8160155f0181905550806015600101819055505050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292f90614c15565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036129a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299d906153e4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac69061544c565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b34906154b4565b60405180910390fd5b8060045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612c17919061477c565b60405180910390a3505050565b5f612c6583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613c8d565b905092915050565b5f808284612c7b91906154d2565b905083811015612cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb79061554f565b60405180910390fd5b8091505092915050565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b1836040518263ffffffff1660e01b8152600401612d249190614923565b5f604051808303815f87803b158015612d3b575f80fd5b505af1925050508015612d4c575060015b5060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b1826040518263ffffffff1660e01b8152600401612da79190614923565b5f604051808303815f87803b158015612dbe575f80fd5b505af1925050508015612dcf575060015b5060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c33fb8776040518163ffffffff1660e01b81526004016060604051808303815f875af1925050508015612e5a57506040513d601f19601f82011682018060405250810190612e5791906152e5565b60015b15612eb9573273ffffffffffffffffffffffffffffffffffffffff16600115157fd401621dbefa4e4b58dfded2f6ce557f2bf581dde5dca5670c9993d2fb1bee0d858585604051612ead9392919061556d565b60405180910390a35050505b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f22906155ec565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9090615654565b60405180910390fd5b5f8111612fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd2906156bc565b60405180910390fd5b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801561307a575060055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156130b95750613089611d8b565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156130f857506130c8611d8b565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b90505f61311683613108866117dc565b612c6d90919063ffffffff16565b90505f613121611d8b565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415801561318f575061315f611d8b565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156131e8575060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b801561322057503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b801561325857503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15613a565760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036135835782156132fd57600e548211156132fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f390615724565b60405180910390fd5b5b82613308575f613333565b613332606461332460125f01548761417690919063ffffffff16565b6141ed90919063ffffffff16565b5b90505f61333f85610ee0565b90505f6133ed8260115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c2bc2efc8a6040518263ffffffff1660e01b81526004016133a09190614923565b602060405180830381865afa1580156133bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133df91906150c3565b612c6d90919063ffffffff16565b905060115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82888836040518363ffffffff1660e01b815260040161344b929190614d30565b5f604051808303815f87803b158015613462575f80fd5b505af1158015613474573d5f803e3d5ffd5b5050505060075f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060405180604001604052806040518060400160405280600381526020017f4255590000000000000000000000000000000000000000000000000000000000815250815260200184815250908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f01908161353891906158d6565b506020820151816001015550507f47744cc547f0cc32a68348ccb6e26f815f647757d949205cd3da16ed48446c03878383604051613578939291906159ef565b60405180910390a150505b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415801561362c575060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b156138cd578261363c575f613668565b61366760646136596012600101548761417690919063ffffffff16565b6141ed90919063ffffffff16565b5b90505f61367485610ee0565b90505f8160115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c2bc2efc8a6040518263ffffffff1660e01b81526004016136d29190614923565b602060405180830381865afa1580156136ed573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061371191906150c3565b61371b9190615a40565b90505f8082131561372c578161372e565b5f5b905060115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d8288a836040518363ffffffff1660e01b815260040161378c929190614d30565b5f604051808303815f87803b1580156137a3575f80fd5b505af11580156137b5573d5f803e3d5ffd5b5050505060075f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060405180604001604052806040518060400160405280600481526020017f53454c4c00000000000000000000000000000000000000000000000000000000815250815260200185815250908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f01908161387991906158d6565b506020820151816001015550507f47744cc547f0cc32a68348ccb6e26f815f647757d949205cd3da16ed48446c038984836040516138b993929190615aca565b60405180910390a16138c9614236565b5050505b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015613977575060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15613a4b57600e548211156139c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139b890615b5c565b60405180910390fd5b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d828875f6040518363ffffffff1660e01b8152600401613a1d929190615b7a565b5f604051808303815f87803b158015613a34575f80fd5b505af1158015613a46573d5f803e3d5ffd5b505050505b613a558686612cca565b5b5f613a6a8286612c2490919063ffffffff16565b9050613abc8560035f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612c2490919063ffffffff16565b60035f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550613b4d8160035f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612c6d90919063ffffffff16565b60035f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550613bde8260035f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612c6d90919063ffffffff16565b60035f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051613c7c919061477c565b60405180910390a350505050505050565b5f838311158290613cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ccb919061445b565b60405180910390fd5b505f8385613ce29190615ba1565b9050809150509392505050565b5f5b83839050811015613d8f575f848483818110613d1057613d0f614d03565b5b9050602002016020810190613d2591906145c0565b90508260055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550508080613d8790614d84565b915050613cf1565b50505050565b5f600267ffffffffffffffff811115613db157613db0614dcb565b5b604051908082528060200260200182016040528015613ddf5781602001602082028036833780820191505090505b50905030815f81518110613df657613df5614d03565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613e9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ebe9190614e0c565b81600181518110613ed257613ed1614d03565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613f383060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612a61565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401613f9a959493929190615bd4565b5f604051808303815f87803b158015613fb1575f80fd5b505af1158015613fc3573d5f803e3d5ffd5b505050505050565b6001600c5f6101000a81548160ff0219169083151502179055505f4790505f614014606461400660155f01548561417690919063ffffffff16565b6141ed90919063ffffffff16565b90505f61404260646140346015600101548661417690919063ffffffff16565b6141ed90919063ffffffff16565b9050600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f193505050501580156140a8573d5f803e3d5ffd5b506140b2816142a5565b5050505f600c5f6101000a81548160ff021916908315150217905550565b5f5b83839050811015614170575f8484838181106140f1576140f0614d03565b5b905060200201602081019061410691906145c0565b90508260065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050808061416890614d84565b9150506140d2565b50505050565b5f808303614186575f90506141e7565b5f82846141939190615082565b90508284826141a29190615c59565b146141e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141d990615cf9565b60405180910390fd5b809150505b92915050565b5f61422e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614370565b905092915050565b5f614240306117dc565b90505f8111156142a2575f614253611e42565b90508082101580156142715750600c5f9054906101000a900460ff16155b80156142895750600c60019054906101000a900460ff165b156142a05761429781613d95565b61429f613fcb565b5b505b50565b5f60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516142eb90615d44565b5f6040518083038185875af1925050503d805f8114614325576040519150601f19603f3d011682016040523d82523d5f602084013e61432a565b606091505b50509050801561436c577f8d506e73abc3fae6fd0fd6faac7b7ff03e47622fa1e4fa03fc1e8f9801769afa82604051614363919061477c565b60405180910390a15b5050565b5f80831182906143b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016143ad919061445b565b60405180910390fd5b505f83856143c49190615c59565b9050809150509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156144085780820151818401526020810190506143ed565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61442d826143d1565b61443781856143db565b93506144478185602086016143eb565b61445081614413565b840191505092915050565b5f6020820190508181035f8301526144738184614423565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6144b58261448c565b9050919050565b6144c5816144ab565b81146144cf575f80fd5b50565b5f813590506144e0816144bc565b92915050565b5f819050919050565b6144f8816144e6565b8114614502575f80fd5b50565b5f81359050614513816144ef565b92915050565b5f806040838503121561452f5761452e614484565b5b5f61453c858286016144d2565b925050602061454d85828601614505565b9150509250929050565b5f8115159050919050565b61456b81614557565b82525050565b5f6020820190506145845f830184614562565b92915050565b614593816144e6565b82525050565b5f6040820190506145ac5f83018561458a565b6145b9602083018461458a565b9392505050565b5f602082840312156145d5576145d4614484565b5b5f6145e2848285016144d2565b91505092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261460c5761460b6145eb565b5b8235905067ffffffffffffffff811115614629576146286145ef565b5b602083019150836020820283011115614645576146446145f3565b5b9250929050565b5f8083601f840112614661576146606145eb565b5b8235905067ffffffffffffffff81111561467e5761467d6145ef565b5b60208301915083602082028301111561469a576146996145f3565b5b9250929050565b5f805f805f80606087890312156146bb576146ba614484565b5b5f87013567ffffffffffffffff8111156146d8576146d7614488565b5b6146e489828a016145f7565b9650965050602087013567ffffffffffffffff81111561470757614706614488565b5b61471389828a0161464c565b9450945050604087013567ffffffffffffffff81111561473657614735614488565b5b61474289828a0161464c565b92509250509295509295509295565b5f6020828403121561476657614765614484565b5b5f61477384828501614505565b91505092915050565b5f60208201905061478f5f83018461458a565b92915050565b5f819050919050565b5f6147b86147b36147ae8461448c565b614795565b61448c565b9050919050565b5f6147c98261479e565b9050919050565b5f6147da826147bf565b9050919050565b6147ea816147d0565b82525050565b5f6020820190506148035f8301846147e1565b92915050565b5f805f606084860312156148205761481f614484565b5b5f61482d868287016144d2565b935050602061483e868287016144d2565b925050604061484f86828701614505565b9150509250925092565b5f60ff82169050919050565b61486e81614859565b82525050565b5f6020820190506148875f830184614865565b92915050565b61489681614557565b81146148a0575f80fd5b50565b5f813590506148b18161488d565b92915050565b5f805f604084860312156148ce576148cd614484565b5b5f84013567ffffffffffffffff8111156148eb576148ea614488565b5b6148f7868287016145f7565b9350935050602061490a868287016148a3565b9150509250925092565b61491d816144ab565b82525050565b5f6020820190506149365f830184614914565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f82825260208201905092915050565b5f61497f826143d1565b6149898185614965565b93506149998185602086016143eb565b6149a281614413565b840191505092915050565b6149b6816144e6565b82525050565b5f604083015f8301518482035f8601526149d68282614975565b91505060208301516149eb60208601826149ad565b508091505092915050565b5f614a0183836149bc565b905092915050565b5f602082019050919050565b5f614a1f8261493c565b614a298185614946565b935083602082028501614a3b85614956565b805f5b85811015614a765784840389528151614a5785826149f6565b9450614a6283614a09565b925060208a01995050600181019050614a3e565b50829750879550505050505092915050565b5f6020820190508181035f830152614aa08184614a15565b905092915050565b5f614ab28261479e565b9050919050565b5f614ac382614aa8565b9050919050565b614ad381614ab9565b82525050565b5f602082019050614aec5f830184614aca565b92915050565b5f8060408385031215614b0857614b07614484565b5b5f614b1585828601614505565b9250506020614b2685828601614505565b9150509250929050565b5f8060408385031215614b4657614b45614484565b5b5f614b53858286016144d2565b9250506020614b64858286016144d2565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614bb257607f821691505b602082108103614bc557614bc4614b6e565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f614bff6020836143db565b9150614c0a82614bcb565b602082019050919050565b5f6020820190508181035f830152614c2c81614bf3565b9050919050565b7f31320000000000000000000000000000000000000000000000000000000000005f82015250565b5f614c676002836143db565b9150614c7282614c33565b602082019050919050565b5f6020820190508181035f830152614c9481614c5b565b9050919050565b7f31330000000000000000000000000000000000000000000000000000000000005f82015250565b5f614ccf6002836143db565b9150614cda82614c9b565b602082019050919050565b5f6020820190508181035f830152614cfc81614cc3565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f604082019050614d435f830185614914565b614d50602083018461458a565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614d8e826144e6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614dc057614dbf614d57565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f81519050614e06816144bc565b92915050565b5f60208284031215614e2157614e20614484565b5b5f614e2e84828501614df8565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614e69816144ab565b82525050565b5f614e7a8383614e60565b60208301905092915050565b5f602082019050919050565b5f614e9c82614e37565b614ea68185614e41565b9350614eb183614e51565b805f5b83811015614ee1578151614ec88882614e6f565b9750614ed383614e86565b925050600181019050614eb4565b5085935050505092915050565b5f604082019050614f015f83018561458a565b8181036020830152614f138184614e92565b90509392505050565b614f2582614413565b810181811067ffffffffffffffff82111715614f4457614f43614dcb565b5b80604052505050565b5f614f5661447b565b9050614f628282614f1c565b919050565b5f67ffffffffffffffff821115614f8157614f80614dcb565b5b602082029050602081019050919050565b5f81519050614fa0816144ef565b92915050565b5f614fb8614fb384614f67565b614f4d565b90508083825260208201905060208402830185811115614fdb57614fda6145f3565b5b835b818110156150045780614ff08882614f92565b845260208401935050602081019050614fdd565b5050509392505050565b5f82601f830112615022576150216145eb565b5b8151615032848260208601614fa6565b91505092915050565b5f602082840312156150505761504f614484565b5b5f82015167ffffffffffffffff81111561506d5761506c614488565b5b6150798482850161500e565b91505092915050565b5f61508c826144e6565b9150615097836144e6565b92508282026150a5816144e6565b915082820484148315176150bc576150bb614d57565b5b5092915050565b5f602082840312156150d8576150d7614484565b5b5f6150e584828501614f92565b91505092915050565b7f33000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6151226001836143db565b915061512d826150ee565b602082019050919050565b5f6020820190508181035f83015261514f81615116565b9050919050565b7f34000000000000000000000000000000000000000000000000000000000000005f82015250565b5f61518a6001836143db565b915061519582615156565b602082019050919050565b5f6020820190508181035f8301526151b78161517e565b9050919050565b7f31340000000000000000000000000000000000000000000000000000000000005f82015250565b5f6151f26002836143db565b91506151fd826151be565b602082019050919050565b5f6020820190508181035f83015261521f816151e6565b9050919050565b5f6040820190506152395f830185614914565b6152466020830184614914565b9392505050565b5f819050919050565b5f61527061526b6152668461524d565b614795565b6144e6565b9050919050565b61528081615256565b82525050565b5f60c0820190506152995f830189614914565b6152a6602083018861458a565b6152b36040830187615277565b6152c06060830186615277565b6152cd6080830185614914565b6152da60a083018461458a565b979650505050505050565b5f805f606084860312156152fc576152fb614484565b5b5f61530986828701614f92565b935050602061531a86828701614f92565b925050604061532b86828701614f92565b9150509250925092565b5f815190506153438161488d565b92915050565b5f6020828403121561535e5761535d614484565b5b5f61536b84828501615335565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6153ce6026836143db565b91506153d982615374565b604082019050919050565b5f6020820190508181035f8301526153fb816153c2565b9050919050565b7f35000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6154366001836143db565b915061544182615402565b602082019050919050565b5f6020820190508181035f8301526154638161542a565b9050919050565b7f36000000000000000000000000000000000000000000000000000000000000005f82015250565b5f61549e6001836143db565b91506154a98261546a565b602082019050919050565b5f6020820190508181035f8301526154cb81615492565b9050919050565b5f6154dc826144e6565b91506154e7836144e6565b92508282019050808211156154ff576154fe614d57565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f615539601b836143db565b915061554482615505565b602082019050919050565b5f6020820190508181035f8301526155668161552d565b9050919050565b5f6060820190506155805f83018661458a565b61558d602083018561458a565b61559a604083018461458a565b949350505050565b7f37000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6155d66001836143db565b91506155e1826155a2565b602082019050919050565b5f6020820190508181035f830152615603816155ca565b9050919050565b7f38000000000000000000000000000000000000000000000000000000000000005f82015250565b5f61563e6001836143db565b91506156498261560a565b602082019050919050565b5f6020820190508181035f83015261566b81615632565b9050919050565b7f39000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6156a66001836143db565b91506156b182615672565b602082019050919050565b5f6020820190508181035f8301526156d38161569a565b9050919050565b7f31300000000000000000000000000000000000000000000000000000000000005f82015250565b5f61570e6002836143db565b9150615719826156da565b602082019050919050565b5f6020820190508181035f83015261573b81615702565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261579e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615763565b6157a88683615763565b95508019841693508086168417925050509392505050565b5f6157da6157d56157d0846144e6565b614795565b6144e6565b9050919050565b5f819050919050565b6157f3836157c0565b6158076157ff826157e1565b84845461576f565b825550505050565b5f90565b61581b61580f565b6158268184846157ea565b505050565b5b818110156158495761583e5f82615813565b60018101905061582c565b5050565b601f82111561588e5761585f81615742565b61586884615754565b81016020851015615877578190505b61588b61588385615754565b83018261582b565b50505b505050565b5f82821c905092915050565b5f6158ae5f1984600802615893565b1980831691505092915050565b5f6158c6838361589f565b9150826002028217905092915050565b6158df826143d1565b67ffffffffffffffff8111156158f8576158f7614dcb565b5b6159028254614b9b565b61590d82828561584d565b5f60209050601f83116001811461593e575f841561592c578287015190505b61593685826158bb565b86555061599d565b601f19841661594c86615742565b5f5b828110156159735784890151825560018201915060208501945060208101905061594e565b86831015615990578489015161598c601f89168261589f565b8355505b6001600288020188555050505b505050505050565b7f42555900000000000000000000000000000000000000000000000000000000005f82015250565b5f6159d96003836143db565b91506159e4826159a5565b602082019050919050565b5f608082019050615a025f830186614914565b8181036020830152615a13816159cd565b9050615a22604083018561458a565b615a2f606083018461458a565b949350505050565b5f819050919050565b5f615a4a82615a37565b9150615a5583615a37565b925082820390508181125f8412168282135f851215161715615a7a57615a79614d57565b5b92915050565b7f53454c4c000000000000000000000000000000000000000000000000000000005f82015250565b5f615ab46004836143db565b9150615abf82615a80565b602082019050919050565b5f608082019050615add5f830186614914565b8181036020830152615aee81615aa8565b9050615afd604083018561458a565b615b0a606083018461458a565b949350505050565b7f31310000000000000000000000000000000000000000000000000000000000005f82015250565b5f615b466002836143db565b9150615b5182615b12565b602082019050919050565b5f6020820190508181035f830152615b7381615b3a565b9050919050565b5f604082019050615b8d5f830185614914565b615b9a6020830184615277565b9392505050565b5f615bab826144e6565b9150615bb6836144e6565b9250828203905081811115615bce57615bcd614d57565b5b92915050565b5f60a082019050615be75f83018861458a565b615bf46020830187615277565b8181036040830152615c068186614e92565b9050615c156060830185614914565b615c22608083018461458a565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f615c63826144e6565b9150615c6e836144e6565b925082615c7e57615c7d615c2c565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f5f8201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b5f615ce36021836143db565b9150615cee82615c89565b604082019050919050565b5f6020820190508181035f830152615d1081615cd7565b9050919050565b5f81905092915050565b50565b5f615d2f5f83615d17565b9150615d3a82615d21565b5f82019050919050565b5f615d4e82615d24565b915081905091905056fea2646970667358221220337add910fd1e1fc4fa83e07cbc4837ae4daece219aa3075365536cde2f54c4f64736f6c63430008140033608060405234801561000f575f80fd5b50610a798061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061007b575f3560e01c8063663037ac11610059578063663037ac146100e7578063949d225d14610117578063c2bc2efc14610135578063cd413329146101655761007b565b806329092d0e1461007f5780633825d8281461009b578063564c8d11146100b7575b5f80fd5b6100996004803603810190610094919061080e565b610195565b005b6100b560048036038101906100b0919061086c565b61043c565b005b6100d160048036038101906100cc919061080e565b610621565b6040516100de91906108c2565b60405180910390f35b61010160048036038101906100fc91906108db565b6106e2565b60405161010e9190610915565b60405180910390f35b61011f610727565b60405161012c919061093d565b60405180910390f35b61014f600480360381019061014a919061080e565b610734565b60405161015c919061093d565b60405180910390f35b61017f600480360381019061017a919061080e565b61077c565b60405161018c9190610970565b60405180910390f35b5f6003015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615610439575f6003015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81549060ff02191690555f6001015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90555f806002015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60015f8001805490506102cd91906109b6565b90505f805f0182815481106102e5576102e46109e9565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050825f6002015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f6002015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9055805f800184815481106103ab576103aa6109e9565b5b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f800180548061040357610402610a16565b5b600190038181905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555050505b50565b5f6003015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156104d657805f6001015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555061061d565b60015f6003015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550805f6001015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f8001805490505f6002015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f800182908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b5f806003015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661069a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90506106dd565b5f6002015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505b919050565b5f805f0182815481106106f8576106f76109e9565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f805f0180549050905090565b5f806001015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6107a783610621565b14159050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6107dd826107b4565b9050919050565b6107ed816107d3565b81146107f7575f80fd5b50565b5f81359050610808816107e4565b92915050565b5f60208284031215610823576108226107b0565b5b5f610830848285016107fa565b91505092915050565b5f819050919050565b61084b81610839565b8114610855575f80fd5b50565b5f8135905061086681610842565b92915050565b5f8060408385031215610882576108816107b0565b5b5f61088f858286016107fa565b92505060206108a085828601610858565b9150509250929050565b5f819050919050565b6108bc816108aa565b82525050565b5f6020820190506108d55f8301846108b3565b92915050565b5f602082840312156108f0576108ef6107b0565b5b5f6108fd84828501610858565b91505092915050565b61090f816107d3565b82525050565b5f6020820190506109285f830184610906565b92915050565b61093781610839565b82525050565b5f6020820190506109505f83018461092e565b92915050565b5f8115159050919050565b61096a81610956565b82525050565b5f6020820190506109835f830184610961565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6109c082610839565b91506109cb83610839565b92508282039050818111156109e3576109e2610989565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea2646970667358221220aa85df7a8f302e2a7157302f9e68614ed5699b4b68e98570f75e8b03f7c7f72464736f6c63430008140033

Deployed Bytecode

0x608060405260043610610254575f3560e01c806359a05f89116101385780638da5cb5b116100b5578063b2abbbc411610079578063b2abbbc4146108c5578063ba385abb146108ed578063c9567bf914610915578063dd62ed3e1461092b578063f18dba2614610967578063f2fde38b1461098f5761025b565b80638da5cb5b146107cf57806395d89b41146107f95780639799570614610823578063a457c2d71461084d578063a9059cbb146108895761025b565b806371cd56af116100fc57806371cd56af1461070557806376f7b5bc1461072d57806379c2e2001461075557806381230a831461077d57806385141a77146107a55761025b565b806359a05f89146106345780635ee58efc1461065e5780636c0a24eb1461068957806370a08231146106b3578063715018a6146106ef5761025b565b8063280d3821116101d157806349bd5a5e1161019557806349bd5a5e146105285780634a74bb02146105525780634fda2e121461057c57806351bc3c85146105b85780635342acb4146105ce57806354a5df1f1461060a5761025b565b8063280d382114610448578063313ce5671461045e578063345487d01461048857806339509351146104c4578063441d801f146105005761025b565b806314f944bd1161021857806314f944bd146103545780631694505e1461039057806318160ddd146103ba57806323b872dd146103e457806327a14fc2146104205761025b565b806306fdde031461025f578063095ea7b3146102895780630ddc0976146102c55780630e832273146102f057806311f0b5161461032c5761025b565b3661025b57005b5f80fd5b34801561026a575f80fd5b506102736109b7565b604051610280919061445b565b60405180910390f35b348015610294575f80fd5b506102af60048036038101906102aa9190614519565b610a47565b6040516102bc9190614571565b60405180910390f35b3480156102d0575f80fd5b506102d9610a5d565b6040516102e7929190614599565b60405180910390f35b3480156102fb575f80fd5b50610316600480360381019061031191906145c0565b610a6e565b6040516103239190614571565b60405180910390f35b348015610337575f80fd5b50610352600480360381019061034d91906146a1565b610ac0565b005b34801561035f575f80fd5b5061037a60048036038101906103759190614751565b610ee0565b604051610387919061477c565b60405180910390f35b34801561039b575f80fd5b506103a4611118565b6040516103b191906147f0565b60405180910390f35b3480156103c5575f80fd5b506103ce61113d565b6040516103db919061477c565b60405180910390f35b3480156103ef575f80fd5b5061040a60048036038101906104059190614809565b611146565b6040516104179190614571565b60405180910390f35b34801561042b575f80fd5b5061044660048036038101906104419190614751565b611229565b005b348015610453575f80fd5b5061045c6112cf565b005b348015610469575f80fd5b506104726113ae565b60405161047f9190614874565b60405180910390f35b348015610493575f80fd5b506104ae60048036038101906104a991906145c0565b6113c3565b6040516104bb919061477c565b60405180910390f35b3480156104cf575f80fd5b506104ea60048036038101906104e59190614519565b611464565b6040516104f79190614571565b60405180910390f35b34801561050b575f80fd5b50610526600480360381019061052191906148b7565b611504565b005b348015610533575f80fd5b5061053c6115a1565b6040516105499190614923565b60405180910390f35b34801561055d575f80fd5b506105666115c6565b6040516105739190614571565b60405180910390f35b348015610587575f80fd5b506105a2600480360381019061059d91906145c0565b6115d9565b6040516105af9190614a88565b60405180910390f35b3480156105c3575f80fd5b506105cc61170b565b005b3480156105d9575f80fd5b506105f460048036038101906105ef91906145c0565b611748565b6040516106019190614571565b60405180910390f35b348015610615575f80fd5b5061061e61179a565b60405161062b919061477c565b60405180910390f35b34801561063f575f80fd5b506106486117a0565b6040516106559190614ad9565b60405180910390f35b348015610669575f80fd5b506106726117c5565b604051610680929190614599565b60405180910390f35b348015610694575f80fd5b5061069d6117d6565b6040516106aa919061477c565b60405180910390f35b3480156106be575f80fd5b506106d960048036038101906106d491906145c0565b6117dc565b6040516106e6919061477c565b60405180910390f35b3480156106fa575f80fd5b50610703611822565b005b348015610710575f80fd5b5061072b600480360381019061072691906148b7565b611969565b005b348015610738575f80fd5b50610753600480360381019061074e9190614519565b611a06565b005b348015610760575f80fd5b5061077b60048036038101906107769190614519565b611b20565b005b348015610788575f80fd5b506107a3600480360381019061079e9190614af2565b611c3a565b005b3480156107b0575f80fd5b506107b9611d66565b6040516107c69190614923565b60405180910390f35b3480156107da575f80fd5b506107e3611d8b565b6040516107f09190614923565b60405180910390f35b348015610804575f80fd5b5061080d611db2565b60405161081a919061445b565b60405180910390f35b34801561082e575f80fd5b50610837611e42565b604051610844919061477c565b60405180910390f35b348015610858575f80fd5b50610873600480360381019061086e9190614519565b61207b565b6040516108809190614571565b60405180910390f35b348015610894575f80fd5b506108af60048036038101906108aa9190614519565b612152565b6040516108bc9190614571565b60405180910390f35b3480156108d0575f80fd5b506108eb60048036038101906108e69190614751565b612168565b005b3480156108f8575f80fd5b50610913600480360381019061090e91906145c0565b6121ff565b005b348015610920575f80fd5b506109296122cf565b005b348015610936575f80fd5b50610951600480360381019061094c9190614b30565b612785565b60405161095e919061477c565b60405180910390f35b348015610972575f80fd5b5061098d60048036038101906109889190614af2565b612807565b005b34801561099a575f80fd5b506109b560048036038101906109b091906145c0565b6128ab565b005b6060600880546109c690614b9b565b80601f01602080910402602001604051908101604052809291908181526020018280546109f290614b9b565b8015610a3d5780601f10610a1457610100808354040283529160200191610a3d565b820191905f5260205f20905b815481529060010190602001808311610a2057829003601f168201915b5050505050905090565b5f610a53338484612a61565b6001905092915050565b6012805f0154908060010154905082565b5f60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4490614c15565b60405180910390fd5b8383905086869050148015610b6757508181905086869050145b610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d90614c7d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2c90614ce5565b60405180910390fd5b5f3090505f5b87879050811015610ed6575f888883818110610c5a57610c59614d03565b5b9050602002016020810190610c6f91906145c0565b90505f878784818110610c8557610c84614d03565b5b905060200201359050610cde8160035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612c2490919063ffffffff16565b60035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610d6f8160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612c6d90919063ffffffff16565b60035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82883888887818110610e0157610e00614d03565b5b905060200201356040518363ffffffff1660e01b8152600401610e25929190614d30565b5f604051808303815f87803b158015610e3c575f80fd5b505af1158015610e4e573d5f803e3d5ffd5b50505050610e5c8483612cca565b8173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610eb9919061477c565b60405180910390a350508080610ece90614d84565b915050610c3b565b5050505050505050565b5f80600267ffffffffffffffff811115610efd57610efc614dcb565b5b604051908082528060200260200182016040528015610f2b5781602001602082028036833780820191505090505b50905060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f98573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fbc9190614e0c565b815f81518110610fcf57610fce614d03565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050308160018151811061101e5761101d614d03565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631f00ca7484836040518363ffffffff1660e01b81526004016110b4929190614eee565b5f60405180830381865afa1580156110ce573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906110f6919061503b565b5f8151811061110857611107614d03565b5b6020026020010151915050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600b54905090565b5f611152848484612ebd565b61121e8433611219856040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525060045f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054613c8d9092919063ffffffff16565b612a61565b600190509392505050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad90614c15565b60405180910390fd5b633b9aca00816112c69190615082565b600e8190555050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614c15565b60405180910390fd5b5f479050611368611d8b565b73ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156113aa573d5f803e3d5ffd5b5050565b5f600a5f9054906101000a900460ff16905090565b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c2bc2efc836040518263ffffffff1660e01b815260040161141e9190614923565b602060405180830381865afa158015611439573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061145d91906150c3565b9050919050565b5f6114fa33846114f58560045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612c6d90919063ffffffff16565b612a61565b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158890614c15565b60405180910390fd5b61159c838383613cef565b505050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60019054906101000a900460ff1681565b606060075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480602002602001604051908101604052809291908181526020015f905b82821015611700578382905f5260205f2090600202016040518060400160405290815f8201805461166790614b9b565b80601f016020809104026020016040519081016040528092919081815260200182805461169390614b9b565b80156116de5780601f106116b5576101008083540402835291602001916116de565b820191905f5260205f20905b8154815290600101906020018083116116c157829003601f168201915b5050505050815260200160018201548152505081526020019060010190611637565b505050509050919050565b5f611715306117dc565b90505f81111561174557600c5f9054906101000a900460ff166117445761173b81613d95565b611743613fcb565b5b5b50565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b600d5481565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6015805f0154908060010154905082565b600e5481565b5f60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a690614c15565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ed90614c15565b60405180910390fd5b611a018383836140d0565b505050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8a90614c15565b60405180910390fd5b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82883836040518363ffffffff1660e01b8152600401611aef929190614d30565b5f604051808303815f87803b158015611b06575f80fd5b505af1158015611b18573d5f803e3d5ffd5b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba490614c15565b60405180910390fd5b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82883836040518363ffffffff1660e01b8152600401611c09929190614d30565b5f604051808303815f87803b158015611c20575f80fd5b505af1158015611c32573d5f803e3d5ffd5b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe90614c15565b60405180910390fd5b6014821115611d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0290615138565b60405180910390fd5b6014811115611d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d46906151a0565b60405180910390fd5b8160125f0181905550806012600101819055505050565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060098054611dc190614b9b565b80601f0160208091040260200160405190810160405280929190818152602001828054611ded90614b9b565b8015611e385780601f10611e0f57610100808354040283529160200191611e38565b820191905f5260205f20905b815481529060010190602001808311611e1b57829003601f168201915b5050505050905090565b5f80600267ffffffffffffffff811115611e5f57611e5e614dcb565b5b604051908082528060200260200182016040528015611e8d5781602001602082028036833780820191505090505b50905060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611efa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1e9190614e0c565b815f81518110611f3157611f30614d03565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110611f8057611f7f614d03565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f600d54836040518363ffffffff1660e01b8152600401612018929190614eee565b5f60405180830381865afa158015612032573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061205a919061503b565b60018151811061206d5761206c614d03565b5b602002602001015191505090565b5f6121483384612143856040518060400160405280600181526020017f320000000000000000000000000000000000000000000000000000000000000081525060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054613c8d9092919063ffffffff16565b612a61565b6001905092915050565b5f61215e338484612ebd565b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ec90614c15565b60405180910390fd5b80600d8190555050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461228c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228390614c15565b60405180910390fd5b8060145f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461235c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235390614c15565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e290615208565b60405180910390fd5b6124193060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b54612a61565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612483573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124a79190614e0c565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561252d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125519190614e0c565b6040518363ffffffff1660e01b815260040161256e929190615226565b6020604051808303815f875af115801561258a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125ae9190614e0c565b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7194730612635306117dc565b5f8061263f611d8b565b426040518863ffffffff1660e01b815260040161266196959493929190615286565b60606040518083038185885af115801561267d573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906126a291906152e5565b50505060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b360015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401612742929190614d30565b6020604051808303815f875af115801561275e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127829190615349565b50565b5f60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288b90614c15565b60405180910390fd5b8160155f0181905550806015600101819055505050565b3373ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292f90614c15565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036129a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299d906153e4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac69061544c565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b34906154b4565b60405180910390fd5b8060045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612c17919061477c565b60405180910390a3505050565b5f612c6583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613c8d565b905092915050565b5f808284612c7b91906154d2565b905083811015612cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb79061554f565b60405180910390fd5b8091505092915050565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b1836040518263ffffffff1660e01b8152600401612d249190614923565b5f604051808303815f87803b158015612d3b575f80fd5b505af1925050508015612d4c575060015b5060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b1826040518263ffffffff1660e01b8152600401612da79190614923565b5f604051808303815f87803b158015612dbe575f80fd5b505af1925050508015612dcf575060015b5060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c33fb8776040518163ffffffff1660e01b81526004016060604051808303815f875af1925050508015612e5a57506040513d601f19601f82011682018060405250810190612e5791906152e5565b60015b15612eb9573273ffffffffffffffffffffffffffffffffffffffff16600115157fd401621dbefa4e4b58dfded2f6ce557f2bf581dde5dca5670c9993d2fb1bee0d858585604051612ead9392919061556d565b60405180910390a35050505b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f22906155ec565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9090615654565b60405180910390fd5b5f8111612fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd2906156bc565b60405180910390fd5b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801561307a575060055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156130b95750613089611d8b565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156130f857506130c8611d8b565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b90505f61311683613108866117dc565b612c6d90919063ffffffff16565b90505f613121611d8b565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415801561318f575061315f611d8b565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156131e8575060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b801561322057503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b801561325857503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15613a565760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036135835782156132fd57600e548211156132fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f390615724565b60405180910390fd5b5b82613308575f613333565b613332606461332460125f01548761417690919063ffffffff16565b6141ed90919063ffffffff16565b5b90505f61333f85610ee0565b90505f6133ed8260115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c2bc2efc8a6040518263ffffffff1660e01b81526004016133a09190614923565b602060405180830381865afa1580156133bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133df91906150c3565b612c6d90919063ffffffff16565b905060115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82888836040518363ffffffff1660e01b815260040161344b929190614d30565b5f604051808303815f87803b158015613462575f80fd5b505af1158015613474573d5f803e3d5ffd5b5050505060075f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060405180604001604052806040518060400160405280600381526020017f4255590000000000000000000000000000000000000000000000000000000000815250815260200184815250908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f01908161353891906158d6565b506020820151816001015550507f47744cc547f0cc32a68348ccb6e26f815f647757d949205cd3da16ed48446c03878383604051613578939291906159ef565b60405180910390a150505b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415801561362c575060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b156138cd578261363c575f613668565b61366760646136596012600101548761417690919063ffffffff16565b6141ed90919063ffffffff16565b5b90505f61367485610ee0565b90505f8160115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c2bc2efc8a6040518263ffffffff1660e01b81526004016136d29190614923565b602060405180830381865afa1580156136ed573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061371191906150c3565b61371b9190615a40565b90505f8082131561372c578161372e565b5f5b905060115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d8288a836040518363ffffffff1660e01b815260040161378c929190614d30565b5f604051808303815f87803b1580156137a3575f80fd5b505af11580156137b5573d5f803e3d5ffd5b5050505060075f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060405180604001604052806040518060400160405280600481526020017f53454c4c00000000000000000000000000000000000000000000000000000000815250815260200185815250908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f01908161387991906158d6565b506020820151816001015550507f47744cc547f0cc32a68348ccb6e26f815f647757d949205cd3da16ed48446c038984836040516138b993929190615aca565b60405180910390a16138c9614236565b5050505b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015613977575060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15613a4b57600e548211156139c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139b890615b5c565b60405180910390fd5b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d828875f6040518363ffffffff1660e01b8152600401613a1d929190615b7a565b5f604051808303815f87803b158015613a34575f80fd5b505af1158015613a46573d5f803e3d5ffd5b505050505b613a558686612cca565b5b5f613a6a8286612c2490919063ffffffff16565b9050613abc8560035f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612c2490919063ffffffff16565b60035f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550613b4d8160035f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612c6d90919063ffffffff16565b60035f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550613bde8260035f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612c6d90919063ffffffff16565b60035f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051613c7c919061477c565b60405180910390a350505050505050565b5f838311158290613cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ccb919061445b565b60405180910390fd5b505f8385613ce29190615ba1565b9050809150509392505050565b5f5b83839050811015613d8f575f848483818110613d1057613d0f614d03565b5b9050602002016020810190613d2591906145c0565b90508260055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550508080613d8790614d84565b915050613cf1565b50505050565b5f600267ffffffffffffffff811115613db157613db0614dcb565b5b604051908082528060200260200182016040528015613ddf5781602001602082028036833780820191505090505b50905030815f81518110613df657613df5614d03565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613e9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ebe9190614e0c565b81600181518110613ed257613ed1614d03565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613f383060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612a61565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401613f9a959493929190615bd4565b5f604051808303815f87803b158015613fb1575f80fd5b505af1158015613fc3573d5f803e3d5ffd5b505050505050565b6001600c5f6101000a81548160ff0219169083151502179055505f4790505f614014606461400660155f01548561417690919063ffffffff16565b6141ed90919063ffffffff16565b90505f61404260646140346015600101548661417690919063ffffffff16565b6141ed90919063ffffffff16565b9050600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f193505050501580156140a8573d5f803e3d5ffd5b506140b2816142a5565b5050505f600c5f6101000a81548160ff021916908315150217905550565b5f5b83839050811015614170575f8484838181106140f1576140f0614d03565b5b905060200201602081019061410691906145c0565b90508260065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050808061416890614d84565b9150506140d2565b50505050565b5f808303614186575f90506141e7565b5f82846141939190615082565b90508284826141a29190615c59565b146141e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141d990615cf9565b60405180910390fd5b809150505b92915050565b5f61422e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614370565b905092915050565b5f614240306117dc565b90505f8111156142a2575f614253611e42565b90508082101580156142715750600c5f9054906101000a900460ff16155b80156142895750600c60019054906101000a900460ff165b156142a05761429781613d95565b61429f613fcb565b5b505b50565b5f60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516142eb90615d44565b5f6040518083038185875af1925050503d805f8114614325576040519150601f19603f3d011682016040523d82523d5f602084013e61432a565b606091505b50509050801561436c577f8d506e73abc3fae6fd0fd6faac7b7ff03e47622fa1e4fa03fc1e8f9801769afa82604051614363919061477c565b60405180910390a15b5050565b5f80831182906143b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016143ad919061445b565b60405180910390fd5b505f83856143c49190615c59565b9050809150509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156144085780820151818401526020810190506143ed565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61442d826143d1565b61443781856143db565b93506144478185602086016143eb565b61445081614413565b840191505092915050565b5f6020820190508181035f8301526144738184614423565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6144b58261448c565b9050919050565b6144c5816144ab565b81146144cf575f80fd5b50565b5f813590506144e0816144bc565b92915050565b5f819050919050565b6144f8816144e6565b8114614502575f80fd5b50565b5f81359050614513816144ef565b92915050565b5f806040838503121561452f5761452e614484565b5b5f61453c858286016144d2565b925050602061454d85828601614505565b9150509250929050565b5f8115159050919050565b61456b81614557565b82525050565b5f6020820190506145845f830184614562565b92915050565b614593816144e6565b82525050565b5f6040820190506145ac5f83018561458a565b6145b9602083018461458a565b9392505050565b5f602082840312156145d5576145d4614484565b5b5f6145e2848285016144d2565b91505092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261460c5761460b6145eb565b5b8235905067ffffffffffffffff811115614629576146286145ef565b5b602083019150836020820283011115614645576146446145f3565b5b9250929050565b5f8083601f840112614661576146606145eb565b5b8235905067ffffffffffffffff81111561467e5761467d6145ef565b5b60208301915083602082028301111561469a576146996145f3565b5b9250929050565b5f805f805f80606087890312156146bb576146ba614484565b5b5f87013567ffffffffffffffff8111156146d8576146d7614488565b5b6146e489828a016145f7565b9650965050602087013567ffffffffffffffff81111561470757614706614488565b5b61471389828a0161464c565b9450945050604087013567ffffffffffffffff81111561473657614735614488565b5b61474289828a0161464c565b92509250509295509295509295565b5f6020828403121561476657614765614484565b5b5f61477384828501614505565b91505092915050565b5f60208201905061478f5f83018461458a565b92915050565b5f819050919050565b5f6147b86147b36147ae8461448c565b614795565b61448c565b9050919050565b5f6147c98261479e565b9050919050565b5f6147da826147bf565b9050919050565b6147ea816147d0565b82525050565b5f6020820190506148035f8301846147e1565b92915050565b5f805f606084860312156148205761481f614484565b5b5f61482d868287016144d2565b935050602061483e868287016144d2565b925050604061484f86828701614505565b9150509250925092565b5f60ff82169050919050565b61486e81614859565b82525050565b5f6020820190506148875f830184614865565b92915050565b61489681614557565b81146148a0575f80fd5b50565b5f813590506148b18161488d565b92915050565b5f805f604084860312156148ce576148cd614484565b5b5f84013567ffffffffffffffff8111156148eb576148ea614488565b5b6148f7868287016145f7565b9350935050602061490a868287016148a3565b9150509250925092565b61491d816144ab565b82525050565b5f6020820190506149365f830184614914565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f82825260208201905092915050565b5f61497f826143d1565b6149898185614965565b93506149998185602086016143eb565b6149a281614413565b840191505092915050565b6149b6816144e6565b82525050565b5f604083015f8301518482035f8601526149d68282614975565b91505060208301516149eb60208601826149ad565b508091505092915050565b5f614a0183836149bc565b905092915050565b5f602082019050919050565b5f614a1f8261493c565b614a298185614946565b935083602082028501614a3b85614956565b805f5b85811015614a765784840389528151614a5785826149f6565b9450614a6283614a09565b925060208a01995050600181019050614a3e565b50829750879550505050505092915050565b5f6020820190508181035f830152614aa08184614a15565b905092915050565b5f614ab28261479e565b9050919050565b5f614ac382614aa8565b9050919050565b614ad381614ab9565b82525050565b5f602082019050614aec5f830184614aca565b92915050565b5f8060408385031215614b0857614b07614484565b5b5f614b1585828601614505565b9250506020614b2685828601614505565b9150509250929050565b5f8060408385031215614b4657614b45614484565b5b5f614b53858286016144d2565b9250506020614b64858286016144d2565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614bb257607f821691505b602082108103614bc557614bc4614b6e565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f614bff6020836143db565b9150614c0a82614bcb565b602082019050919050565b5f6020820190508181035f830152614c2c81614bf3565b9050919050565b7f31320000000000000000000000000000000000000000000000000000000000005f82015250565b5f614c676002836143db565b9150614c7282614c33565b602082019050919050565b5f6020820190508181035f830152614c9481614c5b565b9050919050565b7f31330000000000000000000000000000000000000000000000000000000000005f82015250565b5f614ccf6002836143db565b9150614cda82614c9b565b602082019050919050565b5f6020820190508181035f830152614cfc81614cc3565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f604082019050614d435f830185614914565b614d50602083018461458a565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614d8e826144e6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614dc057614dbf614d57565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f81519050614e06816144bc565b92915050565b5f60208284031215614e2157614e20614484565b5b5f614e2e84828501614df8565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614e69816144ab565b82525050565b5f614e7a8383614e60565b60208301905092915050565b5f602082019050919050565b5f614e9c82614e37565b614ea68185614e41565b9350614eb183614e51565b805f5b83811015614ee1578151614ec88882614e6f565b9750614ed383614e86565b925050600181019050614eb4565b5085935050505092915050565b5f604082019050614f015f83018561458a565b8181036020830152614f138184614e92565b90509392505050565b614f2582614413565b810181811067ffffffffffffffff82111715614f4457614f43614dcb565b5b80604052505050565b5f614f5661447b565b9050614f628282614f1c565b919050565b5f67ffffffffffffffff821115614f8157614f80614dcb565b5b602082029050602081019050919050565b5f81519050614fa0816144ef565b92915050565b5f614fb8614fb384614f67565b614f4d565b90508083825260208201905060208402830185811115614fdb57614fda6145f3565b5b835b818110156150045780614ff08882614f92565b845260208401935050602081019050614fdd565b5050509392505050565b5f82601f830112615022576150216145eb565b5b8151615032848260208601614fa6565b91505092915050565b5f602082840312156150505761504f614484565b5b5f82015167ffffffffffffffff81111561506d5761506c614488565b5b6150798482850161500e565b91505092915050565b5f61508c826144e6565b9150615097836144e6565b92508282026150a5816144e6565b915082820484148315176150bc576150bb614d57565b5b5092915050565b5f602082840312156150d8576150d7614484565b5b5f6150e584828501614f92565b91505092915050565b7f33000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6151226001836143db565b915061512d826150ee565b602082019050919050565b5f6020820190508181035f83015261514f81615116565b9050919050565b7f34000000000000000000000000000000000000000000000000000000000000005f82015250565b5f61518a6001836143db565b915061519582615156565b602082019050919050565b5f6020820190508181035f8301526151b78161517e565b9050919050565b7f31340000000000000000000000000000000000000000000000000000000000005f82015250565b5f6151f26002836143db565b91506151fd826151be565b602082019050919050565b5f6020820190508181035f83015261521f816151e6565b9050919050565b5f6040820190506152395f830185614914565b6152466020830184614914565b9392505050565b5f819050919050565b5f61527061526b6152668461524d565b614795565b6144e6565b9050919050565b61528081615256565b82525050565b5f60c0820190506152995f830189614914565b6152a6602083018861458a565b6152b36040830187615277565b6152c06060830186615277565b6152cd6080830185614914565b6152da60a083018461458a565b979650505050505050565b5f805f606084860312156152fc576152fb614484565b5b5f61530986828701614f92565b935050602061531a86828701614f92565b925050604061532b86828701614f92565b9150509250925092565b5f815190506153438161488d565b92915050565b5f6020828403121561535e5761535d614484565b5b5f61536b84828501615335565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6153ce6026836143db565b91506153d982615374565b604082019050919050565b5f6020820190508181035f8301526153fb816153c2565b9050919050565b7f35000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6154366001836143db565b915061544182615402565b602082019050919050565b5f6020820190508181035f8301526154638161542a565b9050919050565b7f36000000000000000000000000000000000000000000000000000000000000005f82015250565b5f61549e6001836143db565b91506154a98261546a565b602082019050919050565b5f6020820190508181035f8301526154cb81615492565b9050919050565b5f6154dc826144e6565b91506154e7836144e6565b92508282019050808211156154ff576154fe614d57565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f615539601b836143db565b915061554482615505565b602082019050919050565b5f6020820190508181035f8301526155668161552d565b9050919050565b5f6060820190506155805f83018661458a565b61558d602083018561458a565b61559a604083018461458a565b949350505050565b7f37000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6155d66001836143db565b91506155e1826155a2565b602082019050919050565b5f6020820190508181035f830152615603816155ca565b9050919050565b7f38000000000000000000000000000000000000000000000000000000000000005f82015250565b5f61563e6001836143db565b91506156498261560a565b602082019050919050565b5f6020820190508181035f83015261566b81615632565b9050919050565b7f39000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6156a66001836143db565b91506156b182615672565b602082019050919050565b5f6020820190508181035f8301526156d38161569a565b9050919050565b7f31300000000000000000000000000000000000000000000000000000000000005f82015250565b5f61570e6002836143db565b9150615719826156da565b602082019050919050565b5f6020820190508181035f83015261573b81615702565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261579e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615763565b6157a88683615763565b95508019841693508086168417925050509392505050565b5f6157da6157d56157d0846144e6565b614795565b6144e6565b9050919050565b5f819050919050565b6157f3836157c0565b6158076157ff826157e1565b84845461576f565b825550505050565b5f90565b61581b61580f565b6158268184846157ea565b505050565b5b818110156158495761583e5f82615813565b60018101905061582c565b5050565b601f82111561588e5761585f81615742565b61586884615754565b81016020851015615877578190505b61588b61588385615754565b83018261582b565b50505b505050565b5f82821c905092915050565b5f6158ae5f1984600802615893565b1980831691505092915050565b5f6158c6838361589f565b9150826002028217905092915050565b6158df826143d1565b67ffffffffffffffff8111156158f8576158f7614dcb565b5b6159028254614b9b565b61590d82828561584d565b5f60209050601f83116001811461593e575f841561592c578287015190505b61593685826158bb565b86555061599d565b601f19841661594c86615742565b5f5b828110156159735784890151825560018201915060208501945060208101905061594e565b86831015615990578489015161598c601f89168261589f565b8355505b6001600288020188555050505b505050505050565b7f42555900000000000000000000000000000000000000000000000000000000005f82015250565b5f6159d96003836143db565b91506159e4826159a5565b602082019050919050565b5f608082019050615a025f830186614914565b8181036020830152615a13816159cd565b9050615a22604083018561458a565b615a2f606083018461458a565b949350505050565b5f819050919050565b5f615a4a82615a37565b9150615a5583615a37565b925082820390508181125f8412168282135f851215161715615a7a57615a79614d57565b5b92915050565b7f53454c4c000000000000000000000000000000000000000000000000000000005f82015250565b5f615ab46004836143db565b9150615abf82615a80565b602082019050919050565b5f608082019050615add5f830186614914565b8181036020830152615aee81615aa8565b9050615afd604083018561458a565b615b0a606083018461458a565b949350505050565b7f31310000000000000000000000000000000000000000000000000000000000005f82015250565b5f615b466002836143db565b9150615b5182615b12565b602082019050919050565b5f6020820190508181035f830152615b7381615b3a565b9050919050565b5f604082019050615b8d5f830185614914565b615b9a6020830184615277565b9392505050565b5f615bab826144e6565b9150615bb6836144e6565b9250828203905081811115615bce57615bcd614d57565b5b92915050565b5f60a082019050615be75f83018861458a565b615bf46020830187615277565b8181036040830152615c068186614e92565b9050615c156060830185614914565b615c22608083018461458a565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f615c63826144e6565b9150615c6e836144e6565b925082615c7e57615c7d615c2c565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f5f8201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b5f615ce36021836143db565b9150615cee82615c89565b604082019050919050565b5f6020820190508181035f830152615d1081615cd7565b9050919050565b5f81905092915050565b50565b5f615d2f5f83615d17565b9150615d3a82615d21565b5f82019050919050565b5f615d4e82615d24565b915081905091905056fea2646970667358221220337add910fd1e1fc4fa83e07cbc4837ae4daece219aa3075365536cde2f54c4f64736f6c63430008140033

Deployed Bytecode Sourcemap

8608:14359:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12086:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12917:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10596:22;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;14583:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18869:736;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20667:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9358:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12363:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13084:270;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14104:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22210:161;;;;;;;;;;;;;:::i;:::-;;12272:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13821:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13362:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14249:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9471:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10046:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14969:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21323:304;;;;;;;;;;;;;:::i;:::-;;16049:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10093:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10625:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10668:54;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;10140:61;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12466:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7004:148;;;;;;;;;;;;;:::i;:::-;;14418:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19613:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13954:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15496:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10286:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6792:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12177:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15766:275;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13584:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12593:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15122:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21823:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11478:600;;;;;;;;;;;;;:::i;:::-;;12766:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21635:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7160:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12086:83;12123:13;12156:5;12149:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12086:83;:::o;12917:159::-;12992:4;13009:37;13018:10;13030:7;13039:6;13009:8;:37::i;:::-;13064:4;13057:11;;12917:159;;;;:::o;10596:22::-;;;;;;;;;;;;;;:::o;14583:126::-;14649:4;14673:22;:28;14696:4;14673:28;;;;;;;;;;;;;;;;;;;;;;;;;14666:35;;14583:126;;;:::o;18869:736::-;6929:10;6919:20;;:6;;;;;;;;;;:20;;;6911:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;19033:7:::1;;:14;;19015:7;;:14;;:32;:74;;;;;19069:13;;:20;;19051:7;;:14;;:38;19015:74;19007:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;19150:1;19115:37;;19123:14;;;;;;;;;;;19115:37;;::::0;19107:52:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;19170:12;19193:4;19170:28;;19213:9;19209:389;19230:7;;:14;;19226:1;:18;19209:389;;;19266:10;19279:7;;19287:1;19279:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;19266:23;;19304:14;19321:7;;19329:1;19321:10;;;;;;;:::i;:::-;;;;;;;;19304:27;;19364;19384:6;19364:9;:15;19374:4;19364:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;19346:9;:15;19356:4;19346:15;;;;;;;;;;;;;;;:45;;;;19422:25;19440:6;19422:9;:13;19432:2;19422:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;19406:9;:13;19416:2;19406:13;;;;;;;;;;;;;;;:41;;;;19462:16;;;;;;;;;;;:20;;;19483:2;19487:13;;19501:1;19487:16;;;;;;;:::i;:::-;;;;;;;;19462:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;19519:21;19531:4;19537:2;19519:11;:21::i;:::-;19575:2;19560:26;;19569:4;19560:26;;;19579:6;19560:26;;;;;;:::i;:::-;;;;;;;;19251:347;;19246:3;;;;;:::i;:::-;;;;19209:389;;;;18996:609;18869:736:::0;;;;;;:::o;20667:281::-;20737:4;20755:21;20793:1;20779:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20755:40;;20816:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20806:4;20811:1;20806:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;20867:4;20849;20854:1;20849:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;20890:15;;;;;;;;;;;:28;;;20919:11;20932:4;20890:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20938:1;20890:50;;;;;;;;:::i;:::-;;;;;;;;20883:57;;;20667:281;;;:::o;9358:106::-;;;;;;;;;;;;;:::o;12363:95::-;12416:7;12443;;12436:14;;12363:95;:::o;13084:270::-;13182:4;13199:36;13209:6;13217:9;13228:6;13199:9;:36::i;:::-;13246:78;13255:6;13263:10;13275:48;13311:6;13275:48;;;;;;;;;;;;;;;;;:11;:19;13287:6;13275:19;;;;;;;;;;;;;;;:31;13295:10;13275:31;;;;;;;;;;;;;;;;:35;;:48;;;;;:::i;:::-;13246:8;:78::i;:::-;13342:4;13335:11;;13084:270;;;;;:::o;14104:137::-;6929:10;6919:20;;:6;;;;;;;;;;:20;;;6911:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;14226:7:::1;14208:15;:25;;;;:::i;:::-;14189:16;:44;;;;14104:137:::0;:::o;22210:161::-;6929:10;6919:20;;:6;;;;;;;;;;:20;;;6911:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;22273:18:::1;22294:21;22273:42;;22334:7;:5;:7::i;:::-;22326:25;;:37;22352:10;22326:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;22262:109;22210:161::o:0;12272:83::-;12313:5;12338:9;;;;;;;;;;;12331:16;;12272:83;:::o;13821:125::-;13885:4;13909:16;;;;;;;;;;;:20;;;13930:7;13909:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13902:36;;13821:125;;;:::o;13362:214::-;13450:4;13467:79;13476:10;13488:7;13497:48;13534:10;13497:11;:23;13509:10;13497:23;;;;;;;;;;;;;;;:32;13521:7;13497:32;;;;;;;;;;;;;;;;:36;;:48;;;;:::i;:::-;13467:8;:79::i;:::-;13564:4;13557:11;;13362:214;;;;:::o;14249:161::-;6929:10;6919:20;;:6;;;;;;;;;;:20;;;6911:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;14361:41:::1;14374:9;;14385:16;14361:12;:41::i;:::-;14249:161:::0;;;:::o;9471:41::-;;;;;;;;;;;;;:::o;10046:40::-;;;;;;;;;;;;;:::o;14969:145::-;15033:23;15076:21;:30;15098:7;15076:30;;;;;;;;;;;;;;;15069:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14969:145;;;:::o;21323:304::-;21365:28;21396:24;21414:4;21396:9;:24::i;:::-;21365:55;;21458:1;21435:20;:24;21431:189;;;21481:16;;;;;;;;;;;21476:133;;21518:38;21535:20;21518:16;:38::i;:::-;21575:18;:16;:18::i;:::-;21476:133;21431:189;21354:273;21323:304::o;16049:124::-;16114:4;16138:18;:27;16157:7;16138:27;;;;;;;;;;;;;;;;;;;;;;;;;16131:34;;16049:124;;;:::o;10093:40::-;;;;:::o;10625:36::-;;;;;;;;;;;;;:::o;10668:54::-;;;;;;;;;;;;;;:::o;10140:61::-;;;;:::o;12466:119::-;12532:7;12559:9;:18;12569:7;12559:18;;;;;;;;;;;;;;;;12552:25;;12466:119;;;:::o;7004:148::-;6929:10;6919:20;;:6;;;;;;;;;;:20;;;6911:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;7111:1:::1;7074:40;;7095:6;::::0;::::1;;;;;;;;7074:40;;;;;;;;;;;;7142:1;7125:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;7004:148::o:0;14418:157::-;6929:10;6919:20;;:6;;;;;;;;;;:20;;;6911:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;14528:39:::1;14545:9;;14556:10;14528:16;:39::i;:::-;14418:157:::0;;;:::o;19613:143::-;6929:10;6919:20;;:6;;;;;;;;;;:20;;;6911:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;19709:16:::1;;;;;;;;;;;:20;;;19730:6;19738:9;19709:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;19613:143:::0;;:::o;13954:142::-;6929:10;6919:20;;:6;;;;;;;;;;:20;;;6911:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;14047:16:::1;;;;;;;;;;;:20;;;14068:7;14077:10;14047:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;13954:142:::0;;:::o;15496:225::-;6929:10;6919:20;;:6;;;;;;;;;;:20;;;6911:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;15597:2:::1;15587:6;:12;;15579:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;15635:2;15624:7;:13;;15616:27;;;;;;;;;;;;:::i;:::-;;;;;;;;;15671:6;15654:7;:14;;:23;;;;15706:7;15688;:15;;:25;;;;15496:225:::0;;:::o;10286:43::-;;;;;;;;;;;;;:::o;6792:79::-;6830:7;6857:6;;;;;;;;;;;6850:13;;6792:79;:::o;12177:87::-;12216:13;12249:7;12242:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12177:87;:::o;15766:275::-;15823:7;15844:21;15882:1;15868:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15844:40;;15905:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15895:4;15900:1;15895:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;15956:4;15938;15943:1;15938:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;15979:15;;;;;;;;;;;:29;;;16009:14;;16025:4;15979:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16031:1;15979:54;;;;;;;;:::i;:::-;;;;;;;;15972:61;;;15766:275;:::o;13584:229::-;13677:4;13694:89;13703:10;13715:7;13724:58;13761:15;13724:58;;;;;;;;;;;;;;;;;:11;:23;13736:10;13724:23;;;;;;;;;;;;;;;:32;13748:7;13724:32;;;;;;;;;;;;;;;;:36;;:58;;;;;:::i;:::-;13694:8;:89::i;:::-;13801:4;13794:11;;13584:229;;;;:::o;12593:165::-;12671:4;12688:40;12698:10;12710:9;12721:6;12688:9;:40::i;:::-;12746:4;12739:11;;12593:165;;;;:::o;15122:122::-;6929:10;6919:20;;:6;;;;;;;;;;:20;;;6911:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;15221:15:::1;15204:14;:32;;;;15122:122:::0;:::o;21823:161::-;6929:10;6919:20;;:6;;;;;;;;;;:20;;;6911:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;21952:22:::1;21912:14;;:64;;;;;;;;;;;;;;;;;;21823:161:::0;:::o;11478:600::-;6929:10;6919:20;;:6;;;;;;;;;;:20;;;6911:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;11566:1:::1;11541:27;;:13;;;;;;;;;;;:27;;;11533:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;11585:58;11602:4;11617:15;;;;;;;;;;;11635:7;;11585:8;:58::i;:::-;11688:15;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11670:55;;;11734:4;11741:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11670:94;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11654:13;;:110;;;;;;;;;;;;;;;;;;11775:15;;;;;;;;;;;:31;;;11814:21;11859:4;11879:24;11897:4;11879:9;:24::i;:::-;11918:1;11934::::0;11950:7:::1;:5;:7::i;:::-;11972:15;11775:213;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;12006:13;;;;;;;;;;;11999:29;;;12037:15;;;;;;;;;;;12055:14;11999:71;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11478:600::o:0;12766:143::-;12847:7;12874:11;:18;12886:5;12874:18;;;;;;;;;;;;;;;:27;12893:7;12874:27;;;;;;;;;;;;;;;;12867:34;;12766:143;;;;:::o;21635:180::-;6929:10;6919:20;;:6;;;;;;;;;;:20;;;6911:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;21755:11:::1;21728:12;:24;;:38;;;;21800:7;21777:12;:20;;:30;;;;21635:180:::0;;:::o;7160:244::-;6929:10;6919:20;;:6;;;;;;;;;;:20;;;6911:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;7269:1:::1;7249:22;;:8;:22;;::::0;7241:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;7359:8;7330:38;;7351:6;::::0;::::1;;;;;;;;7330:38;;;;;;;;;;;;7388:8;7379:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;7160:244:::0;:::o;16181:267::-;16291:1;16274:19;;:5;:19;;;16266:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;16337:1;16318:21;;:7;:21;;;16310:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;16386:6;16356:11;:18;16368:5;16356:18;;;;;;;;;;;;;;;:27;16375:7;16356:27;;;;;;;;;;;;;;;:36;;;;16424:7;16408:32;;16417:5;16408:32;;;16433:6;16408:32;;;;;;:::i;:::-;;;;;;;;16181:267;;;:::o;2526:136::-;2584:7;2611:43;2615:1;2618;2611:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;2604:50;;2526:136;;;;:::o;2337:181::-;2395:7;2415:9;2431:1;2427;:5;;;;:::i;:::-;2415:17;;2456:1;2451;:6;;2443:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2509:1;2502:8;;;2337:181;;;;:::o;19764:408::-;19834:14;;;;;;;;;;;:30;;;19865:4;19834:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19830:51;19895:14;;;;;;;;;;;:30;;;19926:2;19895:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19891:49;19954:14;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;19950:215;;;20135:9;20072:73;;20129:4;20072:73;;;20089:10;20101:6;20109:18;20072:73;;;;;;;;:::i;:::-;;;;;;;;19979:178;;;19950:215;19764:408;;:::o;16456:2405::-;16560:1;16544:18;;:4;:18;;;16536:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;16601:1;16587:16;;:2;:16;;;16579:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;16637:1;16628:6;:10;16620:24;;;;;;;;;;;;:::i;:::-;;;;;;;;;16655:13;16672:18;:24;16691:4;16672:24;;;;;;;;;;;;;;;;;;;;;;;;;16671:25;:52;;;;;16701:18;:22;16720:2;16701:22;;;;;;;;;;;;;;;;;;;;;;;;;16700:23;16671:52;:71;;;;;16735:7;:5;:7::i;:::-;16727:15;;:4;:15;;;;16671:71;:88;;;;;16752:7;:5;:7::i;:::-;16746:13;;:2;:13;;;;16671:88;16655:104;;16770:21;16794:25;16812:6;16794:13;16804:2;16794:9;:13::i;:::-;:17;;:25;;;;:::i;:::-;16770:49;;16830:17;16963:7;:5;:7::i;:::-;16955:15;;:4;:15;;;;:32;;;;;16980:7;:5;:7::i;:::-;16974:13;;:2;:13;;;;16955:32;:52;;;;;16997:10;;;;;;;;;;;16991:16;;:2;:16;;;;16955:52;:77;;;;;17027:4;17011:21;;:4;:21;;;;16955:77;:100;;;;;17050:4;17036:19;;:2;:19;;;;16955:100;16951:1611;;;17084:13;;;;;;;;;;;17076:21;;:4;:21;;;17072:586;;17121:8;17118:104;;;17179:16;;17162:13;:33;;17154:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;17118:104;17252:8;:51;;17302:1;17252:51;;;17263:35;17294:3;17263:26;17274:7;:14;;;17263:6;:10;;:26;;;;:::i;:::-;:30;;:35;;;;:::i;:::-;17252:51;17240:63;;17322:11;17336:29;17358:6;17336:21;:29::i;:::-;17322:43;;17384:15;17402:36;17431:6;17402:16;;;;;;;;;;;:20;;;17423:2;17402:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:28;;:36;;;;:::i;:::-;17384:54;;17457:16;;;;;;;;;;;:20;;;17478:2;17482:10;17457:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17512:21;:25;17534:2;17512:25;;;;;;;;;;;;;;;17543:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17565:6;17543:29;;;17512:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;17597:45;17611:2;17622:6;17631:10;17597:45;;;;;;;;:::i;:::-;;;;;;;;17099:559;;17072:586;17684:13;;;;;;;;;;;17676:21;;:4;:21;;;;:44;;;;;17707:13;;;;;;;;;;;17701:19;;:2;:19;;;17676:44;17672:598;;;17753:8;:51;;17803:1;17753:51;;;17764:36;17796:3;17764:27;17775:7;:15;;;17764:6;:10;;:27;;;;:::i;:::-;:31;;:36;;;;:::i;:::-;17753:51;17741:63;;17823:12;17838:29;17860:6;17838:21;:29::i;:::-;17823:44;;17886:7;17934;17900:16;;;;;;;;;;;:20;;;17921:4;17900:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17896:46;;;;:::i;:::-;17886:56;;17961:18;17989:1;17982:3;:8;;:27;;18005:3;17982:27;;;17993:1;17982:27;17961:48;;18028:16;;;;;;;;;;;:20;;;18049:4;18055:10;18028:38;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18085:21;:27;18107:4;18085:27;;;;;;;;;;;;;;;18118:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18141:7;18118:31;;;18085:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;18174:49;18188:4;18202:7;18212:10;18174:49;;;;;;;;:::i;:::-;;;;;;;;18242:12;:10;:12::i;:::-;17722:548;;;17672:598;18296:13;;;;;;;;;;;18288:21;;:4;:21;;;;:44;;;;;18319:13;;;;;;;;;;;18313:19;;:2;:19;;;;18288:44;18284:231;;;18378:16;;18361:13;:33;;18353:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;18470:16;;;;;;;;;;;:20;;;18491:4;18497:1;18470:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18284:231;18529:21;18541:4;18547:2;18529:11;:21::i;:::-;16951:1611;18572:22;18597:21;18608:9;18597:6;:10;;:21;;;;:::i;:::-;18572:46;;18647:27;18667:6;18647:9;:15;18657:4;18647:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;18629:9;:15;18639:4;18629:15;;;;;;;;;;;;;;;:45;;;;18701:33;18719:14;18701:9;:13;18711:2;18701:13;;;;;;;;;;;;;;;;:17;;:33;;;;:::i;:::-;18685:9;:13;18695:2;18685:13;;;;;;;;;;;;;;;:49;;;;18772:39;18801:9;18772;:24;18790:4;18772:24;;;;;;;;;;;;;;;;:28;;:39;;;;:::i;:::-;18745:9;:24;18763:4;18745:24;;;;;;;;;;;;;;;:66;;;;18842:2;18827:26;;18836:4;18827:26;;;18846:6;18827:26;;;;;;:::i;:::-;;;;;;;;16525:2336;;;;16456:2405;;;:::o;2670:192::-;2756:7;2789:1;2784;:6;;2792:12;2776:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;2816:9;2832:1;2828;:5;;;;:::i;:::-;2816:17;;2853:1;2846:8;;;2670:192;;;;;:::o;15252:236::-;15339:9;15334:147;15358:9;;:16;;15354:1;:20;15334:147;;;15396:12;15411:9;;15421:1;15411:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;15396:27;;15465:4;15438:18;:24;15457:4;15438:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;15381:100;15376:3;;;;;:::i;:::-;;;;15334:147;;;;15252:236;;;:::o;22379:585::-;22505:21;22543:1;22529:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22505:40;;22574:4;22556;22561:1;22556:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;22600:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22590:4;22595:1;22590:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;22633:62;22650:4;22665:15;;;;;;;;;;;22683:11;22633:8;:62::i;:::-;22732:15;;;;;;;;;;;:66;;;22813:11;22839:1;22883:4;22910;22930:15;22732:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22434:530;22379:585;:::o;20956:359::-;9048:4;9029:16;;:23;;;;;;;;;;;;;;;;;;21015:18:::1;21036:21;21015:42;;21068:19;21090:49;21135:3;21090:40;21105:12;:24;;;21090:10;:14;;:40;;;;:::i;:::-;:44;;:49;;;;:::i;:::-;21068:71;;21150:15;21168:45;21209:3;21168:36;21183:12;:20;;;21168:10;:14;;:36;;;;:::i;:::-;:40;;:45;;;;:::i;:::-;21150:63;;21232:18;;;;;;;;;;;21224:36;;:49;21261:11;21224:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;21284:23;21299:7;21284:14;:23::i;:::-;21004:311;;;9076:5:::0;9057:16;;:24;;;;;;;;;;;;;;;;;;20956:359::o;14717:244::-;14808:9;14803:151;14827:9;;:16;;14823:1;:20;14803:151;;;14865:12;14880:9;;14890:1;14880:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;14865:27;;14938:4;14907:22;:28;14930:4;14907:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;14850:104;14845:3;;;;;:::i;:::-;;;;14803:151;;;;14717:244;;;:::o;2870:250::-;2928:7;2957:1;2952;:6;2948:47;;2982:1;2975:8;;;;2948:47;3007:9;3023:1;3019;:5;;;;:::i;:::-;3007:17;;3052:1;3047;3043;:5;;;;:::i;:::-;:10;3035:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3111:1;3104:8;;;2870:250;;;;;:::o;3128:132::-;3186:7;3213:39;3217:1;3220;3213:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3206:46;;3128:132;;;;:::o;20180:479::-;20221:28;20252:24;20270:4;20252:9;:24::i;:::-;20221:55;;20314:1;20291:20;:24;20287:365;;;20332:19;20354:26;:24;:26::i;:::-;20332:48;;20423:11;20399:20;:35;;:56;;;;;20439:16;;;;;;;;;;;20438:17;20399:56;:81;;;;;20459:21;;;;;;;;;;;20399:81;20395:246;;;20559:29;20576:11;20559:16;:29::i;:::-;20607:18;:16;:18::i;:::-;20395:246;20317:335;20287:365;20210:449;20180:479::o;21992:210::-;22053:12;22078:14;;;;;;;;;;;22070:28;;22107:7;22070:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22052:67;;;22134:7;22130:65;;;22163:20;22175:7;22163:20;;;;;;:::i;:::-;;;;;;;;22130:65;22041:161;21992:210;:::o;3268:278::-;3354:7;3386:1;3382;:5;3389:12;3374:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;3413:9;3429:1;3425;:5;;;;:::i;:::-;3413:17;;3537:1;3530:8;;;3268:278;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:332::-;3691:4;3729:2;3718:9;3714:18;3706:26;;3742:71;3810:1;3799:9;3795:17;3786:6;3742:71;:::i;:::-;3823:72;3891:2;3880:9;3876:18;3867:6;3823:72;:::i;:::-;3570:332;;;;;:::o;3908:329::-;3967:6;4016:2;4004:9;3995:7;3991:23;3987:32;3984:119;;;4022:79;;:::i;:::-;3984:119;4142:1;4167:53;4212:7;4203:6;4192:9;4188:22;4167:53;:::i;:::-;4157:63;;4113:117;3908:329;;;;:::o;4243:117::-;4352:1;4349;4342:12;4366:117;4475:1;4472;4465:12;4489:117;4598:1;4595;4588:12;4629:568;4702:8;4712:6;4762:3;4755:4;4747:6;4743:17;4739:27;4729:122;;4770:79;;:::i;:::-;4729:122;4883:6;4870:20;4860:30;;4913:18;4905:6;4902:30;4899:117;;;4935:79;;:::i;:::-;4899:117;5049:4;5041:6;5037:17;5025:29;;5103:3;5095:4;5087:6;5083:17;5073:8;5069:32;5066:41;5063:128;;;5110:79;;:::i;:::-;5063:128;4629:568;;;;;:::o;5220:::-;5293:8;5303:6;5353:3;5346:4;5338:6;5334:17;5330:27;5320:122;;5361:79;;:::i;:::-;5320:122;5474:6;5461:20;5451:30;;5504:18;5496:6;5493:30;5490:117;;;5526:79;;:::i;:::-;5490:117;5640:4;5632:6;5628:17;5616:29;;5694:3;5686:4;5678:6;5674:17;5664:8;5660:32;5657:41;5654:128;;;5701:79;;:::i;:::-;5654:128;5220:568;;;;;:::o;5794:1309::-;5952:6;5960;5968;5976;5984;5992;6041:2;6029:9;6020:7;6016:23;6012:32;6009:119;;;6047:79;;:::i;:::-;6009:119;6195:1;6184:9;6180:17;6167:31;6225:18;6217:6;6214:30;6211:117;;;6247:79;;:::i;:::-;6211:117;6360:80;6432:7;6423:6;6412:9;6408:22;6360:80;:::i;:::-;6342:98;;;;6138:312;6517:2;6506:9;6502:18;6489:32;6548:18;6540:6;6537:30;6534:117;;;6570:79;;:::i;:::-;6534:117;6683:80;6755:7;6746:6;6735:9;6731:22;6683:80;:::i;:::-;6665:98;;;;6460:313;6840:2;6829:9;6825:18;6812:32;6871:18;6863:6;6860:30;6857:117;;;6893:79;;:::i;:::-;6857:117;7006:80;7078:7;7069:6;7058:9;7054:22;7006:80;:::i;:::-;6988:98;;;;6783:313;5794:1309;;;;;;;;:::o;7109:329::-;7168:6;7217:2;7205:9;7196:7;7192:23;7188:32;7185:119;;;7223:79;;:::i;:::-;7185:119;7343:1;7368:53;7413:7;7404:6;7393:9;7389:22;7368:53;:::i;:::-;7358:63;;7314:117;7109:329;;;;:::o;7444:222::-;7537:4;7575:2;7564:9;7560:18;7552:26;;7588:71;7656:1;7645:9;7641:17;7632:6;7588:71;:::i;:::-;7444:222;;;;:::o;7672:60::-;7700:3;7721:5;7714:12;;7672:60;;;:::o;7738:142::-;7788:9;7821:53;7839:34;7848:24;7866:5;7848:24;:::i;:::-;7839:34;:::i;:::-;7821:53;:::i;:::-;7808:66;;7738:142;;;:::o;7886:126::-;7936:9;7969:37;8000:5;7969:37;:::i;:::-;7956:50;;7886:126;;;:::o;8018:152::-;8094:9;8127:37;8158:5;8127:37;:::i;:::-;8114:50;;8018:152;;;:::o;8176:183::-;8289:63;8346:5;8289:63;:::i;:::-;8284:3;8277:76;8176:183;;:::o;8365:274::-;8484:4;8522:2;8511:9;8507:18;8499:26;;8535:97;8629:1;8618:9;8614:17;8605:6;8535:97;:::i;:::-;8365:274;;;;:::o;8645:619::-;8722:6;8730;8738;8787:2;8775:9;8766:7;8762:23;8758:32;8755:119;;;8793:79;;:::i;:::-;8755:119;8913:1;8938:53;8983:7;8974:6;8963:9;8959:22;8938:53;:::i;:::-;8928:63;;8884:117;9040:2;9066:53;9111:7;9102:6;9091:9;9087:22;9066:53;:::i;:::-;9056:63;;9011:118;9168:2;9194:53;9239:7;9230:6;9219:9;9215:22;9194:53;:::i;:::-;9184:63;;9139:118;8645:619;;;;;:::o;9270:86::-;9305:7;9345:4;9338:5;9334:16;9323:27;;9270:86;;;:::o;9362:112::-;9445:22;9461:5;9445:22;:::i;:::-;9440:3;9433:35;9362:112;;:::o;9480:214::-;9569:4;9607:2;9596:9;9592:18;9584:26;;9620:67;9684:1;9673:9;9669:17;9660:6;9620:67;:::i;:::-;9480:214;;;;:::o;9700:116::-;9770:21;9785:5;9770:21;:::i;:::-;9763:5;9760:32;9750:60;;9806:1;9803;9796:12;9750:60;9700:116;:::o;9822:133::-;9865:5;9903:6;9890:20;9881:29;;9919:30;9943:5;9919:30;:::i;:::-;9822:133;;;;:::o;9961:698::-;10053:6;10061;10069;10118:2;10106:9;10097:7;10093:23;10089:32;10086:119;;;10124:79;;:::i;:::-;10086:119;10272:1;10261:9;10257:17;10244:31;10302:18;10294:6;10291:30;10288:117;;;10324:79;;:::i;:::-;10288:117;10437:80;10509:7;10500:6;10489:9;10485:22;10437:80;:::i;:::-;10419:98;;;;10215:312;10566:2;10592:50;10634:7;10625:6;10614:9;10610:22;10592:50;:::i;:::-;10582:60;;10537:115;9961:698;;;;;:::o;10665:118::-;10752:24;10770:5;10752:24;:::i;:::-;10747:3;10740:37;10665:118;;:::o;10789:222::-;10882:4;10920:2;10909:9;10905:18;10897:26;;10933:71;11001:1;10990:9;10986:17;10977:6;10933:71;:::i;:::-;10789:222;;;;:::o;11017:145::-;11115:6;11149:5;11143:12;11133:22;;11017:145;;;:::o;11168:215::-;11298:11;11332:6;11327:3;11320:19;11372:4;11367:3;11363:14;11348:29;;11168:215;;;;:::o;11389:163::-;11487:4;11510:3;11502:11;;11540:4;11535:3;11531:14;11523:22;;11389:163;;;:::o;11558:159::-;11632:11;11666:6;11661:3;11654:19;11706:4;11701:3;11697:14;11682:29;;11558:159;;;;:::o;11723:357::-;11801:3;11829:39;11862:5;11829:39;:::i;:::-;11884:61;11938:6;11933:3;11884:61;:::i;:::-;11877:68;;11954:65;12012:6;12007:3;12000:4;11993:5;11989:16;11954:65;:::i;:::-;12044:29;12066:6;12044:29;:::i;:::-;12039:3;12035:39;12028:46;;11805:275;11723:357;;;;:::o;12086:108::-;12163:24;12181:5;12163:24;:::i;:::-;12158:3;12151:37;12086:108;;:::o;12270:616::-;12391:3;12427:4;12422:3;12418:14;12520:4;12513:5;12509:16;12503:23;12573:3;12567:4;12563:14;12556:4;12551:3;12547:14;12540:38;12599:73;12667:4;12653:12;12599:73;:::i;:::-;12591:81;;12442:241;12767:4;12760:5;12756:16;12750:23;12786:63;12843:4;12838:3;12834:14;12820:12;12786:63;:::i;:::-;12693:166;12876:4;12869:11;;12396:490;12270:616;;;;:::o;12892:280::-;13023:10;13058:108;13162:3;13154:6;13058:108;:::i;:::-;13044:122;;12892:280;;;;:::o;13178:144::-;13279:4;13311;13306:3;13302:14;13294:22;;13178:144;;;:::o;13402:1159::-;13583:3;13612:85;13691:5;13612:85;:::i;:::-;13713:117;13823:6;13818:3;13713:117;:::i;:::-;13706:124;;13856:3;13901:4;13893:6;13889:17;13884:3;13880:27;13931:87;14012:5;13931:87;:::i;:::-;14041:7;14072:1;14057:459;14082:6;14079:1;14076:13;14057:459;;;14153:9;14147:4;14143:20;14138:3;14131:33;14204:6;14198:13;14232:126;14353:4;14338:13;14232:126;:::i;:::-;14224:134;;14381:91;14465:6;14381:91;:::i;:::-;14371:101;;14501:4;14496:3;14492:14;14485:21;;14117:399;14104:1;14101;14097:9;14092:14;;14057:459;;;14061:14;14532:4;14525:11;;14552:3;14545:10;;13588:973;;;;;13402:1159;;;;:::o;14567:497::-;14772:4;14810:2;14799:9;14795:18;14787:26;;14859:9;14853:4;14849:20;14845:1;14834:9;14830:17;14823:47;14887:170;15052:4;15043:6;14887:170;:::i;:::-;14879:178;;14567:497;;;;:::o;15070:134::-;15128:9;15161:37;15192:5;15161:37;:::i;:::-;15148:50;;15070:134;;;:::o;15210:165::-;15291:9;15324:45;15363:5;15324:45;:::i;:::-;15311:58;;15210:165;;;:::o;15381:193::-;15499:68;15561:5;15499:68;:::i;:::-;15494:3;15487:81;15381:193;;:::o;15580:284::-;15704:4;15742:2;15731:9;15727:18;15719:26;;15755:102;15854:1;15843:9;15839:17;15830:6;15755:102;:::i;:::-;15580:284;;;;:::o;15870:474::-;15938:6;15946;15995:2;15983:9;15974:7;15970:23;15966:32;15963:119;;;16001:79;;:::i;:::-;15963:119;16121:1;16146:53;16191:7;16182:6;16171:9;16167:22;16146:53;:::i;:::-;16136:63;;16092:117;16248:2;16274:53;16319:7;16310:6;16299:9;16295:22;16274:53;:::i;:::-;16264:63;;16219:118;15870:474;;;;;:::o;16350:::-;16418:6;16426;16475:2;16463:9;16454:7;16450:23;16446:32;16443:119;;;16481:79;;:::i;:::-;16443:119;16601:1;16626:53;16671:7;16662:6;16651:9;16647:22;16626:53;:::i;:::-;16616:63;;16572:117;16728:2;16754:53;16799:7;16790:6;16779:9;16775:22;16754:53;:::i;:::-;16744:63;;16699:118;16350:474;;;;;:::o;16830:180::-;16878:77;16875:1;16868:88;16975:4;16972:1;16965:15;16999:4;16996:1;16989:15;17016:320;17060:6;17097:1;17091:4;17087:12;17077:22;;17144:1;17138:4;17134:12;17165:18;17155:81;;17221:4;17213:6;17209:17;17199:27;;17155:81;17283:2;17275:6;17272:14;17252:18;17249:38;17246:84;;17302:18;;:::i;:::-;17246:84;17067:269;17016:320;;;:::o;17342:182::-;17482:34;17478:1;17470:6;17466:14;17459:58;17342:182;:::o;17530:366::-;17672:3;17693:67;17757:2;17752:3;17693:67;:::i;:::-;17686:74;;17769:93;17858:3;17769:93;:::i;:::-;17887:2;17882:3;17878:12;17871:19;;17530:366;;;:::o;17902:419::-;18068:4;18106:2;18095:9;18091:18;18083:26;;18155:9;18149:4;18145:20;18141:1;18130:9;18126:17;18119:47;18183:131;18309:4;18183:131;:::i;:::-;18175:139;;17902:419;;;:::o;18327:152::-;18467:4;18463:1;18455:6;18451:14;18444:28;18327:152;:::o;18485:365::-;18627:3;18648:66;18712:1;18707:3;18648:66;:::i;:::-;18641:73;;18723:93;18812:3;18723:93;:::i;:::-;18841:2;18836:3;18832:12;18825:19;;18485:365;;;:::o;18856:419::-;19022:4;19060:2;19049:9;19045:18;19037:26;;19109:9;19103:4;19099:20;19095:1;19084:9;19080:17;19073:47;19137:131;19263:4;19137:131;:::i;:::-;19129:139;;18856:419;;;:::o;19281:152::-;19421:4;19417:1;19409:6;19405:14;19398:28;19281:152;:::o;19439:365::-;19581:3;19602:66;19666:1;19661:3;19602:66;:::i;:::-;19595:73;;19677:93;19766:3;19677:93;:::i;:::-;19795:2;19790:3;19786:12;19779:19;;19439:365;;;:::o;19810:419::-;19976:4;20014:2;20003:9;19999:18;19991:26;;20063:9;20057:4;20053:20;20049:1;20038:9;20034:17;20027:47;20091:131;20217:4;20091:131;:::i;:::-;20083:139;;19810:419;;;:::o;20235:180::-;20283:77;20280:1;20273:88;20380:4;20377:1;20370:15;20404:4;20401:1;20394:15;20421:332;20542:4;20580:2;20569:9;20565:18;20557:26;;20593:71;20661:1;20650:9;20646:17;20637:6;20593:71;:::i;:::-;20674:72;20742:2;20731:9;20727:18;20718:6;20674:72;:::i;:::-;20421:332;;;;;:::o;20759:180::-;20807:77;20804:1;20797:88;20904:4;20901:1;20894:15;20928:4;20925:1;20918:15;20945:233;20984:3;21007:24;21025:5;21007:24;:::i;:::-;20998:33;;21053:66;21046:5;21043:77;21040:103;;21123:18;;:::i;:::-;21040:103;21170:1;21163:5;21159:13;21152:20;;20945:233;;;:::o;21184:180::-;21232:77;21229:1;21222:88;21329:4;21326:1;21319:15;21353:4;21350:1;21343:15;21370:143;21427:5;21458:6;21452:13;21443:22;;21474:33;21501:5;21474:33;:::i;:::-;21370:143;;;;:::o;21519:351::-;21589:6;21638:2;21626:9;21617:7;21613:23;21609:32;21606:119;;;21644:79;;:::i;:::-;21606:119;21764:1;21789:64;21845:7;21836:6;21825:9;21821:22;21789:64;:::i;:::-;21779:74;;21735:128;21519:351;;;;:::o;21876:114::-;21943:6;21977:5;21971:12;21961:22;;21876:114;;;:::o;21996:184::-;22095:11;22129:6;22124:3;22117:19;22169:4;22164:3;22160:14;22145:29;;21996:184;;;;:::o;22186:132::-;22253:4;22276:3;22268:11;;22306:4;22301:3;22297:14;22289:22;;22186:132;;;:::o;22324:108::-;22401:24;22419:5;22401:24;:::i;:::-;22396:3;22389:37;22324:108;;:::o;22438:179::-;22507:10;22528:46;22570:3;22562:6;22528:46;:::i;:::-;22606:4;22601:3;22597:14;22583:28;;22438:179;;;;:::o;22623:113::-;22693:4;22725;22720:3;22716:14;22708:22;;22623:113;;;:::o;22772:732::-;22891:3;22920:54;22968:5;22920:54;:::i;:::-;22990:86;23069:6;23064:3;22990:86;:::i;:::-;22983:93;;23100:56;23150:5;23100:56;:::i;:::-;23179:7;23210:1;23195:284;23220:6;23217:1;23214:13;23195:284;;;23296:6;23290:13;23323:63;23382:3;23367:13;23323:63;:::i;:::-;23316:70;;23409:60;23462:6;23409:60;:::i;:::-;23399:70;;23255:224;23242:1;23239;23235:9;23230:14;;23195:284;;;23199:14;23495:3;23488:10;;22896:608;;;22772:732;;;;:::o;23510:483::-;23681:4;23719:2;23708:9;23704:18;23696:26;;23732:71;23800:1;23789:9;23785:17;23776:6;23732:71;:::i;:::-;23850:9;23844:4;23840:20;23835:2;23824:9;23820:18;23813:48;23878:108;23981:4;23972:6;23878:108;:::i;:::-;23870:116;;23510:483;;;;;:::o;23999:281::-;24082:27;24104:4;24082:27;:::i;:::-;24074:6;24070:40;24212:6;24200:10;24197:22;24176:18;24164:10;24161:34;24158:62;24155:88;;;24223:18;;:::i;:::-;24155:88;24263:10;24259:2;24252:22;24042:238;23999:281;;:::o;24286:129::-;24320:6;24347:20;;:::i;:::-;24337:30;;24376:33;24404:4;24396:6;24376:33;:::i;:::-;24286:129;;;:::o;24421:311::-;24498:4;24588:18;24580:6;24577:30;24574:56;;;24610:18;;:::i;:::-;24574:56;24660:4;24652:6;24648:17;24640:25;;24720:4;24714;24710:15;24702:23;;24421:311;;;:::o;24738:143::-;24795:5;24826:6;24820:13;24811:22;;24842:33;24869:5;24842:33;:::i;:::-;24738:143;;;;:::o;24904:732::-;25011:5;25036:81;25052:64;25109:6;25052:64;:::i;:::-;25036:81;:::i;:::-;25027:90;;25137:5;25166:6;25159:5;25152:21;25200:4;25193:5;25189:16;25182:23;;25253:4;25245:6;25241:17;25233:6;25229:30;25282:3;25274:6;25271:15;25268:122;;;25301:79;;:::i;:::-;25268:122;25416:6;25399:231;25433:6;25428:3;25425:15;25399:231;;;25508:3;25537:48;25581:3;25569:10;25537:48;:::i;:::-;25532:3;25525:61;25615:4;25610:3;25606:14;25599:21;;25475:155;25459:4;25454:3;25450:14;25443:21;;25399:231;;;25403:21;25017:619;;24904:732;;;;;:::o;25659:385::-;25741:5;25790:3;25783:4;25775:6;25771:17;25767:27;25757:122;;25798:79;;:::i;:::-;25757:122;25908:6;25902:13;25933:105;26034:3;26026:6;26019:4;26011:6;26007:17;25933:105;:::i;:::-;25924:114;;25747:297;25659:385;;;;:::o;26050:554::-;26145:6;26194:2;26182:9;26173:7;26169:23;26165:32;26162:119;;;26200:79;;:::i;:::-;26162:119;26341:1;26330:9;26326:17;26320:24;26371:18;26363:6;26360:30;26357:117;;;26393:79;;:::i;:::-;26357:117;26498:89;26579:7;26570:6;26559:9;26555:22;26498:89;:::i;:::-;26488:99;;26291:306;26050:554;;;;:::o;26610:410::-;26650:7;26673:20;26691:1;26673:20;:::i;:::-;26668:25;;26707:20;26725:1;26707:20;:::i;:::-;26702:25;;26762:1;26759;26755:9;26784:30;26802:11;26784:30;:::i;:::-;26773:41;;26963:1;26954:7;26950:15;26947:1;26944:22;26924:1;26917:9;26897:83;26874:139;;26993:18;;:::i;:::-;26874:139;26658:362;26610:410;;;;:::o;27026:351::-;27096:6;27145:2;27133:9;27124:7;27120:23;27116:32;27113:119;;;27151:79;;:::i;:::-;27113:119;27271:1;27296:64;27352:7;27343:6;27332:9;27328:22;27296:64;:::i;:::-;27286:74;;27242:128;27026:351;;;;:::o;27383:151::-;27523:3;27519:1;27511:6;27507:14;27500:27;27383:151;:::o;27540:365::-;27682:3;27703:66;27767:1;27762:3;27703:66;:::i;:::-;27696:73;;27778:93;27867:3;27778:93;:::i;:::-;27896:2;27891:3;27887:12;27880:19;;27540:365;;;:::o;27911:419::-;28077:4;28115:2;28104:9;28100:18;28092:26;;28164:9;28158:4;28154:20;28150:1;28139:9;28135:17;28128:47;28192:131;28318:4;28192:131;:::i;:::-;28184:139;;27911:419;;;:::o;28336:151::-;28476:3;28472:1;28464:6;28460:14;28453:27;28336:151;:::o;28493:365::-;28635:3;28656:66;28720:1;28715:3;28656:66;:::i;:::-;28649:73;;28731:93;28820:3;28731:93;:::i;:::-;28849:2;28844:3;28840:12;28833:19;;28493:365;;;:::o;28864:419::-;29030:4;29068:2;29057:9;29053:18;29045:26;;29117:9;29111:4;29107:20;29103:1;29092:9;29088:17;29081:47;29145:131;29271:4;29145:131;:::i;:::-;29137:139;;28864:419;;;:::o;29289:152::-;29429:4;29425:1;29417:6;29413:14;29406:28;29289:152;:::o;29447:365::-;29589:3;29610:66;29674:1;29669:3;29610:66;:::i;:::-;29603:73;;29685:93;29774:3;29685:93;:::i;:::-;29803:2;29798:3;29794:12;29787:19;;29447:365;;;:::o;29818:419::-;29984:4;30022:2;30011:9;30007:18;29999:26;;30071:9;30065:4;30061:20;30057:1;30046:9;30042:17;30035:47;30099:131;30225:4;30099:131;:::i;:::-;30091:139;;29818:419;;;:::o;30243:332::-;30364:4;30402:2;30391:9;30387:18;30379:26;;30415:71;30483:1;30472:9;30468:17;30459:6;30415:71;:::i;:::-;30496:72;30564:2;30553:9;30549:18;30540:6;30496:72;:::i;:::-;30243:332;;;;;:::o;30581:85::-;30626:7;30655:5;30644:16;;30581:85;;;:::o;30672:158::-;30730:9;30763:61;30781:42;30790:32;30816:5;30790:32;:::i;:::-;30781:42;:::i;:::-;30763:61;:::i;:::-;30750:74;;30672:158;;;:::o;30836:147::-;30931:45;30970:5;30931:45;:::i;:::-;30926:3;30919:58;30836:147;;:::o;30989:807::-;31238:4;31276:3;31265:9;31261:19;31253:27;;31290:71;31358:1;31347:9;31343:17;31334:6;31290:71;:::i;:::-;31371:72;31439:2;31428:9;31424:18;31415:6;31371:72;:::i;:::-;31453:80;31529:2;31518:9;31514:18;31505:6;31453:80;:::i;:::-;31543;31619:2;31608:9;31604:18;31595:6;31543:80;:::i;:::-;31633:73;31701:3;31690:9;31686:19;31677:6;31633:73;:::i;:::-;31716;31784:3;31773:9;31769:19;31760:6;31716:73;:::i;:::-;30989:807;;;;;;;;;:::o;31802:663::-;31890:6;31898;31906;31955:2;31943:9;31934:7;31930:23;31926:32;31923:119;;;31961:79;;:::i;:::-;31923:119;32081:1;32106:64;32162:7;32153:6;32142:9;32138:22;32106:64;:::i;:::-;32096:74;;32052:128;32219:2;32245:64;32301:7;32292:6;32281:9;32277:22;32245:64;:::i;:::-;32235:74;;32190:129;32358:2;32384:64;32440:7;32431:6;32420:9;32416:22;32384:64;:::i;:::-;32374:74;;32329:129;31802:663;;;;;:::o;32471:137::-;32525:5;32556:6;32550:13;32541:22;;32572:30;32596:5;32572:30;:::i;:::-;32471:137;;;;:::o;32614:345::-;32681:6;32730:2;32718:9;32709:7;32705:23;32701:32;32698:119;;;32736:79;;:::i;:::-;32698:119;32856:1;32881:61;32934:7;32925:6;32914:9;32910:22;32881:61;:::i;:::-;32871:71;;32827:125;32614:345;;;;:::o;32965:225::-;33105:34;33101:1;33093:6;33089:14;33082:58;33174:8;33169:2;33161:6;33157:15;33150:33;32965:225;:::o;33196:366::-;33338:3;33359:67;33423:2;33418:3;33359:67;:::i;:::-;33352:74;;33435:93;33524:3;33435:93;:::i;:::-;33553:2;33548:3;33544:12;33537:19;;33196:366;;;:::o;33568:419::-;33734:4;33772:2;33761:9;33757:18;33749:26;;33821:9;33815:4;33811:20;33807:1;33796:9;33792:17;33785:47;33849:131;33975:4;33849:131;:::i;:::-;33841:139;;33568:419;;;:::o;33993:151::-;34133:3;34129:1;34121:6;34117:14;34110:27;33993:151;:::o;34150:365::-;34292:3;34313:66;34377:1;34372:3;34313:66;:::i;:::-;34306:73;;34388:93;34477:3;34388:93;:::i;:::-;34506:2;34501:3;34497:12;34490:19;;34150:365;;;:::o;34521:419::-;34687:4;34725:2;34714:9;34710:18;34702:26;;34774:9;34768:4;34764:20;34760:1;34749:9;34745:17;34738:47;34802:131;34928:4;34802:131;:::i;:::-;34794:139;;34521:419;;;:::o;34946:151::-;35086:3;35082:1;35074:6;35070:14;35063:27;34946:151;:::o;35103:365::-;35245:3;35266:66;35330:1;35325:3;35266:66;:::i;:::-;35259:73;;35341:93;35430:3;35341:93;:::i;:::-;35459:2;35454:3;35450:12;35443:19;;35103:365;;;:::o;35474:419::-;35640:4;35678:2;35667:9;35663:18;35655:26;;35727:9;35721:4;35717:20;35713:1;35702:9;35698:17;35691:47;35755:131;35881:4;35755:131;:::i;:::-;35747:139;;35474:419;;;:::o;35899:191::-;35939:3;35958:20;35976:1;35958:20;:::i;:::-;35953:25;;35992:20;36010:1;35992:20;:::i;:::-;35987:25;;36035:1;36032;36028:9;36021:16;;36056:3;36053:1;36050:10;36047:36;;;36063:18;;:::i;:::-;36047:36;35899:191;;;;:::o;36096:177::-;36236:29;36232:1;36224:6;36220:14;36213:53;36096:177;:::o;36279:366::-;36421:3;36442:67;36506:2;36501:3;36442:67;:::i;:::-;36435:74;;36518:93;36607:3;36518:93;:::i;:::-;36636:2;36631:3;36627:12;36620:19;;36279:366;;;:::o;36651:419::-;36817:4;36855:2;36844:9;36840:18;36832:26;;36904:9;36898:4;36894:20;36890:1;36879:9;36875:17;36868:47;36932:131;37058:4;36932:131;:::i;:::-;36924:139;;36651:419;;;:::o;37076:442::-;37225:4;37263:2;37252:9;37248:18;37240:26;;37276:71;37344:1;37333:9;37329:17;37320:6;37276:71;:::i;:::-;37357:72;37425:2;37414:9;37410:18;37401:6;37357:72;:::i;:::-;37439;37507:2;37496:9;37492:18;37483:6;37439:72;:::i;:::-;37076:442;;;;;;:::o;37524:151::-;37664:3;37660:1;37652:6;37648:14;37641:27;37524:151;:::o;37681:365::-;37823:3;37844:66;37908:1;37903:3;37844:66;:::i;:::-;37837:73;;37919:93;38008:3;37919:93;:::i;:::-;38037:2;38032:3;38028:12;38021:19;;37681:365;;;:::o;38052:419::-;38218:4;38256:2;38245:9;38241:18;38233:26;;38305:9;38299:4;38295:20;38291:1;38280:9;38276:17;38269:47;38333:131;38459:4;38333:131;:::i;:::-;38325:139;;38052:419;;;:::o;38477:151::-;38617:3;38613:1;38605:6;38601:14;38594:27;38477:151;:::o;38634:365::-;38776:3;38797:66;38861:1;38856:3;38797:66;:::i;:::-;38790:73;;38872:93;38961:3;38872:93;:::i;:::-;38990:2;38985:3;38981:12;38974:19;;38634:365;;;:::o;39005:419::-;39171:4;39209:2;39198:9;39194:18;39186:26;;39258:9;39252:4;39248:20;39244:1;39233:9;39229:17;39222:47;39286:131;39412:4;39286:131;:::i;:::-;39278:139;;39005:419;;;:::o;39430:151::-;39570:3;39566:1;39558:6;39554:14;39547:27;39430:151;:::o;39587:365::-;39729:3;39750:66;39814:1;39809:3;39750:66;:::i;:::-;39743:73;;39825:93;39914:3;39825:93;:::i;:::-;39943:2;39938:3;39934:12;39927:19;;39587:365;;;:::o;39958:419::-;40124:4;40162:2;40151:9;40147:18;40139:26;;40211:9;40205:4;40201:20;40197:1;40186:9;40182:17;40175:47;40239:131;40365:4;40239:131;:::i;:::-;40231:139;;39958:419;;;:::o;40383:152::-;40523:4;40519:1;40511:6;40507:14;40500:28;40383:152;:::o;40541:365::-;40683:3;40704:66;40768:1;40763:3;40704:66;:::i;:::-;40697:73;;40779:93;40868:3;40779:93;:::i;:::-;40897:2;40892:3;40888:12;40881:19;;40541:365;;;:::o;40912:419::-;41078:4;41116:2;41105:9;41101:18;41093:26;;41165:9;41159:4;41155:20;41151:1;41140:9;41136:17;41129:47;41193:131;41319:4;41193:131;:::i;:::-;41185:139;;40912:419;;;:::o;41337:141::-;41386:4;41409:3;41401:11;;41432:3;41429:1;41422:14;41466:4;41463:1;41453:18;41445:26;;41337:141;;;:::o;41484:93::-;41521:6;41568:2;41563;41556:5;41552:14;41548:23;41538:33;;41484:93;;;:::o;41583:107::-;41627:8;41677:5;41671:4;41667:16;41646:37;;41583:107;;;;:::o;41696:393::-;41765:6;41815:1;41803:10;41799:18;41838:97;41868:66;41857:9;41838:97;:::i;:::-;41956:39;41986:8;41975:9;41956:39;:::i;:::-;41944:51;;42028:4;42024:9;42017:5;42013:21;42004:30;;42077:4;42067:8;42063:19;42056:5;42053:30;42043:40;;41772:317;;41696:393;;;;;:::o;42095:142::-;42145:9;42178:53;42196:34;42205:24;42223:5;42205:24;:::i;:::-;42196:34;:::i;:::-;42178:53;:::i;:::-;42165:66;;42095:142;;;:::o;42243:75::-;42286:3;42307:5;42300:12;;42243:75;;;:::o;42324:269::-;42434:39;42465:7;42434:39;:::i;:::-;42495:91;42544:41;42568:16;42544:41;:::i;:::-;42536:6;42529:4;42523:11;42495:91;:::i;:::-;42489:4;42482:105;42400:193;42324:269;;;:::o;42599:73::-;42644:3;42599:73;:::o;42678:189::-;42755:32;;:::i;:::-;42796:65;42854:6;42846;42840:4;42796:65;:::i;:::-;42731:136;42678:189;;:::o;42873:186::-;42933:120;42950:3;42943:5;42940:14;42933:120;;;43004:39;43041:1;43034:5;43004:39;:::i;:::-;42977:1;42970:5;42966:13;42957:22;;42933:120;;;42873:186;;:::o;43065:543::-;43166:2;43161:3;43158:11;43155:446;;;43200:38;43232:5;43200:38;:::i;:::-;43284:29;43302:10;43284:29;:::i;:::-;43274:8;43270:44;43467:2;43455:10;43452:18;43449:49;;;43488:8;43473:23;;43449:49;43511:80;43567:22;43585:3;43567:22;:::i;:::-;43557:8;43553:37;43540:11;43511:80;:::i;:::-;43170:431;;43155:446;43065:543;;;:::o;43614:117::-;43668:8;43718:5;43712:4;43708:16;43687:37;;43614:117;;;;:::o;43737:169::-;43781:6;43814:51;43862:1;43858:6;43850:5;43847:1;43843:13;43814:51;:::i;:::-;43810:56;43895:4;43889;43885:15;43875:25;;43788:118;43737:169;;;;:::o;43911:295::-;43987:4;44133:29;44158:3;44152:4;44133:29;:::i;:::-;44125:37;;44195:3;44192:1;44188:11;44182:4;44179:21;44171:29;;43911:295;;;;:::o;44211:1395::-;44328:37;44361:3;44328:37;:::i;:::-;44430:18;44422:6;44419:30;44416:56;;;44452:18;;:::i;:::-;44416:56;44496:38;44528:4;44522:11;44496:38;:::i;:::-;44581:67;44641:6;44633;44627:4;44581:67;:::i;:::-;44675:1;44699:4;44686:17;;44731:2;44723:6;44720:14;44748:1;44743:618;;;;45405:1;45422:6;45419:77;;;45471:9;45466:3;45462:19;45456:26;45447:35;;45419:77;45522:67;45582:6;45575:5;45522:67;:::i;:::-;45516:4;45509:81;45378:222;44713:887;;44743:618;44795:4;44791:9;44783:6;44779:22;44829:37;44861:4;44829:37;:::i;:::-;44888:1;44902:208;44916:7;44913:1;44910:14;44902:208;;;44995:9;44990:3;44986:19;44980:26;44972:6;44965:42;45046:1;45038:6;45034:14;45024:24;;45093:2;45082:9;45078:18;45065:31;;44939:4;44936:1;44932:12;44927:17;;44902:208;;;45138:6;45129:7;45126:19;45123:179;;;45196:9;45191:3;45187:19;45181:26;45239:48;45281:4;45273:6;45269:17;45258:9;45239:48;:::i;:::-;45231:6;45224:64;45146:156;45123:179;45348:1;45344;45336:6;45332:14;45328:22;45322:4;45315:36;44750:611;;;44713:887;;44303:1303;;;44211:1395;;:::o;45612:153::-;45752:5;45748:1;45740:6;45736:14;45729:29;45612:153;:::o;45771:365::-;45913:3;45934:66;45998:1;45993:3;45934:66;:::i;:::-;45927:73;;46009:93;46098:3;46009:93;:::i;:::-;46127:2;46122:3;46118:12;46111:19;;45771:365;;;:::o;46142:750::-;46392:4;46430:3;46419:9;46415:19;46407:27;;46444:71;46512:1;46501:9;46497:17;46488:6;46444:71;:::i;:::-;46562:9;46556:4;46552:20;46547:2;46536:9;46532:18;46525:48;46590:131;46716:4;46590:131;:::i;:::-;46582:139;;46731:72;46799:2;46788:9;46784:18;46775:6;46731:72;:::i;:::-;46813;46881:2;46870:9;46866:18;46857:6;46813:72;:::i;:::-;46142:750;;;;;;:::o;46898:76::-;46934:7;46963:5;46952:16;;46898:76;;;:::o;46980:372::-;47019:4;47039:19;47056:1;47039:19;:::i;:::-;47034:24;;47072:19;47089:1;47072:19;:::i;:::-;47067:24;;47115:1;47112;47108:9;47100:17;;47309:1;47303:4;47299:12;47295:1;47292;47288:9;47284:28;47267:1;47261:4;47257:12;47252:1;47249;47245:9;47238:17;47234:36;47218:104;47215:130;;;47325:18;;:::i;:::-;47215:130;46980:372;;;;:::o;47358:154::-;47498:6;47494:1;47486:6;47482:14;47475:30;47358:154;:::o;47518:365::-;47660:3;47681:66;47745:1;47740:3;47681:66;:::i;:::-;47674:73;;47756:93;47845:3;47756:93;:::i;:::-;47874:2;47869:3;47865:12;47858:19;;47518:365;;;:::o;47889:750::-;48139:4;48177:3;48166:9;48162:19;48154:27;;48191:71;48259:1;48248:9;48244:17;48235:6;48191:71;:::i;:::-;48309:9;48303:4;48299:20;48294:2;48283:9;48279:18;48272:48;48337:131;48463:4;48337:131;:::i;:::-;48329:139;;48478:72;48546:2;48535:9;48531:18;48522:6;48478:72;:::i;:::-;48560;48628:2;48617:9;48613:18;48604:6;48560:72;:::i;:::-;47889:750;;;;;;:::o;48645:152::-;48785:4;48781:1;48773:6;48769:14;48762:28;48645:152;:::o;48803:365::-;48945:3;48966:66;49030:1;49025:3;48966:66;:::i;:::-;48959:73;;49041:93;49130:3;49041:93;:::i;:::-;49159:2;49154:3;49150:12;49143:19;;48803:365;;;:::o;49174:419::-;49340:4;49378:2;49367:9;49363:18;49355:26;;49427:9;49421:4;49417:20;49413:1;49402:9;49398:17;49391:47;49455:131;49581:4;49455:131;:::i;:::-;49447:139;;49174:419;;;:::o;49599:348::-;49728:4;49766:2;49755:9;49751:18;49743:26;;49779:71;49847:1;49836:9;49832:17;49823:6;49779:71;:::i;:::-;49860:80;49936:2;49925:9;49921:18;49912:6;49860:80;:::i;:::-;49599:348;;;;;:::o;49953:194::-;49993:4;50013:20;50031:1;50013:20;:::i;:::-;50008:25;;50047:20;50065:1;50047:20;:::i;:::-;50042:25;;50091:1;50088;50084:9;50076:17;;50115:1;50109:4;50106:11;50103:37;;;50120:18;;:::i;:::-;50103:37;49953:194;;;;:::o;50153:831::-;50416:4;50454:3;50443:9;50439:19;50431:27;;50468:71;50536:1;50525:9;50521:17;50512:6;50468:71;:::i;:::-;50549:80;50625:2;50614:9;50610:18;50601:6;50549:80;:::i;:::-;50676:9;50670:4;50666:20;50661:2;50650:9;50646:18;50639:48;50704:108;50807:4;50798:6;50704:108;:::i;:::-;50696:116;;50822:72;50890:2;50879:9;50875:18;50866:6;50822:72;:::i;:::-;50904:73;50972:3;50961:9;50957:19;50948:6;50904:73;:::i;:::-;50153:831;;;;;;;;:::o;50990:180::-;51038:77;51035:1;51028:88;51135:4;51132:1;51125:15;51159:4;51156:1;51149:15;51176:185;51216:1;51233:20;51251:1;51233:20;:::i;:::-;51228:25;;51267:20;51285:1;51267:20;:::i;:::-;51262:25;;51306:1;51296:35;;51311:18;;:::i;:::-;51296:35;51353:1;51350;51346:9;51341:14;;51176:185;;;;:::o;51367:220::-;51507:34;51503:1;51495:6;51491:14;51484:58;51576:3;51571:2;51563:6;51559:15;51552:28;51367:220;:::o;51593:366::-;51735:3;51756:67;51820:2;51815:3;51756:67;:::i;:::-;51749:74;;51832:93;51921:3;51832:93;:::i;:::-;51950:2;51945:3;51941:12;51934:19;;51593:366;;;:::o;51965:419::-;52131:4;52169:2;52158:9;52154:18;52146:26;;52218:9;52212:4;52208:20;52204:1;52193:9;52189:17;52182:47;52246:131;52372:4;52246:131;:::i;:::-;52238:139;;51965:419;;;:::o;52390:147::-;52491:11;52528:3;52513:18;;52390:147;;;;:::o;52543:114::-;;:::o;52663:398::-;52822:3;52843:83;52924:1;52919:3;52843:83;:::i;:::-;52836:90;;52935:93;53024:3;52935:93;:::i;:::-;53053:1;53048:3;53044:11;53037:18;;52663:398;;;:::o;53067:379::-;53251:3;53273:147;53416:3;53273:147;:::i;:::-;53266:154;;53437:3;53430:10;;53067:379;;;:::o

Swarm Source

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