ETH Price: $3,365.81 (-2.29%)
Gas: 2 Gwei

Token

Project Sniffer (PST)
 

Overview

Max Total Supply

1,000,000,000 PST

Holders

124

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
333,717.781011532 PST

Value
$0.00
0xd550517a08be476eb2f5a72d76cfe59c9a4c1aca
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:
ProjectSniffer

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-10-12
*/

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

// Project Sniffer Token (PST)
// Supply: 1 Billion
// Website: https://projectsniffer.com/
// Email: [email protected]

// Mach III Software LLC Crypto Division 

library IterableMapping {
    struct Map {
        address[] keys;
        mapping(address => uint) values;
        mapping(address => uint) indexOf;
        mapping(address => bool) inserted;
    }

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

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

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

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

    function set(Map storage map, 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(Map storage map, 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();
    }
}
// End of IterableMapping

pragma solidity 0.8.19;

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

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

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

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

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

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

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address who) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

}

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

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

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

    uint256 private _totalSupply;
    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

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

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

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        _beforeTokenTransfer(sender, recipient, amount);
        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

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

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");
        _beforeTokenTransfer(account, address(0), amount);
        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

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

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

interface DividendPayingTokenInterface {
    function dividendOf(address _owner) external view returns(uint256);
    function withdrawDividend() external;
  
    event DividendsDistributed(
        address indexed from,
        uint256 weiAmount
    );
    event DividendWithdrawn(
        address indexed to,
        uint256 weiAmount
    );
}

interface DividendPayingTokenOptionalInterface {
    function withdrawableDividendOf(address _owner) external view returns(uint256);
    function withdrawnDividendOf(address _owner) external view returns(uint256);
    function accumulativeDividendOf(address _owner) external view returns(uint256);
}

contract DividendPayingToken is ERC20, Ownable, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface {
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;

    uint256 constant internal magnitude = 2**128;
    uint256 internal magnifiedDividendPerShare;
    uint256 public totalDividendsDistributed;
    
    address public immutable rewardToken;
    
    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;

    constructor(string memory _name, string memory _symbol, address _rewardToken) ERC20(_name, _symbol) { 
        rewardToken = _rewardToken;
    }

    function distributeDividends(uint256 amount) public onlyOwner{
        require(totalSupply() > 0);

        if (amount > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (amount).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, amount);

            totalDividendsDistributed = totalDividendsDistributed.add(amount);
        }
    }

    function withdrawDividend() public virtual override {
        _withdrawDividendOfUser(payable(msg.sender));
    }

    function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
            emit DividendWithdrawn(user, _withdrawableDividend);
            bool success = IERC20(rewardToken).transfer(user, _withdrawableDividend);

            if(!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
                return 0;
            }

            return _withdrawableDividend;
        }
        return 0;
    }

    function dividendOf(address _owner) public view override returns(uint256) {
        return withdrawableDividendOf(_owner);
    }

    function withdrawableDividendOf(address _owner) public view override returns(uint256) {
        return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
    }

    function withdrawnDividendOf(address _owner) public view override returns(uint256) {
        return withdrawnDividends[_owner];
    }

    function accumulativeDividendOf(address _owner) public view override returns(uint256) {
        return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe()
        .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
    }

    function _transfer(address from, address to, uint256 value) internal virtual override {
        require(false);

        int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe();
        magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection);
        magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection);
    }

    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
        .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
    }

    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
        .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
    }

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

contract DividendTracker is Ownable, DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping (address => bool) public excludedFromDividends;
    mapping (address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);

    event Claim(address indexed account, uint256 amount, bool indexed automatic);

    constructor(address _rewardToken, uint256 _minTokenDividend) DividendPayingToken("Project Sniffer Rewards", "DividendTracker", _rewardToken) {
        claimWait = 3600;
        minimumTokenBalanceForDividends = _minTokenDividend;
    }

    function _transfer(address, address, uint256) internal pure override {
        require(false, "No transfers allowed");
    }

    function withdrawDividend() public pure override {
        require(false, "withdrawDividend disabled. Use the 'claim' function on the main contract.");
    }

    function updateMinimumTokenBalanceForDividends(uint256 _newMinimumBalance) external onlyOwner {
        require(_newMinimumBalance != minimumTokenBalanceForDividends, "New mimimum balance for dividend cannot be same as current minimum balance");
        minimumTokenBalanceForDividends = _newMinimumBalance;
    }

    function excludeFromDividends(address account) external onlyOwner {
        require(!excludedFromDividends[account]);
        excludedFromDividends[account] = true;

        _setBalance(account, 0);
        tokenHoldersMap.remove(account);

        emit ExcludeFromDividends(account);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 3_600 && newClaimWait <= 86_400, "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 setLastProcessedIndex(uint256 index) external onlyOwner {
        lastProcessedIndex = index;
    }

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

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

    function getAccount(address _account)
        public view returns (
            address account,
            int256 index,
            int256 iterationsUntilProcessed,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            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.keys.length > lastProcessedIndex ?
                                                        tokenHoldersMap.keys.length.sub(lastProcessedIndex) :
                                                        0;


                iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray));
            }
        }


        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];

        nextClaimTime = lastClaimTime > 0 ?
                                    lastClaimTime.add(claimWait) :
                                    0;

        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ?
                                                    nextClaimTime.sub(block.timestamp) :
                                                    0;
    }

    function getAccountAtIndex(uint256 index)
        public view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
        if(index >= tokenHoldersMap.size()) {
            return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0);
        }

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

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

        return block.timestamp.sub(lastClaimTime) >= claimWait;
    }

    function setBalance(address payable account, uint256 newBalance) external onlyOwner {
        if(excludedFromDividends[account]) {
            return;
        }

        if(newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
            tokenHoldersMap.set(account, newBalance);
        }
        else {
            _setBalance(account, 0);
            tokenHoldersMap.remove(account);
        }

        processAccount(account, true);
    }

    function process(uint256 gas) public returns (uint256, uint256, uint256) {
        uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

        if(numberOfTokenHolders == 0) {
            return (0, 0, lastProcessedIndex);
        }

        uint256 _lastProcessedIndex = lastProcessedIndex;

        uint256 gasUsed = 0;

        uint256 gasLeft = gasleft();

        uint256 iterations = 0;
        uint256 claims = 0;

        while(gasUsed < gas && iterations < numberOfTokenHolders) {
            _lastProcessedIndex++;

            if(_lastProcessedIndex >= tokenHoldersMap.keys.length) {
                _lastProcessedIndex = 0;
            }

            address account = tokenHoldersMap.keys[_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 processAccount(address payable account, bool automatic) public onlyOwner returns (bool) {
        uint256 amount = _withdrawDividendOfUser(account);

        if(amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount, automatic);
            return true;
        }

        return false;
    }
}

contract ProjectSniffer is ERC20, Ownable {

    uint256 public marketingFeeOnBuy;
    uint256 public rewardsFeeOnBuy;

    uint256 private totalBuyFee;

    uint256 public marketingFeeOnSell;
    uint256 public rewardsFeeOnSell;

    uint256 private totalSellFee;

    address public marketingWallet;

    IUniswapV2Router02 public uniswapV2Router;
    address public  uniswapV2Pair;
    
    address private constant DEAD = 0x000000000000000000000000000000000000dEaD;

    bool    private swapping;
    uint256 public swapTokensAtAmount;

    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public automatedMarketMakerPairs;

    uint256 public maxWalletPercentage;

    DividendTracker public dividendTracker;
    address public immutable rewardToken;
    uint256 public gasForProcessing = 300_000;

    uint256 public minTokenBalanceForDividend;

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event SendMarketing(uint256 ethSend);
    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
    event UpdateDividendTracker(address indexed newAddress, address indexed oldAddress);
    event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event SendDividends(uint256 amount);
    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );

    constructor() payable ERC20("Project Sniffer", "PST") {

        marketingWallet = 0xa50c98570F9a8a3051F4395d65e839233c834C8D;
        rewardToken = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; // USDC

        // MAX WALLET SIZE
        maxWalletPercentage = 1;

        // BUYS
        marketingFeeOnBuy    = 2;
        rewardsFeeOnBuy     = 1;
        totalBuyFee         =  marketingFeeOnBuy + rewardsFeeOnBuy;

        // SELLS
        marketingFeeOnSell   = 10;
        rewardsFeeOnSell    = 20;
        totalSellFee        = marketingFeeOnSell + rewardsFeeOnSell;

        minTokenBalanceForDividend = 5000 * 10 ** 9;
        dividendTracker = new DividendTracker(rewardToken, minTokenBalanceForDividend);

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // MAINNET ROUTER02
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair   = _uniswapV2Pair;

        _approve(address(this), address(uniswapV2Router), type(uint256).max);
        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(DEAD);
        dividendTracker.excludeFromDividends(address(_uniswapV2Router));
        

        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[DEAD] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[marketingWallet] = true;

        // Token Supply
        _mint(owner(), 1000000000 * (10 ** 9));

        // Swap Tokens At
        swapTokensAtAmount = 50000 * (10 ** 9);

    }

    receive() external payable {}
    
    function setMaxWalletPercentage(uint256 percentage) external onlyOwner {
        maxWalletPercentage = percentage;
    }

    function getMaxWalletSize() external view returns (uint256) {
        return (totalSupply() * maxWalletPercentage) / 100;
    }

    function setBuyTaxRates(uint256 marketingFee, uint256 rewardsFee) internal {
        marketingFeeOnBuy = marketingFee;
        rewardsFeeOnBuy = rewardsFee;
        totalBuyFee = marketingFeeOnBuy + rewardsFeeOnBuy;
    }

    function setSellTaxRates(uint256 marketingFee, uint256 rewardsFee) internal {
        marketingFeeOnSell = marketingFee;
        rewardsFeeOnSell = rewardsFee;
        totalSellFee = marketingFeeOnSell + rewardsFeeOnSell;
    }

    function claimStuckTokens(address token) external onlyOwner {
        require(token != address(this), "Owner cannot claim native tokens");
        if (token == address(0x0)) {
            payable(msg.sender).transfer(address(this).balance);
            return;
        }
        IERC20 ERC20token = IERC20(token);
        uint256 balance = ERC20token.balanceOf(address(this));
        ERC20token.transfer(msg.sender, balance);
    }

    function isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(automatedMarketMakerPairs[pair] != value, "Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;

        if(value) {
            dividendTracker.excludeFromDividends(pair);
        }

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function excludeFromFees(address account, bool excluded) external onlyOwner {
        require(_isExcludedFromFees[account] != excluded, "Account is already set to that state");
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

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

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

        if (to != address(this) && to != uniswapV2Pair) {
            uint256 walletBalance = balanceOf(to);
            uint256 tokenLimit = totalSupply() * maxWalletPercentage / 100;
            require(walletBalance + amount <= tokenLimit, "Wallet limitation exceeded");
        }
        
        if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if( canSwap &&
            !swapping &&
            automatedMarketMakerPairs[to] &&
            totalBuyFee + totalSellFee > 0
        ) {
            swapping = true;
            
            uint256 ethShare = (marketingFeeOnBuy + marketingFeeOnSell) + (rewardsFeeOnBuy + rewardsFeeOnSell);
            
            if(contractTokenBalance > 0 && ethShare > 0) {
                uint256 initialBalance = address(this).balance;

                address[] memory path = new address[](2);
                path[0] = address(this);
                path[1] = uniswapV2Router.WETH();

                uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
                    contractTokenBalance,
                    0,
                    path,
                    address(this),
                    block.timestamp);
                
                uint256 newBalance = address(this).balance - initialBalance;

                if((marketingFeeOnBuy + marketingFeeOnSell) > 0) {
                    uint256 marketingETH = newBalance * (marketingFeeOnBuy + marketingFeeOnSell) / ethShare;
                    sendETH(payable(marketingWallet), marketingETH);
                    emit SendMarketing(marketingETH);
                }

                if((rewardsFeeOnBuy + rewardsFeeOnSell) > 0) {
                    uint256 rewardETH = newBalance * (rewardsFeeOnBuy + rewardsFeeOnSell) / ethShare;
                    swapAndSendDividends(rewardETH);
                }
            }

            swapping = false;
        }

        bool takeFee = !swapping;

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

        // w2w & not excluded from fees
        if(from != uniswapV2Pair && to != uniswapV2Pair && takeFee) {
            takeFee = false;
        }

        if(takeFee) {
            uint256 _totalFees;
            if(from == uniswapV2Pair) {
                _totalFees = totalBuyFee;
            } else {
                _totalFees = totalSellFee;
            }
            uint256 fees = amount * _totalFees / 100;
            
            amount = amount - fees;

            super._transfer(from, address(this), fees);
        }

        super._transfer(from, to, amount);

        try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
        try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}

        if(!swapping) {
            uint256 gas = gasForProcessing;

            try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
                emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin);
            }
            catch {

            }
        }
    }

    function swapAndSendDividends(uint256 amount) private{
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = rewardToken;

        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
            0,
            path,
            address(this),
            block.timestamp
        );
        
        uint256 balanceRewardToken = IERC20(rewardToken).balanceOf(address(this));
        bool success = IERC20(rewardToken).transfer(address(dividendTracker), balanceRewardToken);

        if (success) {
            dividendTracker.distributeDividends(balanceRewardToken);
            emit SendDividends(balanceRewardToken);
        }
    }

    function setSwapTokensAtAmount(uint256 newAmount) external onlyOwner{
        require(newAmount > totalSupply() / 100_000, "SwapTokensAtAmount must be greater than 0.001% of total supply");
        swapTokensAtAmount = newAmount;
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 3_600 && newClaimWait <= 86_400, "claimWait must be updated to between 1 and 24 hours");
        dividendTracker.updateClaimWait(newClaimWait);
    }

    function getClaimWait() external view returns(uint256) {
        return dividendTracker.claimWait();
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

    function withdrawableDividendOf(address account) public view returns(uint256) {
        return dividendTracker.withdrawableDividendOf(account);
    }

    function dividendTokenBalanceOf(address account) public view returns (uint256) {
        return dividendTracker.balanceOf(account);
    }

    function totalRewardsEarned(address account) public view returns (uint256) {
        return dividendTracker.accumulativeDividendOf(account);
    }

    function excludeFromDividends(address account) external onlyOwner{
        dividendTracker.excludeFromDividends(account);
    }

    function getAccountDividendsInfo(address account)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
        return dividendTracker.getAccount(account);
    }

    function getAccountDividendsInfoAtIndex(uint256 index)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
        return dividendTracker.getAccountAtIndex(index);
    }

    function processDividendTracker(uint256 gas) external {
        (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas);
        emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin);
    }

    function claim() external {
        dividendTracker.processAccount(payable(msg.sender), false);
    }

    function claimAddress(address claimee) external onlyOwner {
        dividendTracker.processAccount(payable(claimee), false);
    }

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

    function setLastProcessedIndex(uint256 index) external onlyOwner {
        dividendTracker.setLastProcessedIndex(index);
    }

    function getNumberOfDividendTokenHolders() external view returns(uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","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":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"ethSend","type":"uint256"}],"name":"SendMarketing","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"claimee","type":"address"}],"name":"claimAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"claimStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxWalletSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","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":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTokenBalanceForDividend","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsFeeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"setLastProcessedIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"setMaxWalletPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"totalRewardsEarned","outputs":[{"internalType":"uint256","name":"","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":"uint256","name":"newClaimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a0604052620493e06014556040518060400160405280600f81526020017f50726f6a65637420536e696666657200000000000000000000000000000000008152506040518060400160405280600381526020017f505354000000000000000000000000000000000000000000000000000000000081525081600390816200008891906200120f565b5080600490816200009a91906200120f565b505050620000bd620000b1620008e360201b60201c565b620008eb60201b60201c565b73a50c98570f9a8a3051f4395d65e839233c834c8d600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060016012819055506002600681905550600160078190555060075460065462000184919062001325565b600881905550600a6009819055506014600a81905550600a54600954620001ac919062001325565b600b8190555065048c27395000601581905550608051601554604051620001d39062000f87565b620001e0929190620013b6565b604051809103906000f080158015620001fd573d6000803e3d6000fd5b50601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000737a250d5630b4cf539739df2c5dacb4c659f2488d905060008173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002a5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002cb919062001419565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308473ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000333573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000359919062001419565b6040518363ffffffff1660e01b8152600401620003789291906200144b565b6020604051808303816000875af115801562000398573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003be919062001419565b905081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200049730600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff620009b160201b60201c565b620004aa81600162000b8260201b60201c565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040162000529919062001478565b600060405180830381600087803b1580156200054457600080fd5b505af115801562000559573d6000803e3d6000fd5b50505050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0306040518263ffffffff1660e01b8152600401620005ba919062001478565b600060405180830381600087803b158015620005d557600080fd5b505af1158015620005ea573d6000803e3d6000fd5b50505050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db061dead6040518263ffffffff1660e01b81526004016200064d919062001478565b600060405180830381600087803b1580156200066857600080fd5b505af11580156200067d573d6000803e3d6000fd5b50505050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0836040518263ffffffff1660e01b8152600401620006de919062001478565b600060405180830381600087803b158015620006f957600080fd5b505af11580156200070e573d6000803e3d6000fd5b505050506001601060006200072862000d5160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016010600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160106000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620008ce620008b962000d5160201b60201c565b670de0b6b3a764000062000d7b60201b60201c565b652d79883d2000600f8190555050506200176f565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000a23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a1a906200151c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000a95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a8c90620015b4565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405162000b759190620015d6565b60405180910390a3505050565b801515601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615150362000c17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c0e9062001669565b60405180910390fd5b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550801562000d0757601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0836040518263ffffffff1660e01b815260040162000cd2919062001478565b600060405180830381600087803b15801562000ced57600080fd5b505af115801562000d02573d6000803e3d6000fd5b505050505b8015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000ded576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000de490620016db565b60405180910390fd5b62000e016000838362000f1f60201b60201c565b62000e188160025462000f2460201b90919060201c565b60028190555062000e71816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205462000f2460201b90919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000f139190620015d6565b60405180910390a35050565b505050565b600080828462000f35919062001325565b90508381101562000f7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f74906200174d565b60405180910390fd5b8091505092915050565b614351806200666e83390190565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200101757607f821691505b6020821081036200102d576200102c62000fcf565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620010977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001058565b620010a3868362001058565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620010f0620010ea620010e484620010bb565b620010c5565b620010bb565b9050919050565b6000819050919050565b6200110c83620010cf565b620011246200111b82620010f7565b84845462001065565b825550505050565b600090565b6200113b6200112c565b6200114881848462001101565b505050565b5b8181101562001170576200116460008262001131565b6001810190506200114e565b5050565b601f821115620011bf57620011898162001033565b620011948462001048565b81016020851015620011a4578190505b620011bc620011b38562001048565b8301826200114d565b50505b505050565b600082821c905092915050565b6000620011e460001984600802620011c4565b1980831691505092915050565b6000620011ff8383620011d1565b9150826002028217905092915050565b6200121a8262000f95565b67ffffffffffffffff81111562001236576200123562000fa0565b5b62001242825462000ffe565b6200124f82828562001174565b600060209050601f83116001811462001287576000841562001272578287015190505b6200127e8582620011f1565b865550620012ee565b601f198416620012978662001033565b60005b82811015620012c1578489015182556001820191506020850194506020810190506200129a565b86831015620012e15784890151620012dd601f891682620011d1565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200133282620010bb565b91506200133f83620010bb565b92508282019050808211156200135a5762001359620012f6565b5b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200138d8262001360565b9050919050565b6200139f8162001380565b82525050565b620013b081620010bb565b82525050565b6000604082019050620013cd600083018562001394565b620013dc6020830184620013a5565b9392505050565b600080fd5b620013f38162001380565b8114620013ff57600080fd5b50565b6000815190506200141381620013e8565b92915050565b600060208284031215620014325762001431620013e3565b5b6000620014428482850162001402565b91505092915050565b600060408201905062001462600083018562001394565b62001471602083018462001394565b9392505050565b60006020820190506200148f600083018462001394565b92915050565b600082825260208201905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006200150460248362001495565b91506200151182620014a6565b604082019050919050565b600060208201905081810360008301526200153781620014f5565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006200159c60228362001495565b9150620015a9826200153e565b604082019050919050565b60006020820190508181036000830152620015cf816200158d565b9050919050565b6000602082019050620015ed6000830184620013a5565b92915050565b7f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160008201527f6c72656164792073657420746f20746861742076616c75650000000000000000602082015250565b60006200165160388362001495565b91506200165e82620015f3565b604082019050919050565b60006020820190508181036000830152620016848162001642565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620016c3601f8362001495565b9150620016d0826200168b565b602082019050919050565b60006020820190508181036000830152620016f681620016b4565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b600062001735601b8362001495565b91506200174282620016fd565b602082019050919050565b60006020820190508181036000830152620017688162001726565b9050919050565b608051614ece620017a0600039600081816122a8015281816138030152818161390901526139a70152614ece6000f3fe6080604052600436106102b25760003560e01c806375f0a87411610175578063b94315ff116100dc578063e4f24cb011610095578063f27fd2541161006f578063f27fd25414610b06578063f2fde38b14610b4a578063f7c618c114610b73578063f9d0831a14610b9e576102b9565b8063e4f24cb014610a75578063e7841ec014610ab2578063e98030c714610add576102b9565b8063b94315ff14610963578063c02466681461098e578063dc4c7dbc146109b7578063dd62ed3e146109e2578063e2f4560514610a1f578063e4893fdc14610a4a576102b9565b8063a457c2d71161012e578063a457c2d714610802578063a8b9d2401461083f578063a9059cbb1461087c578063ad56c13c146108b9578063afa4f3b2146108fd578063b62496f514610926576102b9565b806375f0a874146107025780637a845ece1461072d5780638da5cb5b1461075657806395d89b41146107815780639c1b8af5146107ac578063a26579ad146107d7576102b9565b80633f249df0116102195780635fc2e596116101d25780635fc2e596146105f257806364b0f6531461061d5780636843cd8414610648578063700bb1911461068557806370a08231146106ae578063715018a6146106eb576102b9565b80633f249df0146104f457806348b3c6451461051d57806349bd5a5e146105485780634e71d92d146105735780634fbee1931461058a578063599ca397146105c7576102b9565b8063286b3aa01161026b578063286b3aa0146103e45780632c1f52161461040d57806330bb4cff14610438578063313ce5671461046357806331e79db01461048e57806339509351146104b7576102b9565b806306227683146102be57806306fdde03146102e9578063095ea7b3146103145780631694505e1461035157806318160ddd1461037c57806323b872dd146103a7576102b9565b366102b957005b600080fd5b3480156102ca57600080fd5b506102d3610bc7565b6040516102e09190613b56565b60405180910390f35b3480156102f557600080fd5b506102fe610bef565b60405161030b9190613c01565b60405180910390f35b34801561032057600080fd5b5061033b60048036038101906103369190613cb2565b610c81565b6040516103489190613d0d565b60405180910390f35b34801561035d57600080fd5b50610366610c9f565b6040516103739190613d87565b60405180910390f35b34801561038857600080fd5b50610391610cc5565b60405161039e9190613b56565b60405180910390f35b3480156103b357600080fd5b506103ce60048036038101906103c99190613da2565b610ccf565b6040516103db9190613d0d565b60405180910390f35b3480156103f057600080fd5b5061040b60048036038101906104069190613df5565b610da8565b005b34801561041957600080fd5b50610422610eb4565b60405161042f9190613e43565b60405180910390f35b34801561044457600080fd5b5061044d610eda565b60405161045a9190613b56565b60405180910390f35b34801561046f57600080fd5b50610478610f72565b6040516104859190613e7a565b60405180910390f35b34801561049a57600080fd5b506104b560048036038101906104b09190613e95565b610f7b565b005b3480156104c357600080fd5b506104de60048036038101906104d99190613cb2565b611087565b6040516104eb9190613d0d565b60405180910390f35b34801561050057600080fd5b5061051b60048036038101906105169190613e95565b61113a565b005b34801561052957600080fd5b5061053261125b565b60405161053f9190613b56565b60405180910390f35b34801561055457600080fd5b5061055d611261565b60405161056a9190613ed1565b60405180910390f35b34801561057f57600080fd5b50610588611287565b005b34801561059657600080fd5b506105b160048036038101906105ac9190613e95565b61132b565b6040516105be9190613d0d565b60405180910390f35b3480156105d357600080fd5b506105dc611381565b6040516105e99190613b56565b60405180910390f35b3480156105fe57600080fd5b50610607611387565b6040516106149190613b56565b60405180910390f35b34801561062957600080fd5b5061063261138d565b60405161063f9190613b56565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a9190613e95565b611425565b60405161067c9190613b56565b60405180910390f35b34801561069157600080fd5b506106ac60048036038101906106a79190613df5565b6114ca565b005b3480156106ba57600080fd5b506106d560048036038101906106d09190613e95565b6115d1565b6040516106e29190613b56565b60405180910390f35b3480156106f757600080fd5b50610700611619565b005b34801561070e57600080fd5b506107176116a1565b6040516107249190613ed1565b60405180910390f35b34801561073957600080fd5b50610754600480360381019061074f9190613df5565b6116c7565b005b34801561076257600080fd5b5061076b61174d565b6040516107789190613ed1565b60405180910390f35b34801561078d57600080fd5b50610796611777565b6040516107a39190613c01565b60405180910390f35b3480156107b857600080fd5b506107c1611809565b6040516107ce9190613b56565b60405180910390f35b3480156107e357600080fd5b506107ec61180f565b6040516107f99190613b56565b60405180910390f35b34801561080e57600080fd5b5061082960048036038101906108249190613cb2565b6118a7565b6040516108369190613d0d565b60405180910390f35b34801561084b57600080fd5b5061086660048036038101906108619190613e95565b611974565b6040516108739190613b56565b60405180910390f35b34801561088857600080fd5b506108a3600480360381019061089e9190613cb2565b611a19565b6040516108b09190613d0d565b60405180910390f35b3480156108c557600080fd5b506108e060048036038101906108db9190613e95565b611a37565b6040516108f4989796959493929190613f05565b60405180910390f35b34801561090957600080fd5b50610924600480360381019061091f9190613df5565b611afb565b005b34801561093257600080fd5b5061094d60048036038101906109489190613e95565b611bd8565b60405161095a9190613d0d565b60405180910390f35b34801561096f57600080fd5b50610978611bf8565b6040516109859190613b56565b60405180910390f35b34801561099a57600080fd5b506109b560048036038101906109b09190613faf565b611bfe565b005b3480156109c357600080fd5b506109cc611db5565b6040516109d99190613b56565b60405180910390f35b3480156109ee57600080fd5b50610a096004803603810190610a049190613fef565b611dbb565b604051610a169190613b56565b60405180910390f35b348015610a2b57600080fd5b50610a34611e42565b604051610a419190613b56565b60405180910390f35b348015610a5657600080fd5b50610a5f611e48565b604051610a6c9190613b56565b60405180910390f35b348015610a8157600080fd5b50610a9c6004803603810190610a979190613e95565b611e4e565b604051610aa99190613b56565b60405180910390f35b348015610abe57600080fd5b50610ac7611ef3565b604051610ad49190613b56565b60405180910390f35b348015610ae957600080fd5b50610b046004803603810190610aff9190613df5565b611f8b565b005b348015610b1257600080fd5b50610b2d6004803603810190610b289190613df5565b6120eb565b604051610b41989796959493929190613f05565b60405180910390f35b348015610b5657600080fd5b50610b716004803603810190610b6c9190613e95565b6121af565b005b348015610b7f57600080fd5b50610b886122a6565b604051610b959190613ed1565b60405180910390f35b348015610baa57600080fd5b50610bc56004803603810190610bc09190613e95565b6122ca565b005b60006064601254610bd6610cc5565b610be0919061405e565b610bea91906140cf565b905090565b606060038054610bfe9061412f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2a9061412f565b8015610c775780601f10610c4c57610100808354040283529160200191610c77565b820191906000526020600020905b815481529060010190602001808311610c5a57829003601f168201915b5050505050905090565b6000610c95610c8e61253c565b8484612544565b6001905092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b6000610cdc84848461270d565b610d9d84610ce861253c565b610d9885604051806060016040528060288152602001614e4c60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610d4e61253c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131c59092919063ffffffff16565b612544565b600190509392505050565b610db061253c565b73ffffffffffffffffffffffffffffffffffffffff16610dce61174d565b73ffffffffffffffffffffffffffffffffffffffff1614610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b906141ac565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663286b3aa0826040518263ffffffff1660e01b8152600401610e7f9190613b56565b600060405180830381600087803b158015610e9957600080fd5b505af1158015610ead573d6000803e3d6000fd5b5050505050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166385a6b3ae6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6d91906141e1565b905090565b60006009905090565b610f8361253c565b73ffffffffffffffffffffffffffffffffffffffff16610fa161174d565b73ffffffffffffffffffffffffffffffffffffffff1614610ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fee906141ac565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b81526004016110529190613ed1565b600060405180830381600087803b15801561106c57600080fd5b505af1158015611080573d6000803e3d6000fd5b5050505050565b600061113061109461253c565b8461112b85600160006110a561253c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461322990919063ffffffff16565b612544565b6001905092915050565b61114261253c565b73ffffffffffffffffffffffffffffffffffffffff1661116061174d565b73ffffffffffffffffffffffffffffffffffffffff16146111b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ad906141ac565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc4c4b378260006040518363ffffffff1660e01b815260040161121492919061422f565b6020604051808303816000875af1158015611233573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611257919061426d565b5050565b60155481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc4c4b373360006040518363ffffffff1660e01b81526004016112e592919061422f565b6020604051808303816000875af1158015611304573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611328919061426d565b50565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60125481565b60065481565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166309bbedde6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142091906141e1565b905090565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016114829190613ed1565b602060405180830381865afa15801561149f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c391906141e1565b9050919050565b6000806000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479856040518263ffffffff1660e01b815260040161152a9190613b56565b6060604051808303816000875af1158015611549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156d919061429a565b9250925092503273ffffffffffffffffffffffffffffffffffffffff16600015157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98858585896040516115c394939291906142ed565b60405180910390a350505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61162161253c565b73ffffffffffffffffffffffffffffffffffffffff1661163f61174d565b73ffffffffffffffffffffffffffffffffffffffff1614611695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168c906141ac565b60405180910390fd5b61169f6000613287565b565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6116cf61253c565b73ffffffffffffffffffffffffffffffffffffffff166116ed61174d565b73ffffffffffffffffffffffffffffffffffffffff1614611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a906141ac565b60405180910390fd5b8060128190555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546117869061412f565b80601f01602080910402602001604051908101604052809291908181526020018280546117b29061412f565b80156117ff5780601f106117d4576101008083540402835291602001916117ff565b820191906000526020600020905b8154815290600101906020018083116117e257829003601f168201915b5050505050905090565b60145481565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636f2789ec6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561187e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a291906141e1565b905090565b600061196a6118b461253c565b8461196585604051806060016040528060258152602001614e7460259139600160006118de61253c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131c59092919063ffffffff16565b612544565b6001905092915050565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a8b9d240836040518263ffffffff1660e01b81526004016119d19190613ed1565b602060405180830381865afa1580156119ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1291906141e1565b9050919050565b6000611a2d611a2661253c565b848461270d565b6001905092915050565b600080600080600080600080601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fbcbc0f18a6040518263ffffffff1660e01b8152600401611a9e9190613ed1565b61010060405180830381865afa158015611abc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae09190614373565b97509750975097509750975097509750919395975091939597565b611b0361253c565b73ffffffffffffffffffffffffffffffffffffffff16611b2161174d565b73ffffffffffffffffffffffffffffffffffffffff1614611b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6e906141ac565b60405180910390fd5b620186a0611b83610cc5565b611b8d91906140cf565b8111611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc59061449b565b60405180910390fd5b80600f8190555050565b60116020528060005260406000206000915054906101000a900460ff1681565b600a5481565b611c0661253c565b73ffffffffffffffffffffffffffffffffffffffff16611c2461174d565b73ffffffffffffffffffffffffffffffffffffffff1614611c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c71906141ac565b60405180910390fd5b801515601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503611d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d039061452d565b60405180910390fd5b80601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611da99190613d0d565b60405180910390a25050565b60095481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600f5481565b60075481565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ce0147836040518263ffffffff1660e01b8152600401611eab9190613ed1565b602060405180830381865afa158015611ec8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eec91906141e1565b9050919050565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e7841ec06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8691906141e1565b905090565b611f9361253c565b73ffffffffffffffffffffffffffffffffffffffff16611fb161174d565b73ffffffffffffffffffffffffffffffffffffffff1614612007576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffe906141ac565b60405180910390fd5b610e10811015801561201c5750620151808111155b61205b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612052906145bf565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e98030c7826040518263ffffffff1660e01b81526004016120b69190613b56565b600060405180830381600087803b1580156120d057600080fd5b505af11580156120e4573d6000803e3d6000fd5b5050505050565b600080600080600080600080601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635183d6fd8a6040518263ffffffff1660e01b81526004016121529190613b56565b61010060405180830381865afa158015612170573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121949190614373565b97509750975097509750975097509750919395975091939597565b6121b761253c565b73ffffffffffffffffffffffffffffffffffffffff166121d561174d565b73ffffffffffffffffffffffffffffffffffffffff161461222b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612222906141ac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361229a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229190614651565b60405180910390fd5b6122a381613287565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b6122d261253c565b73ffffffffffffffffffffffffffffffffffffffff166122f061174d565b73ffffffffffffffffffffffffffffffffffffffff1614612346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233d906141ac565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ab906146bd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612434573373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561242e573d6000803e3d6000fd5b50612539565b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124749190613ed1565b602060405180830381865afa158015612491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b591906141e1565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016124f29291906146dd565b6020604051808303816000875af1158015612511573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612535919061426d565b5050505b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036125b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125aa90614778565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612622576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126199061480a565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516127009190613b56565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361277c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127739061489c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036127eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e29061492e565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156128755750600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156128fd576000612885836115d1565b905060006064601254612896610cc5565b6128a0919061405e565b6128aa91906140cf565b90508083836128b9919061494e565b11156128fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f1906149ce565b60405180910390fd5b50505b60008103612916576129118383600061334d565b6131c0565b6000612921306115d1565b90506000600f5482101590508080156129475750600e60149054906101000a900460ff16155b801561299c5750601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80156129b757506000600b546008546129b5919061494e565b115b15612d56576001600e60146101000a81548160ff0219169083151502179055506000600a546007546129e9919061494e565b6009546006546129f9919061494e565b612a03919061494e565b9050600083118015612a155750600081115b15612d395760004790506000600267ffffffffffffffff811115612a3c57612a3b6149ee565b5b604051908082528060200260200182016040528015612a6a5781602001602082028036833780820191505090505b5090503081600081518110612a8257612a81614a1d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4d9190614a4c565b81600181518110612b6157612b60614a1d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478660008430426040518663ffffffff1660e01b8152600401612bff959493929190614b72565b600060405180830381600087803b158015612c1957600080fd5b505af1158015612c2d573d6000803e3d6000fd5b5050505060008247612c3f9190614bcc565b90506000600954600654612c53919061494e565b1115612ce857600084600954600654612c6c919061494e565b83612c77919061405e565b612c8191906140cf565b9050612caf600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826135e0565b7fddce3d5e4f18a9c2902704a38b56baadd81a9af59b8ded8a3220b6a6c1696b6b81604051612cde9190613b56565b60405180910390a1505b6000600a54600754612cfa919061494e565b1115612d3557600084600a54600754612d13919061494e565b83612d1e919061405e565b612d2891906140cf565b9050612d33816136d4565b505b5050505b6000600e60146101000a81548160ff021916908315150217905550505b6000600e60149054906101000a900460ff16159050601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612e0c5750601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612e1657600090505b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612ec25750600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612ecb5750805b15612ed557600090505b8015612f7a576000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603612f3c576008549050612f42565b600b5490505b600060648287612f52919061405e565b612f5c91906140cf565b90508086612f6a9190614bcc565b9550612f7788308361334d565b50505b612f8586868661334d565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc87612fcd896115d1565b6040518363ffffffff1660e01b8152600401612fea929190614c00565b600060405180830381600087803b15801561300457600080fd5b505af1925050508015613015575060015b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc8661305e886115d1565b6040518363ffffffff1660e01b815260040161307b929190614c00565b600060405180830381600087803b15801561309557600080fd5b505af19250505080156130a6575060015b50600e60149054906101000a900460ff166131bc5760006014549050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479826040518263ffffffff1660e01b815260040161311d9190613b56565b6060604051808303816000875af192505050801561315957506040513d601f19601f82011682018060405250810190613156919061429a565b60015b156131ba573273ffffffffffffffffffffffffffffffffffffffff16600115157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98858585896040516131ae94939291906142ed565b60405180910390a35050505b505b5050505b505050565b600083831115829061320d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132049190613c01565b60405180910390fd5b506000838561321c9190614bcc565b9050809150509392505050565b6000808284613238919061494e565b90508381101561327d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327490614c75565b60405180910390fd5b8091505092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036133bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b39061489c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361342b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134229061492e565b60405180910390fd5b613436838383613b38565b6134a181604051806060016040528060268152602001614e26602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131c59092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613534816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461322990919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516135d39190613b56565b60405180910390a3505050565b80471015613623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361a90614ce1565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161364990614d32565b60006040518083038185875af1925050503d8060008114613686576040519150601f19603f3d011682016040523d82523d6000602084013e61368b565b606091505b50509050806136cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136c690614db9565b60405180910390fd5b505050565b6000600267ffffffffffffffff8111156136f1576136f06149ee565b5b60405190808252806020026020018201604052801561371f5781602001602082028036833780820191505090505b509050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561378f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137b39190614a4c565b816000815181106137c7576137c6614a1d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061383657613835614a1d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de958360008430426040518663ffffffff1660e01b81526004016138d39493929190614dd9565b6000604051808303818588803b1580156138ec57600080fd5b505af1158015613900573d6000803e3d6000fd5b505050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016139609190613ed1565b602060405180830381865afa15801561397d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139a191906141e1565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401613a229291906146dd565b6020604051808303816000875af1158015613a41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a65919061426d565b90508015613b3257601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633243c791836040518263ffffffff1660e01b8152600401613ac89190613b56565b600060405180830381600087803b158015613ae257600080fd5b505af1158015613af6573d6000803e3d6000fd5b505050507fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b182604051613b299190613b56565b60405180910390a15b50505050565b505050565b6000819050919050565b613b5081613b3d565b82525050565b6000602082019050613b6b6000830184613b47565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613bab578082015181840152602081019050613b90565b60008484015250505050565b6000601f19601f8301169050919050565b6000613bd382613b71565b613bdd8185613b7c565b9350613bed818560208601613b8d565b613bf681613bb7565b840191505092915050565b60006020820190508181036000830152613c1b8184613bc8565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c5382613c28565b9050919050565b613c6381613c48565b8114613c6e57600080fd5b50565b600081359050613c8081613c5a565b92915050565b613c8f81613b3d565b8114613c9a57600080fd5b50565b600081359050613cac81613c86565b92915050565b60008060408385031215613cc957613cc8613c23565b5b6000613cd785828601613c71565b9250506020613ce885828601613c9d565b9150509250929050565b60008115159050919050565b613d0781613cf2565b82525050565b6000602082019050613d226000830184613cfe565b92915050565b6000819050919050565b6000613d4d613d48613d4384613c28565b613d28565b613c28565b9050919050565b6000613d5f82613d32565b9050919050565b6000613d7182613d54565b9050919050565b613d8181613d66565b82525050565b6000602082019050613d9c6000830184613d78565b92915050565b600080600060608486031215613dbb57613dba613c23565b5b6000613dc986828701613c71565b9350506020613dda86828701613c71565b9250506040613deb86828701613c9d565b9150509250925092565b600060208284031215613e0b57613e0a613c23565b5b6000613e1984828501613c9d565b91505092915050565b6000613e2d82613d54565b9050919050565b613e3d81613e22565b82525050565b6000602082019050613e586000830184613e34565b92915050565b600060ff82169050919050565b613e7481613e5e565b82525050565b6000602082019050613e8f6000830184613e6b565b92915050565b600060208284031215613eab57613eaa613c23565b5b6000613eb984828501613c71565b91505092915050565b613ecb81613c48565b82525050565b6000602082019050613ee66000830184613ec2565b92915050565b6000819050919050565b613eff81613eec565b82525050565b600061010082019050613f1b600083018b613ec2565b613f28602083018a613ef6565b613f356040830189613ef6565b613f426060830188613b47565b613f4f6080830187613b47565b613f5c60a0830186613b47565b613f6960c0830185613b47565b613f7660e0830184613b47565b9998505050505050505050565b613f8c81613cf2565b8114613f9757600080fd5b50565b600081359050613fa981613f83565b92915050565b60008060408385031215613fc657613fc5613c23565b5b6000613fd485828601613c71565b9250506020613fe585828601613f9a565b9150509250929050565b6000806040838503121561400657614005613c23565b5b600061401485828601613c71565b925050602061402585828601613c71565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061406982613b3d565b915061407483613b3d565b925082820261408281613b3d565b915082820484148315176140995761409861402f565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006140da82613b3d565b91506140e583613b3d565b9250826140f5576140f46140a0565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061414757607f821691505b60208210810361415a57614159614100565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614196602083613b7c565b91506141a182614160565b602082019050919050565b600060208201905081810360008301526141c581614189565b9050919050565b6000815190506141db81613c86565b92915050565b6000602082840312156141f7576141f6613c23565b5b6000614205848285016141cc565b91505092915050565b600061421982613c28565b9050919050565b6142298161420e565b82525050565b60006040820190506142446000830185614220565b6142516020830184613cfe565b9392505050565b60008151905061426781613f83565b92915050565b60006020828403121561428357614282613c23565b5b600061429184828501614258565b91505092915050565b6000806000606084860312156142b3576142b2613c23565b5b60006142c1868287016141cc565b93505060206142d2868287016141cc565b92505060406142e3868287016141cc565b9150509250925092565b60006080820190506143026000830187613b47565b61430f6020830186613b47565b61431c6040830185613b47565b6143296060830184613b47565b95945050505050565b60008151905061434181613c5a565b92915050565b61435081613eec565b811461435b57600080fd5b50565b60008151905061436d81614347565b92915050565b600080600080600080600080610100898b03121561439457614393613c23565b5b60006143a28b828c01614332565b98505060206143b38b828c0161435e565b97505060406143c48b828c0161435e565b96505060606143d58b828c016141cc565b95505060806143e68b828c016141cc565b94505060a06143f78b828c016141cc565b93505060c06144088b828c016141cc565b92505060e06144198b828c016141cc565b9150509295985092959890939650565b7f53776170546f6b656e734174416d6f756e74206d75737420626520677265617460008201527f6572207468616e20302e30303125206f6620746f74616c20737570706c790000602082015250565b6000614485603e83613b7c565b915061449082614429565b604082019050919050565b600060208201905081810360008301526144b481614478565b9050919050565b7f4163636f756e7420697320616c72656164792073657420746f2074686174207360008201527f7461746500000000000000000000000000000000000000000000000000000000602082015250565b6000614517602483613b7c565b9150614522826144bb565b604082019050919050565b600060208201905081810360008301526145468161450a565b9050919050565b7f636c61696d57616974206d757374206265207570646174656420746f2062657460008201527f7765656e203120616e6420323420686f75727300000000000000000000000000602082015250565b60006145a9603383613b7c565b91506145b48261454d565b604082019050919050565b600060208201905081810360008301526145d88161459c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061463b602683613b7c565b9150614646826145df565b604082019050919050565b6000602082019050818103600083015261466a8161462e565b9050919050565b7f4f776e65722063616e6e6f7420636c61696d206e617469766520746f6b656e73600082015250565b60006146a7602083613b7c565b91506146b282614671565b602082019050919050565b600060208201905081810360008301526146d68161469a565b9050919050565b60006040820190506146f26000830185613ec2565b6146ff6020830184613b47565b9392505050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614762602483613b7c565b915061476d82614706565b604082019050919050565b6000602082019050818103600083015261479181614755565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006147f4602283613b7c565b91506147ff82614798565b604082019050919050565b60006020820190508181036000830152614823816147e7565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614886602583613b7c565b91506148918261482a565b604082019050919050565b600060208201905081810360008301526148b581614879565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614918602383613b7c565b9150614923826148bc565b604082019050919050565b600060208201905081810360008301526149478161490b565b9050919050565b600061495982613b3d565b915061496483613b3d565b925082820190508082111561497c5761497b61402f565b5b92915050565b7f57616c6c6574206c696d69746174696f6e206578636565646564000000000000600082015250565b60006149b8601a83613b7c565b91506149c382614982565b602082019050919050565b600060208201905081810360008301526149e7816149ab565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215614a6257614a61613c23565b5b6000614a7084828501614332565b91505092915050565b6000819050919050565b6000614a9e614a99614a9484614a79565b613d28565b613b3d565b9050919050565b614aae81614a83565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614ae981613c48565b82525050565b6000614afb8383614ae0565b60208301905092915050565b6000602082019050919050565b6000614b1f82614ab4565b614b298185614abf565b9350614b3483614ad0565b8060005b83811015614b65578151614b4c8882614aef565b9750614b5783614b07565b925050600181019050614b38565b5085935050505092915050565b600060a082019050614b876000830188613b47565b614b946020830187614aa5565b8181036040830152614ba68186614b14565b9050614bb56060830185613ec2565b614bc26080830184613b47565b9695505050505050565b6000614bd782613b3d565b9150614be283613b3d565b9250828203905081811115614bfa57614bf961402f565b5b92915050565b6000604082019050614c156000830185614220565b614c226020830184613b47565b9392505050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614c5f601b83613b7c565b9150614c6a82614c29565b602082019050919050565b60006020820190508181036000830152614c8e81614c52565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614ccb601d83613b7c565b9150614cd682614c95565b602082019050919050565b60006020820190508181036000830152614cfa81614cbe565b9050919050565b600081905092915050565b50565b6000614d1c600083614d01565b9150614d2782614d0c565b600082019050919050565b6000614d3d82614d0f565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614da3603a83613b7c565b9150614dae82614d47565b604082019050919050565b60006020820190508181036000830152614dd281614d96565b9050919050565b6000608082019050614dee6000830187614aa5565b8181036020830152614e008186614b14565b9050614e0f6040830185613ec2565b614e1c6060830184613b47565b9594505050505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a04286a99c3fcb16309001c2e2f866ebd81611834a8c41cdbcd6bd6276cba81264736f6c6343000813003360a06040523480156200001157600080fd5b5060405162004351380380620043518339818101604052810190620000379190620002ae565b6040518060400160405280601781526020017f50726f6a65637420536e696666657220526577617264730000000000000000008152506040518060400160405280600f81526020017f4469766964656e64547261636b657200000000000000000000000000000000008152508382828160039081620000b7919062000565565b508060049081620000c9919062000565565b505050620000ec620000e06200013b60201b60201c565b6200014360201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050505050610e106011819055508060128190555050506200064c565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200023b826200020e565b9050919050565b6200024d816200022e565b81146200025957600080fd5b50565b6000815190506200026d8162000242565b92915050565b6000819050919050565b620002888162000273565b81146200029457600080fd5b50565b600081519050620002a8816200027d565b92915050565b60008060408385031215620002c857620002c762000209565b5b6000620002d8858286016200025c565b9250506020620002eb8582860162000297565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200037757607f821691505b6020821081036200038d576200038c6200032f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003f77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003b8565b620004038683620003b8565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000446620004406200043a8462000273565b6200041b565b62000273565b9050919050565b6000819050919050565b620004628362000425565b6200047a62000471826200044d565b848454620003c5565b825550505050565b600090565b6200049162000482565b6200049e81848462000457565b505050565b5b81811015620004c657620004ba60008262000487565b600181019050620004a4565b5050565b601f8211156200051557620004df8162000393565b620004ea84620003a8565b81016020851015620004fa578190505b620005126200050985620003a8565b830182620004a3565b50505b505050565b600082821c905092915050565b60006200053a600019846008026200051a565b1980831691505092915050565b600062000555838362000527565b9150826002028217905092915050565b6200057082620002f5565b67ffffffffffffffff8111156200058c576200058b62000300565b5b6200059882546200035e565b620005a5828285620004ca565b600060209050601f831160018114620005dd5760008415620005c8578287015190505b620005d4858262000547565b86555062000644565b601f198416620005ed8662000393565b60005b828110156200061757848901518255600182019150602085019450602081019050620005f0565b8683101562000637578489015162000633601f89168262000527565b8355505b6001600288020188555050505b505050505050565b608051613ce26200066f60003960008181611a7701526124560152613ce26000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c8063715018a611610130578063bc4c4b37116100b8578063e98030c71161007c578063e98030c7146106f8578063f2fde38b14610714578063f7c618c114610730578063fbcbc0f11461074e578063ffb2c4791461078557610232565b8063bc4c4b3714610640578063be10b61414610670578063dd62ed3e1461068e578063e30443bc146106be578063e7841ec0146106da57610232565b806395d89b41116100ff57806395d89b4114610562578063a457c2d714610580578063a8b9d240146105b0578063a9059cbb146105e0578063aafd847a1461061057610232565b8063715018a6146104ec57806385a6b3ae146104f65780638da5cb5b1461051457806391b89fba1461053257610232565b80633009a609116101be5780634e7b827f116101825780634e7b827f1461042d5780635183d6fd1461045d5780636a474002146104945780636f2789ec1461049e57806370a08231146104bc57610232565b80633009a60914610389578063313ce567146103a757806331e79db0146103c55780633243c791146103e157806339509351146103fd57610232565b806318160ddd1161020557806318160ddd146102bf578063226cfa3d146102dd57806323b872dd1461030d57806327ce01471461033d578063286b3aa01461036d57610232565b806306fdde0314610237578063095ea7b31461025557806309bbedde146102855780630dcb2e89146102a3575b600080fd5b61023f6107b7565b60405161024c9190612b7f565b60405180910390f35b61026f600480360381019061026a9190612c3a565b610849565b60405161027c9190612c95565b60405180910390f35b61028d610867565b60405161029a9190612cbf565b60405180910390f35b6102bd60048036038101906102b89190612cda565b610877565b005b6102c7610941565b6040516102d49190612cbf565b60405180910390f35b6102f760048036038101906102f29190612d07565b61094b565b6040516103049190612cbf565b60405180910390f35b61032760048036038101906103229190612d34565b610963565b6040516103349190612c95565b60405180910390f35b61035760048036038101906103529190612d07565b610a3c565b6040516103649190612cbf565b60405180910390f35b61038760048036038101906103829190612cda565b610adf565b005b610391610b65565b60405161039e9190612cbf565b60405180910390f35b6103af610b6b565b6040516103bc9190612da3565b60405180910390f35b6103df60048036038101906103da9190612d07565b610b74565b005b6103fb60048036038101906103f69190612cda565b610d5c565b005b61041760048036038101906104129190612c3a565b610eb2565b6040516104249190612c95565b60405180910390f35b61044760048036038101906104429190612d07565b610f65565b6040516104549190612c95565b60405180910390f35b61047760048036038101906104729190612cda565b610f85565b60405161048b989796959493929190612de6565b60405180910390f35b61049c6110fa565b005b6104a661113d565b6040516104b39190612cbf565b60405180910390f35b6104d660048036038101906104d19190612d07565b611143565b6040516104e39190612cbf565b60405180910390f35b6104f461118b565b005b6104fe611213565b60405161050b9190612cbf565b60405180910390f35b61051c611219565b6040516105299190612e64565b60405180910390f35b61054c60048036038101906105479190612d07565b611243565b6040516105599190612cbf565b60405180910390f35b61056a611255565b6040516105779190612b7f565b60405180910390f35b61059a60048036038101906105959190612c3a565b6112e7565b6040516105a79190612c95565b60405180910390f35b6105ca60048036038101906105c59190612d07565b6113b4565b6040516105d79190612cbf565b60405180910390f35b6105fa60048036038101906105f59190612c3a565b611417565b6040516106079190612c95565b60405180910390f35b61062a60048036038101906106259190612d07565b611435565b6040516106379190612cbf565b60405180910390f35b61065a60048036038101906106559190612ee9565b61147e565b6040516106679190612c95565b60405180910390f35b6106786115bd565b6040516106859190612cbf565b60405180910390f35b6106a860048036038101906106a39190612f29565b6115c3565b6040516106b59190612cbf565b60405180910390f35b6106d860048036038101906106d39190612f69565b61164a565b005b6106e2611826565b6040516106ef9190612cbf565b60405180910390f35b610712600480360381019061070d9190612cda565b611830565b005b61072e60048036038101906107299190612d07565b61197e565b005b610738611a75565b6040516107459190612e64565b60405180910390f35b61076860048036038101906107639190612d07565b611a99565b60405161077c989796959493929190612de6565b60405180910390f35b61079f600480360381019061079a9190612cda565b611c78565b6040516107ae93929190612fa9565b60405180910390f35b6060600380546107c69061300f565b80601f01602080910402602001604051908101604052809291908181526020018280546107f29061300f565b801561083f5780601f106108145761010080835404028352916020019161083f565b820191906000526020600020905b81548152906001019060200180831161082257829003601f168201915b5050505050905090565b600061085d610856611e09565b8484611e11565b6001905092915050565b6000600a60000180549050905090565b61087f611e09565b73ffffffffffffffffffffffffffffffffffffffff1661089d611219565b73ffffffffffffffffffffffffffffffffffffffff16146108f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ea9061308c565b60405180910390fd5b6012548103610937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092e90613144565b60405180910390fd5b8060128190555050565b6000600254905090565b60106020528060005260406000206000915090505481565b6000610970848484611fda565b610a318461097c611e09565b610a2c85604051806060016040528060288152602001613c6060289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006109e2611e09565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120209092919063ffffffff16565b611e11565b600190509392505050565b6000700100000000000000000000000000000000610ace610ac9600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610abb610ab6610aa588611143565b60065461208490919063ffffffff16565b6120fe565b61211b90919063ffffffff16565b612166565b610ad891906131c2565b9050919050565b610ae7611e09565b73ffffffffffffffffffffffffffffffffffffffff16610b05611219565b73ffffffffffffffffffffffffffffffffffffffff1614610b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b529061308c565b60405180910390fd5b80600e8190555050565b600e5481565b60006009905090565b610b7c611e09565b73ffffffffffffffffffffffffffffffffffffffff16610b9a611219565b73ffffffffffffffffffffffffffffffffffffffff1614610bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be79061308c565b60405180910390fd5b600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610c4757600080fd5b6001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610caa81600061217d565b600a73d3a51862316ee870513186cdb79549d837d56c59634c60db9c9091836040518363ffffffff1660e01b8152600401610ce6929190613209565b60006040518083038186803b158015610cfe57600080fd5b505af4158015610d12573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2560405160405180910390a250565b610d64611e09565b73ffffffffffffffffffffffffffffffffffffffff16610d82611219565b73ffffffffffffffffffffffffffffffffffffffff1614610dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcf9061308c565b60405180910390fd5b6000610de2610941565b11610dec57600080fd5b6000811115610eaf57610e3f610e00610941565b610e247001000000000000000000000000000000008461208490919063ffffffff16565b610e2e91906131c2565b6006546121ea90919063ffffffff16565b6006819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d7845411651182604051610e8b9190612cbf565b60405180910390a2610ea8816007546121ea90919063ffffffff16565b6007819055505b50565b6000610f5b610ebf611e09565b84610f568560016000610ed0611e09565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121ea90919063ffffffff16565b611e11565b6001905092915050565b600f6020528060005260406000206000915054906101000a900460ff1681565b600080600080600080600080600a73d3a51862316ee870513186cdb79549d837d56c5963deb3d89690916040518263ffffffff1660e01b8152600401610fcb9190613232565b602060405180830381865af4158015610fe8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100c9190613262565b89106110535760007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff806000806000806000975097509750975097509750975097506110ef565b6000600a73d3a51862316ee870513186cdb79549d837d56c5963d1aa9e7e90918c6040518363ffffffff1660e01b815260040161109192919061329e565b602060405180830381865af41580156110ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d291906132dc565b90506110dd81611a99565b98509850985098509850985098509850505b919395975091939597565b600061113b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611132906133a1565b60405180910390fd5b565b60115481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611193611e09565b73ffffffffffffffffffffffffffffffffffffffff166111b1611219565b73ffffffffffffffffffffffffffffffffffffffff1614611207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fe9061308c565b60405180910390fd5b6112116000612248565b565b60075481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061124e826113b4565b9050919050565b6060600480546112649061300f565b80601f01602080910402602001604051908101604052809291908181526020018280546112909061300f565b80156112dd5780601f106112b2576101008083540402835291602001916112dd565b820191906000526020600020905b8154815290600101906020018083116112c057829003601f168201915b5050505050905090565b60006113aa6112f4611e09565b846113a585604051806060016040528060258152602001613c88602591396001600061131e611e09565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120209092919063ffffffff16565b611e11565b6001905092915050565b6000611410600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461140284610a3c565b61230e90919063ffffffff16565b9050919050565b600061142b611424611e09565b8484611fda565b6001905092915050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000611488611e09565b73ffffffffffffffffffffffffffffffffffffffff166114a6611219565b73ffffffffffffffffffffffffffffffffffffffff16146114fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f39061308c565b60405180910390fd5b600061150784612358565b905060008111156115b15742601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508215158473ffffffffffffffffffffffffffffffffffffffff167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf0928360405161159f9190612cbf565b60405180910390a360019150506115b7565b60009150505b92915050565b60125481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611652611e09565b73ffffffffffffffffffffffffffffffffffffffff16611670611219565b73ffffffffffffffffffffffffffffffffffffffff16146116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd9061308c565b60405180910390fd5b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661182257601254811061179d5761172a828261217d565b600a73d3a51862316ee870513186cdb79549d837d56c5963bc2b405c909184846040518463ffffffff1660e01b815260040161176893929190613420565b60006040518083038186803b15801561178057600080fd5b505af4158015611794573d6000803e3d6000fd5b50505050611815565b6117a882600061217d565b600a73d3a51862316ee870513186cdb79549d837d56c59634c60db9c9091846040518363ffffffff1660e01b81526004016117e4929190613457565b60006040518083038186803b1580156117fc57600080fd5b505af4158015611810573d6000803e3d6000fd5b505050505b61182082600161147e565b505b5050565b6000600e54905090565b611838611e09565b73ffffffffffffffffffffffffffffffffffffffff16611856611219565b73ffffffffffffffffffffffffffffffffffffffff16146118ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a39061308c565b60405180910390fd5b610e1081101580156118c15750620151808111155b611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f7906134f2565b60405180910390fd5b6011548103611944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193b90613584565b60405180910390fd5b601154817f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f60405160405180910390a38060118190555050565b611986611e09565b73ffffffffffffffffffffffffffffffffffffffff166119a4611219565b73ffffffffffffffffffffffffffffffffffffffff16146119fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f19061308c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6090613616565b60405180910390fd5b611a7281612248565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600080600080600080889750600a73d3a51862316ee870513186cdb79549d837d56c596317e142d190918a6040518363ffffffff1660e01b8152600401611ae4929190613209565b602060405180830381865af4158015611b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b259190613662565b96507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff955060008712611bca57600e54871115611b7857611b71600e54886125ae90919063ffffffff16565b9550611bc9565b6000600e54600a6000018054905011611b92576000611bb0565b611baf600e54600a6000018054905061230e90919063ffffffff16565b5b9050611bc5818961211b90919063ffffffff16565b9650505b5b611bd3886113b4565b9450611bde88610a3c565b9350601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054925060008311611c31576000611c47565b611c46601154846121ea90919063ffffffff16565b5b9150428211611c57576000611c6b565b611c6a428361230e90919063ffffffff16565b5b9050919395975091939597565b600080600080600a60000180549050905060008103611ca357600080600e5493509350935050611e02565b6000600e5490506000805a90506000805b8984108015611cc257508582105b15611de9578480611cd29061368f565b955050600a600001805490508510611ce957600094505b6000600a6000018681548110611d0257611d016136d7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611d77601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125f9565b15611d9c57611d8781600161147e565b15611d9b578180611d979061368f565b9250505b5b8280611da79061368f565b93505060005a905080851115611ddf57611ddc611dcd828761230e90919063ffffffff16565b876121ea90919063ffffffff16565b95505b8094505050611cb4565b84600e819055508181600e549850985098505050505050505b9193909250565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7790613778565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee69061380a565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611fcd9190612cbf565b60405180910390a3505050565b600061201b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201290613876565b60405180910390fd5b505050565b6000838311158290612068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205f9190612b7f565b60405180910390fd5b50600083856120779190613896565b9050809150509392505050565b600080830361209657600090506120f8565b600082846120a491906138ca565b90508284826120b391906131c2565b146120f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ea9061397e565b60405180910390fd5b809150505b92915050565b600080829050600081121561211257600080fd5b80915050919050565b600080828461212a919061399e565b90506000831215801561213d5750838112155b80612153575060008312801561215257508381125b5b61215c57600080fd5b8091505092915050565b60008082121561217557600080fd5b819050919050565b600061218883611143565b9050808211156121b95760006121a7828461230e90919063ffffffff16565b90506121b3848261262c565b506121e5565b808210156121e45760006121d6838361230e90919063ffffffff16565b90506121e284826126eb565b505b5b505050565b60008082846121f991906139e2565b90508381101561223e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223590613a62565b60405180910390fd5b8091505092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061235083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612020565b905092915050565b600080612364836113b4565b905060008111156125a3576123c181600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121ea90919063ffffffff16565b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d8260405161244a9190612cbf565b60405180910390a260007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b81526004016124af929190613a91565b6020604051808303816000875af11580156124ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f29190613acf565b9050806125995761254b82600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461230e90919063ffffffff16565b600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000925050506125a9565b81925050506125a9565b60009150505b919050565b60008082846125bd9190613afc565b9050600083121580156125d05750838113155b806125e657506000831280156125e557508381135b5b6125ef57600080fd5b8091505092915050565b60004282111561260c5760009050612627565b601154612622834261230e90919063ffffffff16565b101590505b919050565b61263682826127aa565b6126a46126566126518360065461208490919063ffffffff16565b6120fe565b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125ae90919063ffffffff16565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6126f5828261293d565b6127636127156127108360065461208490919063ffffffff16565b6120fe565b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461211b90919063ffffffff16565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281090613b8b565b60405180910390fd5b61282560008383612aea565b61283a816002546121ea90919063ffffffff16565b600281905550612891816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121ea90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516129319190612cbf565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a390613c1d565b60405180910390fd5b6129b882600083612aea565b612a2381604051806060016040528060228152602001613c3e602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120209092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a7a8160025461230e90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612ade9190612cbf565b60405180910390a35050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b29578082015181840152602081019050612b0e565b60008484015250505050565b6000601f19601f8301169050919050565b6000612b5182612aef565b612b5b8185612afa565b9350612b6b818560208601612b0b565b612b7481612b35565b840191505092915050565b60006020820190508181036000830152612b998184612b46565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bd182612ba6565b9050919050565b612be181612bc6565b8114612bec57600080fd5b50565b600081359050612bfe81612bd8565b92915050565b6000819050919050565b612c1781612c04565b8114612c2257600080fd5b50565b600081359050612c3481612c0e565b92915050565b60008060408385031215612c5157612c50612ba1565b5b6000612c5f85828601612bef565b9250506020612c7085828601612c25565b9150509250929050565b60008115159050919050565b612c8f81612c7a565b82525050565b6000602082019050612caa6000830184612c86565b92915050565b612cb981612c04565b82525050565b6000602082019050612cd46000830184612cb0565b92915050565b600060208284031215612cf057612cef612ba1565b5b6000612cfe84828501612c25565b91505092915050565b600060208284031215612d1d57612d1c612ba1565b5b6000612d2b84828501612bef565b91505092915050565b600080600060608486031215612d4d57612d4c612ba1565b5b6000612d5b86828701612bef565b9350506020612d6c86828701612bef565b9250506040612d7d86828701612c25565b9150509250925092565b600060ff82169050919050565b612d9d81612d87565b82525050565b6000602082019050612db86000830184612d94565b92915050565b612dc781612bc6565b82525050565b6000819050919050565b612de081612dcd565b82525050565b600061010082019050612dfc600083018b612dbe565b612e09602083018a612dd7565b612e166040830189612dd7565b612e236060830188612cb0565b612e306080830187612cb0565b612e3d60a0830186612cb0565b612e4a60c0830185612cb0565b612e5760e0830184612cb0565b9998505050505050505050565b6000602082019050612e796000830184612dbe565b92915050565b6000612e8a82612ba6565b9050919050565b612e9a81612e7f565b8114612ea557600080fd5b50565b600081359050612eb781612e91565b92915050565b612ec681612c7a565b8114612ed157600080fd5b50565b600081359050612ee381612ebd565b92915050565b60008060408385031215612f0057612eff612ba1565b5b6000612f0e85828601612ea8565b9250506020612f1f85828601612ed4565b9150509250929050565b60008060408385031215612f4057612f3f612ba1565b5b6000612f4e85828601612bef565b9250506020612f5f85828601612bef565b9150509250929050565b60008060408385031215612f8057612f7f612ba1565b5b6000612f8e85828601612ea8565b9250506020612f9f85828601612c25565b9150509250929050565b6000606082019050612fbe6000830186612cb0565b612fcb6020830185612cb0565b612fd86040830184612cb0565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061302757607f821691505b60208210810361303a57613039612fe0565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613076602083612afa565b915061308182613040565b602082019050919050565b600060208201905081810360008301526130a581613069565b9050919050565b7f4e6577206d696d696d756d2062616c616e636520666f72206469766964656e6460008201527f2063616e6e6f742062652073616d652061732063757272656e74206d696e696d60208201527f756d2062616c616e636500000000000000000000000000000000000000000000604082015250565b600061312e604a83612afa565b9150613139826130ac565b606082019050919050565b6000602082019050818103600083015261315d81613121565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006131cd82612c04565b91506131d883612c04565b9250826131e8576131e7613164565b5b828204905092915050565b8082525050565b61320381612bc6565b82525050565b600060408201905061321e60008301856131f3565b61322b60208301846131fa565b9392505050565b600060208201905061324760008301846131f3565b92915050565b60008151905061325c81612c0e565b92915050565b60006020828403121561327857613277612ba1565b5b60006132868482850161324d565b91505092915050565b61329881612c04565b82525050565b60006040820190506132b360008301856131f3565b6132c0602083018461328f565b9392505050565b6000815190506132d681612bd8565b92915050565b6000602082840312156132f2576132f1612ba1565b5b6000613300848285016132c7565b91505092915050565b7f77697468647261774469766964656e642064697361626c65642e20557365207460008201527f68652027636c61696d272066756e6374696f6e206f6e20746865206d61696e2060208201527f636f6e74726163742e0000000000000000000000000000000000000000000000604082015250565b600061338b604983612afa565b915061339682613309565b606082019050919050565b600060208201905081810360008301526133ba8161337e565b9050919050565b6000819050919050565b60006133e66133e16133dc84612ba6565b6133c1565b612ba6565b9050919050565b60006133f8826133cb565b9050919050565b600061340a826133ed565b9050919050565b61341a816133ff565b82525050565b600060608201905061343560008301866131f3565b6134426020830185613411565b61344f604083018461328f565b949350505050565b600060408201905061346c60008301856131f3565b6134796020830184613411565b9392505050565b7f636c61696d57616974206d757374206265207570646174656420746f2062657460008201527f7765656e203120616e6420323420686f75727300000000000000000000000000602082015250565b60006134dc603383612afa565b91506134e782613480565b604082019050919050565b6000602082019050818103600083015261350b816134cf565b9050919050565b7f43616e6e6f742075706461746520636c61696d5761697420746f2073616d652060008201527f76616c7565000000000000000000000000000000000000000000000000000000602082015250565b600061356e602583612afa565b915061357982613512565b604082019050919050565b6000602082019050818103600083015261359d81613561565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613600602683612afa565b915061360b826135a4565b604082019050919050565b6000602082019050818103600083015261362f816135f3565b9050919050565b61363f81612dcd565b811461364a57600080fd5b50565b60008151905061365c81613636565b92915050565b60006020828403121561367857613677612ba1565b5b60006136868482850161364d565b91505092915050565b600061369a82612c04565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036136cc576136cb613193565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613762602483612afa565b915061376d82613706565b604082019050919050565b6000602082019050818103600083015261379181613755565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006137f4602283612afa565b91506137ff82613798565b604082019050919050565b60006020820190508181036000830152613823816137e7565b9050919050565b7f4e6f207472616e736665727320616c6c6f776564000000000000000000000000600082015250565b6000613860601483612afa565b915061386b8261382a565b602082019050919050565b6000602082019050818103600083015261388f81613853565b9050919050565b60006138a182612c04565b91506138ac83612c04565b92508282039050818111156138c4576138c3613193565b5b92915050565b60006138d582612c04565b91506138e083612c04565b92508282026138ee81612c04565b9150828204841483151761390557613904613193565b5b5092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000613968602183612afa565b91506139738261390c565b604082019050919050565b600060208201905081810360008301526139978161395b565b9050919050565b60006139a982612dcd565b91506139b483612dcd565b9250828201905082811215600083121683821260008412151617156139dc576139db613193565b5b92915050565b60006139ed82612c04565b91506139f883612c04565b9250828201905080821115613a1057613a0f613193565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000613a4c601b83612afa565b9150613a5782613a16565b602082019050919050565b60006020820190508181036000830152613a7b81613a3f565b9050919050565b613a8b816133ff565b82525050565b6000604082019050613aa66000830185613a82565b613ab36020830184612cb0565b9392505050565b600081519050613ac981612ebd565b92915050565b600060208284031215613ae557613ae4612ba1565b5b6000613af384828501613aba565b91505092915050565b6000613b0782612dcd565b9150613b1283612dcd565b9250828203905081811260008412168282136000851215161715613b3957613b38613193565b5b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613b75601f83612afa565b9150613b8082613b3f565b602082019050919050565b60006020820190508181036000830152613ba481613b68565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613c07602183612afa565b9150613c1282613bab565b604082019050919050565b60006020820190508181036000830152613c3681613bfa565b905091905056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122041525a8391467eb5367ae6bc07ddc1fc17a09ca49a3df37e8d38db0f3578de0964736f6c63430008130033

Deployed Bytecode

0x6080604052600436106102b25760003560e01c806375f0a87411610175578063b94315ff116100dc578063e4f24cb011610095578063f27fd2541161006f578063f27fd25414610b06578063f2fde38b14610b4a578063f7c618c114610b73578063f9d0831a14610b9e576102b9565b8063e4f24cb014610a75578063e7841ec014610ab2578063e98030c714610add576102b9565b8063b94315ff14610963578063c02466681461098e578063dc4c7dbc146109b7578063dd62ed3e146109e2578063e2f4560514610a1f578063e4893fdc14610a4a576102b9565b8063a457c2d71161012e578063a457c2d714610802578063a8b9d2401461083f578063a9059cbb1461087c578063ad56c13c146108b9578063afa4f3b2146108fd578063b62496f514610926576102b9565b806375f0a874146107025780637a845ece1461072d5780638da5cb5b1461075657806395d89b41146107815780639c1b8af5146107ac578063a26579ad146107d7576102b9565b80633f249df0116102195780635fc2e596116101d25780635fc2e596146105f257806364b0f6531461061d5780636843cd8414610648578063700bb1911461068557806370a08231146106ae578063715018a6146106eb576102b9565b80633f249df0146104f457806348b3c6451461051d57806349bd5a5e146105485780634e71d92d146105735780634fbee1931461058a578063599ca397146105c7576102b9565b8063286b3aa01161026b578063286b3aa0146103e45780632c1f52161461040d57806330bb4cff14610438578063313ce5671461046357806331e79db01461048e57806339509351146104b7576102b9565b806306227683146102be57806306fdde03146102e9578063095ea7b3146103145780631694505e1461035157806318160ddd1461037c57806323b872dd146103a7576102b9565b366102b957005b600080fd5b3480156102ca57600080fd5b506102d3610bc7565b6040516102e09190613b56565b60405180910390f35b3480156102f557600080fd5b506102fe610bef565b60405161030b9190613c01565b60405180910390f35b34801561032057600080fd5b5061033b60048036038101906103369190613cb2565b610c81565b6040516103489190613d0d565b60405180910390f35b34801561035d57600080fd5b50610366610c9f565b6040516103739190613d87565b60405180910390f35b34801561038857600080fd5b50610391610cc5565b60405161039e9190613b56565b60405180910390f35b3480156103b357600080fd5b506103ce60048036038101906103c99190613da2565b610ccf565b6040516103db9190613d0d565b60405180910390f35b3480156103f057600080fd5b5061040b60048036038101906104069190613df5565b610da8565b005b34801561041957600080fd5b50610422610eb4565b60405161042f9190613e43565b60405180910390f35b34801561044457600080fd5b5061044d610eda565b60405161045a9190613b56565b60405180910390f35b34801561046f57600080fd5b50610478610f72565b6040516104859190613e7a565b60405180910390f35b34801561049a57600080fd5b506104b560048036038101906104b09190613e95565b610f7b565b005b3480156104c357600080fd5b506104de60048036038101906104d99190613cb2565b611087565b6040516104eb9190613d0d565b60405180910390f35b34801561050057600080fd5b5061051b60048036038101906105169190613e95565b61113a565b005b34801561052957600080fd5b5061053261125b565b60405161053f9190613b56565b60405180910390f35b34801561055457600080fd5b5061055d611261565b60405161056a9190613ed1565b60405180910390f35b34801561057f57600080fd5b50610588611287565b005b34801561059657600080fd5b506105b160048036038101906105ac9190613e95565b61132b565b6040516105be9190613d0d565b60405180910390f35b3480156105d357600080fd5b506105dc611381565b6040516105e99190613b56565b60405180910390f35b3480156105fe57600080fd5b50610607611387565b6040516106149190613b56565b60405180910390f35b34801561062957600080fd5b5061063261138d565b60405161063f9190613b56565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a9190613e95565b611425565b60405161067c9190613b56565b60405180910390f35b34801561069157600080fd5b506106ac60048036038101906106a79190613df5565b6114ca565b005b3480156106ba57600080fd5b506106d560048036038101906106d09190613e95565b6115d1565b6040516106e29190613b56565b60405180910390f35b3480156106f757600080fd5b50610700611619565b005b34801561070e57600080fd5b506107176116a1565b6040516107249190613ed1565b60405180910390f35b34801561073957600080fd5b50610754600480360381019061074f9190613df5565b6116c7565b005b34801561076257600080fd5b5061076b61174d565b6040516107789190613ed1565b60405180910390f35b34801561078d57600080fd5b50610796611777565b6040516107a39190613c01565b60405180910390f35b3480156107b857600080fd5b506107c1611809565b6040516107ce9190613b56565b60405180910390f35b3480156107e357600080fd5b506107ec61180f565b6040516107f99190613b56565b60405180910390f35b34801561080e57600080fd5b5061082960048036038101906108249190613cb2565b6118a7565b6040516108369190613d0d565b60405180910390f35b34801561084b57600080fd5b5061086660048036038101906108619190613e95565b611974565b6040516108739190613b56565b60405180910390f35b34801561088857600080fd5b506108a3600480360381019061089e9190613cb2565b611a19565b6040516108b09190613d0d565b60405180910390f35b3480156108c557600080fd5b506108e060048036038101906108db9190613e95565b611a37565b6040516108f4989796959493929190613f05565b60405180910390f35b34801561090957600080fd5b50610924600480360381019061091f9190613df5565b611afb565b005b34801561093257600080fd5b5061094d60048036038101906109489190613e95565b611bd8565b60405161095a9190613d0d565b60405180910390f35b34801561096f57600080fd5b50610978611bf8565b6040516109859190613b56565b60405180910390f35b34801561099a57600080fd5b506109b560048036038101906109b09190613faf565b611bfe565b005b3480156109c357600080fd5b506109cc611db5565b6040516109d99190613b56565b60405180910390f35b3480156109ee57600080fd5b50610a096004803603810190610a049190613fef565b611dbb565b604051610a169190613b56565b60405180910390f35b348015610a2b57600080fd5b50610a34611e42565b604051610a419190613b56565b60405180910390f35b348015610a5657600080fd5b50610a5f611e48565b604051610a6c9190613b56565b60405180910390f35b348015610a8157600080fd5b50610a9c6004803603810190610a979190613e95565b611e4e565b604051610aa99190613b56565b60405180910390f35b348015610abe57600080fd5b50610ac7611ef3565b604051610ad49190613b56565b60405180910390f35b348015610ae957600080fd5b50610b046004803603810190610aff9190613df5565b611f8b565b005b348015610b1257600080fd5b50610b2d6004803603810190610b289190613df5565b6120eb565b604051610b41989796959493929190613f05565b60405180910390f35b348015610b5657600080fd5b50610b716004803603810190610b6c9190613e95565b6121af565b005b348015610b7f57600080fd5b50610b886122a6565b604051610b959190613ed1565b60405180910390f35b348015610baa57600080fd5b50610bc56004803603810190610bc09190613e95565b6122ca565b005b60006064601254610bd6610cc5565b610be0919061405e565b610bea91906140cf565b905090565b606060038054610bfe9061412f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2a9061412f565b8015610c775780601f10610c4c57610100808354040283529160200191610c77565b820191906000526020600020905b815481529060010190602001808311610c5a57829003601f168201915b5050505050905090565b6000610c95610c8e61253c565b8484612544565b6001905092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b6000610cdc84848461270d565b610d9d84610ce861253c565b610d9885604051806060016040528060288152602001614e4c60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610d4e61253c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131c59092919063ffffffff16565b612544565b600190509392505050565b610db061253c565b73ffffffffffffffffffffffffffffffffffffffff16610dce61174d565b73ffffffffffffffffffffffffffffffffffffffff1614610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b906141ac565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663286b3aa0826040518263ffffffff1660e01b8152600401610e7f9190613b56565b600060405180830381600087803b158015610e9957600080fd5b505af1158015610ead573d6000803e3d6000fd5b5050505050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166385a6b3ae6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6d91906141e1565b905090565b60006009905090565b610f8361253c565b73ffffffffffffffffffffffffffffffffffffffff16610fa161174d565b73ffffffffffffffffffffffffffffffffffffffff1614610ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fee906141ac565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b81526004016110529190613ed1565b600060405180830381600087803b15801561106c57600080fd5b505af1158015611080573d6000803e3d6000fd5b5050505050565b600061113061109461253c565b8461112b85600160006110a561253c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461322990919063ffffffff16565b612544565b6001905092915050565b61114261253c565b73ffffffffffffffffffffffffffffffffffffffff1661116061174d565b73ffffffffffffffffffffffffffffffffffffffff16146111b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ad906141ac565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc4c4b378260006040518363ffffffff1660e01b815260040161121492919061422f565b6020604051808303816000875af1158015611233573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611257919061426d565b5050565b60155481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc4c4b373360006040518363ffffffff1660e01b81526004016112e592919061422f565b6020604051808303816000875af1158015611304573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611328919061426d565b50565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60125481565b60065481565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166309bbedde6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142091906141e1565b905090565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016114829190613ed1565b602060405180830381865afa15801561149f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c391906141e1565b9050919050565b6000806000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479856040518263ffffffff1660e01b815260040161152a9190613b56565b6060604051808303816000875af1158015611549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156d919061429a565b9250925092503273ffffffffffffffffffffffffffffffffffffffff16600015157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98858585896040516115c394939291906142ed565b60405180910390a350505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61162161253c565b73ffffffffffffffffffffffffffffffffffffffff1661163f61174d565b73ffffffffffffffffffffffffffffffffffffffff1614611695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168c906141ac565b60405180910390fd5b61169f6000613287565b565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6116cf61253c565b73ffffffffffffffffffffffffffffffffffffffff166116ed61174d565b73ffffffffffffffffffffffffffffffffffffffff1614611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a906141ac565b60405180910390fd5b8060128190555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546117869061412f565b80601f01602080910402602001604051908101604052809291908181526020018280546117b29061412f565b80156117ff5780601f106117d4576101008083540402835291602001916117ff565b820191906000526020600020905b8154815290600101906020018083116117e257829003601f168201915b5050505050905090565b60145481565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636f2789ec6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561187e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a291906141e1565b905090565b600061196a6118b461253c565b8461196585604051806060016040528060258152602001614e7460259139600160006118de61253c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131c59092919063ffffffff16565b612544565b6001905092915050565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a8b9d240836040518263ffffffff1660e01b81526004016119d19190613ed1565b602060405180830381865afa1580156119ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1291906141e1565b9050919050565b6000611a2d611a2661253c565b848461270d565b6001905092915050565b600080600080600080600080601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fbcbc0f18a6040518263ffffffff1660e01b8152600401611a9e9190613ed1565b61010060405180830381865afa158015611abc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae09190614373565b97509750975097509750975097509750919395975091939597565b611b0361253c565b73ffffffffffffffffffffffffffffffffffffffff16611b2161174d565b73ffffffffffffffffffffffffffffffffffffffff1614611b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6e906141ac565b60405180910390fd5b620186a0611b83610cc5565b611b8d91906140cf565b8111611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc59061449b565b60405180910390fd5b80600f8190555050565b60116020528060005260406000206000915054906101000a900460ff1681565b600a5481565b611c0661253c565b73ffffffffffffffffffffffffffffffffffffffff16611c2461174d565b73ffffffffffffffffffffffffffffffffffffffff1614611c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c71906141ac565b60405180910390fd5b801515601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503611d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d039061452d565b60405180910390fd5b80601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611da99190613d0d565b60405180910390a25050565b60095481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600f5481565b60075481565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ce0147836040518263ffffffff1660e01b8152600401611eab9190613ed1565b602060405180830381865afa158015611ec8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eec91906141e1565b9050919050565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e7841ec06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8691906141e1565b905090565b611f9361253c565b73ffffffffffffffffffffffffffffffffffffffff16611fb161174d565b73ffffffffffffffffffffffffffffffffffffffff1614612007576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffe906141ac565b60405180910390fd5b610e10811015801561201c5750620151808111155b61205b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612052906145bf565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e98030c7826040518263ffffffff1660e01b81526004016120b69190613b56565b600060405180830381600087803b1580156120d057600080fd5b505af11580156120e4573d6000803e3d6000fd5b5050505050565b600080600080600080600080601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635183d6fd8a6040518263ffffffff1660e01b81526004016121529190613b56565b61010060405180830381865afa158015612170573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121949190614373565b97509750975097509750975097509750919395975091939597565b6121b761253c565b73ffffffffffffffffffffffffffffffffffffffff166121d561174d565b73ffffffffffffffffffffffffffffffffffffffff161461222b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612222906141ac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361229a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229190614651565b60405180910390fd5b6122a381613287565b50565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b6122d261253c565b73ffffffffffffffffffffffffffffffffffffffff166122f061174d565b73ffffffffffffffffffffffffffffffffffffffff1614612346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233d906141ac565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ab906146bd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612434573373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561242e573d6000803e3d6000fd5b50612539565b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124749190613ed1565b602060405180830381865afa158015612491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b591906141e1565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016124f29291906146dd565b6020604051808303816000875af1158015612511573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612535919061426d565b5050505b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036125b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125aa90614778565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612622576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126199061480a565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516127009190613b56565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361277c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127739061489c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036127eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e29061492e565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156128755750600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156128fd576000612885836115d1565b905060006064601254612896610cc5565b6128a0919061405e565b6128aa91906140cf565b90508083836128b9919061494e565b11156128fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f1906149ce565b60405180910390fd5b50505b60008103612916576129118383600061334d565b6131c0565b6000612921306115d1565b90506000600f5482101590508080156129475750600e60149054906101000a900460ff16155b801561299c5750601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80156129b757506000600b546008546129b5919061494e565b115b15612d56576001600e60146101000a81548160ff0219169083151502179055506000600a546007546129e9919061494e565b6009546006546129f9919061494e565b612a03919061494e565b9050600083118015612a155750600081115b15612d395760004790506000600267ffffffffffffffff811115612a3c57612a3b6149ee565b5b604051908082528060200260200182016040528015612a6a5781602001602082028036833780820191505090505b5090503081600081518110612a8257612a81614a1d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4d9190614a4c565b81600181518110612b6157612b60614a1d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478660008430426040518663ffffffff1660e01b8152600401612bff959493929190614b72565b600060405180830381600087803b158015612c1957600080fd5b505af1158015612c2d573d6000803e3d6000fd5b5050505060008247612c3f9190614bcc565b90506000600954600654612c53919061494e565b1115612ce857600084600954600654612c6c919061494e565b83612c77919061405e565b612c8191906140cf565b9050612caf600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826135e0565b7fddce3d5e4f18a9c2902704a38b56baadd81a9af59b8ded8a3220b6a6c1696b6b81604051612cde9190613b56565b60405180910390a1505b6000600a54600754612cfa919061494e565b1115612d3557600084600a54600754612d13919061494e565b83612d1e919061405e565b612d2891906140cf565b9050612d33816136d4565b505b5050505b6000600e60146101000a81548160ff021916908315150217905550505b6000600e60149054906101000a900460ff16159050601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612e0c5750601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612e1657600090505b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612ec25750600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612ecb5750805b15612ed557600090505b8015612f7a576000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603612f3c576008549050612f42565b600b5490505b600060648287612f52919061405e565b612f5c91906140cf565b90508086612f6a9190614bcc565b9550612f7788308361334d565b50505b612f8586868661334d565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc87612fcd896115d1565b6040518363ffffffff1660e01b8152600401612fea929190614c00565b600060405180830381600087803b15801561300457600080fd5b505af1925050508015613015575060015b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc8661305e886115d1565b6040518363ffffffff1660e01b815260040161307b929190614c00565b600060405180830381600087803b15801561309557600080fd5b505af19250505080156130a6575060015b50600e60149054906101000a900460ff166131bc5760006014549050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479826040518263ffffffff1660e01b815260040161311d9190613b56565b6060604051808303816000875af192505050801561315957506040513d601f19601f82011682018060405250810190613156919061429a565b60015b156131ba573273ffffffffffffffffffffffffffffffffffffffff16600115157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98858585896040516131ae94939291906142ed565b60405180910390a35050505b505b5050505b505050565b600083831115829061320d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132049190613c01565b60405180910390fd5b506000838561321c9190614bcc565b9050809150509392505050565b6000808284613238919061494e565b90508381101561327d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327490614c75565b60405180910390fd5b8091505092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036133bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b39061489c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361342b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134229061492e565b60405180910390fd5b613436838383613b38565b6134a181604051806060016040528060268152602001614e26602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131c59092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613534816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461322990919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516135d39190613b56565b60405180910390a3505050565b80471015613623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361a90614ce1565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161364990614d32565b60006040518083038185875af1925050503d8060008114613686576040519150601f19603f3d011682016040523d82523d6000602084013e61368b565b606091505b50509050806136cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136c690614db9565b60405180910390fd5b505050565b6000600267ffffffffffffffff8111156136f1576136f06149ee565b5b60405190808252806020026020018201604052801561371f5781602001602082028036833780820191505090505b509050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561378f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137b39190614a4c565b816000815181106137c7576137c6614a1d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488160018151811061383657613835614a1d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de958360008430426040518663ffffffff1660e01b81526004016138d39493929190614dd9565b6000604051808303818588803b1580156138ec57600080fd5b505af1158015613900573d6000803e3d6000fd5b505050505060007f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016139609190613ed1565b602060405180830381865afa15801561397d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139a191906141e1565b905060007f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401613a229291906146dd565b6020604051808303816000875af1158015613a41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a65919061426d565b90508015613b3257601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633243c791836040518263ffffffff1660e01b8152600401613ac89190613b56565b600060405180830381600087803b158015613ae257600080fd5b505af1158015613af6573d6000803e3d6000fd5b505050507fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b182604051613b299190613b56565b60405180910390a15b50505050565b505050565b6000819050919050565b613b5081613b3d565b82525050565b6000602082019050613b6b6000830184613b47565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613bab578082015181840152602081019050613b90565b60008484015250505050565b6000601f19601f8301169050919050565b6000613bd382613b71565b613bdd8185613b7c565b9350613bed818560208601613b8d565b613bf681613bb7565b840191505092915050565b60006020820190508181036000830152613c1b8184613bc8565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c5382613c28565b9050919050565b613c6381613c48565b8114613c6e57600080fd5b50565b600081359050613c8081613c5a565b92915050565b613c8f81613b3d565b8114613c9a57600080fd5b50565b600081359050613cac81613c86565b92915050565b60008060408385031215613cc957613cc8613c23565b5b6000613cd785828601613c71565b9250506020613ce885828601613c9d565b9150509250929050565b60008115159050919050565b613d0781613cf2565b82525050565b6000602082019050613d226000830184613cfe565b92915050565b6000819050919050565b6000613d4d613d48613d4384613c28565b613d28565b613c28565b9050919050565b6000613d5f82613d32565b9050919050565b6000613d7182613d54565b9050919050565b613d8181613d66565b82525050565b6000602082019050613d9c6000830184613d78565b92915050565b600080600060608486031215613dbb57613dba613c23565b5b6000613dc986828701613c71565b9350506020613dda86828701613c71565b9250506040613deb86828701613c9d565b9150509250925092565b600060208284031215613e0b57613e0a613c23565b5b6000613e1984828501613c9d565b91505092915050565b6000613e2d82613d54565b9050919050565b613e3d81613e22565b82525050565b6000602082019050613e586000830184613e34565b92915050565b600060ff82169050919050565b613e7481613e5e565b82525050565b6000602082019050613e8f6000830184613e6b565b92915050565b600060208284031215613eab57613eaa613c23565b5b6000613eb984828501613c71565b91505092915050565b613ecb81613c48565b82525050565b6000602082019050613ee66000830184613ec2565b92915050565b6000819050919050565b613eff81613eec565b82525050565b600061010082019050613f1b600083018b613ec2565b613f28602083018a613ef6565b613f356040830189613ef6565b613f426060830188613b47565b613f4f6080830187613b47565b613f5c60a0830186613b47565b613f6960c0830185613b47565b613f7660e0830184613b47565b9998505050505050505050565b613f8c81613cf2565b8114613f9757600080fd5b50565b600081359050613fa981613f83565b92915050565b60008060408385031215613fc657613fc5613c23565b5b6000613fd485828601613c71565b9250506020613fe585828601613f9a565b9150509250929050565b6000806040838503121561400657614005613c23565b5b600061401485828601613c71565b925050602061402585828601613c71565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061406982613b3d565b915061407483613b3d565b925082820261408281613b3d565b915082820484148315176140995761409861402f565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006140da82613b3d565b91506140e583613b3d565b9250826140f5576140f46140a0565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061414757607f821691505b60208210810361415a57614159614100565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614196602083613b7c565b91506141a182614160565b602082019050919050565b600060208201905081810360008301526141c581614189565b9050919050565b6000815190506141db81613c86565b92915050565b6000602082840312156141f7576141f6613c23565b5b6000614205848285016141cc565b91505092915050565b600061421982613c28565b9050919050565b6142298161420e565b82525050565b60006040820190506142446000830185614220565b6142516020830184613cfe565b9392505050565b60008151905061426781613f83565b92915050565b60006020828403121561428357614282613c23565b5b600061429184828501614258565b91505092915050565b6000806000606084860312156142b3576142b2613c23565b5b60006142c1868287016141cc565b93505060206142d2868287016141cc565b92505060406142e3868287016141cc565b9150509250925092565b60006080820190506143026000830187613b47565b61430f6020830186613b47565b61431c6040830185613b47565b6143296060830184613b47565b95945050505050565b60008151905061434181613c5a565b92915050565b61435081613eec565b811461435b57600080fd5b50565b60008151905061436d81614347565b92915050565b600080600080600080600080610100898b03121561439457614393613c23565b5b60006143a28b828c01614332565b98505060206143b38b828c0161435e565b97505060406143c48b828c0161435e565b96505060606143d58b828c016141cc565b95505060806143e68b828c016141cc565b94505060a06143f78b828c016141cc565b93505060c06144088b828c016141cc565b92505060e06144198b828c016141cc565b9150509295985092959890939650565b7f53776170546f6b656e734174416d6f756e74206d75737420626520677265617460008201527f6572207468616e20302e30303125206f6620746f74616c20737570706c790000602082015250565b6000614485603e83613b7c565b915061449082614429565b604082019050919050565b600060208201905081810360008301526144b481614478565b9050919050565b7f4163636f756e7420697320616c72656164792073657420746f2074686174207360008201527f7461746500000000000000000000000000000000000000000000000000000000602082015250565b6000614517602483613b7c565b9150614522826144bb565b604082019050919050565b600060208201905081810360008301526145468161450a565b9050919050565b7f636c61696d57616974206d757374206265207570646174656420746f2062657460008201527f7765656e203120616e6420323420686f75727300000000000000000000000000602082015250565b60006145a9603383613b7c565b91506145b48261454d565b604082019050919050565b600060208201905081810360008301526145d88161459c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061463b602683613b7c565b9150614646826145df565b604082019050919050565b6000602082019050818103600083015261466a8161462e565b9050919050565b7f4f776e65722063616e6e6f7420636c61696d206e617469766520746f6b656e73600082015250565b60006146a7602083613b7c565b91506146b282614671565b602082019050919050565b600060208201905081810360008301526146d68161469a565b9050919050565b60006040820190506146f26000830185613ec2565b6146ff6020830184613b47565b9392505050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614762602483613b7c565b915061476d82614706565b604082019050919050565b6000602082019050818103600083015261479181614755565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006147f4602283613b7c565b91506147ff82614798565b604082019050919050565b60006020820190508181036000830152614823816147e7565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614886602583613b7c565b91506148918261482a565b604082019050919050565b600060208201905081810360008301526148b581614879565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614918602383613b7c565b9150614923826148bc565b604082019050919050565b600060208201905081810360008301526149478161490b565b9050919050565b600061495982613b3d565b915061496483613b3d565b925082820190508082111561497c5761497b61402f565b5b92915050565b7f57616c6c6574206c696d69746174696f6e206578636565646564000000000000600082015250565b60006149b8601a83613b7c565b91506149c382614982565b602082019050919050565b600060208201905081810360008301526149e7816149ab565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215614a6257614a61613c23565b5b6000614a7084828501614332565b91505092915050565b6000819050919050565b6000614a9e614a99614a9484614a79565b613d28565b613b3d565b9050919050565b614aae81614a83565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614ae981613c48565b82525050565b6000614afb8383614ae0565b60208301905092915050565b6000602082019050919050565b6000614b1f82614ab4565b614b298185614abf565b9350614b3483614ad0565b8060005b83811015614b65578151614b4c8882614aef565b9750614b5783614b07565b925050600181019050614b38565b5085935050505092915050565b600060a082019050614b876000830188613b47565b614b946020830187614aa5565b8181036040830152614ba68186614b14565b9050614bb56060830185613ec2565b614bc26080830184613b47565b9695505050505050565b6000614bd782613b3d565b9150614be283613b3d565b9250828203905081811115614bfa57614bf961402f565b5b92915050565b6000604082019050614c156000830185614220565b614c226020830184613b47565b9392505050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614c5f601b83613b7c565b9150614c6a82614c29565b602082019050919050565b60006020820190508181036000830152614c8e81614c52565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614ccb601d83613b7c565b9150614cd682614c95565b602082019050919050565b60006020820190508181036000830152614cfa81614cbe565b9050919050565b600081905092915050565b50565b6000614d1c600083614d01565b9150614d2782614d0c565b600082019050919050565b6000614d3d82614d0f565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614da3603a83613b7c565b9150614dae82614d47565b604082019050919050565b60006020820190508181036000830152614dd281614d96565b9050919050565b6000608082019050614dee6000830187614aa5565b8181036020830152614e008186614b14565b9050614e0f6040830185613ec2565b614e1c6060830184613b47565b9594505050505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a04286a99c3fcb16309001c2e2f866ebd81611834a8c41cdbcd6bd6276cba81264736f6c63430008130033

Libraries Used


Deployed Bytecode Sourcemap

31397:13467:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35111:129;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15475:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16388:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31718:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15795:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16565:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44584:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32134:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42507:141;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15695:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43118:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16928:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44307:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32272:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31766:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44196:103;;;;;;;;;;;;;:::i;:::-;;37316:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32091:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31448:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44720:141;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42815:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43917:271;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15911:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2590:103;;;;;;;;;;;;;:::i;:::-;;31679:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34981:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2367:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15583:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32222:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42391:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17154:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42656:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16046:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43255:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;41885:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32024:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31602:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37022:286;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31562:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16229:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31922:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31487:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42962:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44447:129;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42131:252;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43581:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;2701:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32179:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35720:441;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35111:129;35162:7;35229:3;35206:19;;35190:13;:11;:13::i;:::-;:35;;;;:::i;:::-;35189:43;;;;:::i;:::-;35182:50;;35111:129;:::o;15475:100::-;15529:13;15562:5;15555:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15475:100;:::o;16388:169::-;16471:4;16488:39;16497:12;:10;:12::i;:::-;16511:7;16520:6;16488:8;:39::i;:::-;16545:4;16538:11;;16388:169;;;;:::o;31718:41::-;;;;;;;;;;;;;:::o;15795:108::-;15856:7;15883:12;;15876:19;;15795:108;:::o;16565:355::-;16705:4;16722:36;16732:6;16740:9;16751:6;16722:9;:36::i;:::-;16769:121;16778:6;16786:12;:10;:12::i;:::-;16800:89;16838:6;16800:89;;;;;;;;;;;;;;;;;:11;:19;16812:6;16800:19;;;;;;;;;;;;;;;:33;16820:12;:10;:12::i;:::-;16800:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;16769:8;:121::i;:::-;16908:4;16901:11;;16565:355;;;;;:::o;44584:128::-;2513:12;:10;:12::i;:::-;2502:23;;:7;:5;:7::i;:::-;:23;;;2494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44660:15:::1;;;;;;;;;;;:37;;;44698:5;44660:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44584:128:::0;:::o;32134:38::-;;;;;;;;;;;;;:::o;42507:141::-;42570:7;42597:15;;;;;;;;;;;:41;;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42590:50;;42507:141;:::o;15695:92::-;15753:5;15778:1;15771:8;;15695:92;:::o;43118:129::-;2513:12;:10;:12::i;:::-;2502:23;;:7;:5;:7::i;:::-;:23;;;2494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43194:15:::1;;;;;;;;;;;:36;;;43231:7;43194:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43118:129:::0;:::o;16928:218::-;17016:4;17033:83;17042:12;:10;:12::i;:::-;17056:7;17065:50;17104:10;17065:11;:25;17077:12;:10;:12::i;:::-;17065:25;;;;;;;;;;;;;;;:34;17091:7;17065:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;17033:8;:83::i;:::-;17134:4;17127:11;;16928:218;;;;:::o;44307:132::-;2513:12;:10;:12::i;:::-;2502:23;;:7;:5;:7::i;:::-;:23;;;2494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44376:15:::1;;;;;;;;;;;:30;;;44415:7;44425:5;44376:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44307:132:::0;:::o;32272:41::-;;;;:::o;31766:29::-;;;;;;;;;;;;;:::o;44196:103::-;44233:15;;;;;;;;;;;:30;;;44272:10;44285:5;44233:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44196:103::o;37316:125::-;37381:4;37405:19;:28;37425:7;37405:28;;;;;;;;;;;;;;;;;;;;;;;;;37398:35;;37316:125;;;:::o;32091:34::-;;;;:::o;31448:32::-;;;;:::o;44720:141::-;44785:7;44812:15;;;;;;;;;;;:39;;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44805:48;;44720:141;:::o;42815:139::-;42885:7;42912:15;;;;;;;;;;;:25;;;42938:7;42912:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42905:41;;42815:139;;;:::o;43917:271::-;43983:18;44003:14;44019:26;44049:15;;;;;;;;;;;:23;;;44073:3;44049:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43982:95;;;;;;44170:9;44093:87;;44158:5;44093:87;;;44118:10;44130:6;44138:18;44165:3;44093:87;;;;;;;;;:::i;:::-;;;;;;;;43971:217;;;43917:271;:::o;15911:127::-;15985:7;16012:9;:18;16022:7;16012:18;;;;;;;;;;;;;;;;16005:25;;15911:127;;;:::o;2590:103::-;2513:12;:10;:12::i;:::-;2502:23;;:7;:5;:7::i;:::-;:23;;;2494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2655:30:::1;2682:1;2655:18;:30::i;:::-;2590:103::o:0;31679:30::-;;;;;;;;;;;;;:::o;34981:122::-;2513:12;:10;:12::i;:::-;2502:23;;:7;:5;:7::i;:::-;:23;;;2494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35085:10:::1;35063:19;:32;;;;34981:122:::0;:::o;2367:87::-;2413:7;2440:6;;;;;;;;;;;2433:13;;2367:87;:::o;15583:104::-;15639:13;15672:7;15665:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15583:104;:::o;32222:41::-;;;;:::o;42391:108::-;42437:7;42464:15;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42457:34;;42391:108;:::o;17154:269::-;17247:4;17264:129;17273:12;:10;:12::i;:::-;17287:7;17296:96;17335:15;17296:96;;;;;;;;;;;;;;;;;:11;:25;17308:12;:10;:12::i;:::-;17296:25;;;;;;;;;;;;;;;:34;17322:7;17296:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;17264:8;:129::i;:::-;17411:4;17404:11;;17154:269;;;;:::o;42656:151::-;42725:7;42752:15;;;;;;;;;;;:38;;;42791:7;42752:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42745:54;;42656:151;;;:::o;16046:175::-;16132:4;16149:42;16159:12;:10;:12::i;:::-;16173:9;16184:6;16149:9;:42::i;:::-;16209:4;16202:11;;16046:175;;;;:::o;43255:318::-;43351:7;43373:6;43394;43415:7;43437;43459;43481;43503;43530:15;;;;;;;;;;;:26;;;43557:7;43530:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43523:42;;;;;;;;;;;;;;;;43255:318;;;;;;;;;:::o;41885:238::-;2513:12;:10;:12::i;:::-;2502:23;;:7;:5;:7::i;:::-;:23;;;2494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42000:7:::1;41984:13;:11;:13::i;:::-;:23;;;;:::i;:::-;41972:9;:35;41964:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;42106:9;42085:18;:30;;;;41885:238:::0;:::o;32024:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;31602:31::-;;;;:::o;37022:286::-;2513:12;:10;:12::i;:::-;2502:23;;:7;:5;:7::i;:::-;:23;;;2494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37149:8:::1;37117:40;;:19;:28;37137:7;37117:28;;;;;;;;;;;;;;;;;;;;;;;;;:40;;::::0;37109:89:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;37240:8;37209:19;:28;37229:7;37209:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;37282:7;37266:34;;;37291:8;37266:34;;;;;;:::i;:::-;;;;;;;;37022:286:::0;;:::o;31562:33::-;;;;:::o;16229:151::-;16318:7;16345:11;:18;16357:5;16345:18;;;;;;;;;;;;;;;:27;16364:7;16345:27;;;;;;;;;;;;;;;;16338:34;;16229:151;;;;:::o;31922:33::-;;;;:::o;31487:30::-;;;;:::o;42962:148::-;43028:7;43055:15;;;;;;;;;;;:38;;;43094:7;43055:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43048:54;;42962:148;;;:::o;44447:129::-;44502:7;44529:15;;;;;;;;;;;:37;;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44522:46;;44447:129;:::o;42131:252::-;2513:12;:10;:12::i;:::-;2502:23;;:7;:5;:7::i;:::-;:23;;;2494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42232:5:::1;42216:12;:21;;:47;;;;;42257:6;42241:12;:22;;42216:47;42208:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;42330:15;;;;;;;;;;;:31;;;42362:12;42330:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42131:252:::0;:::o;43581:328::-;43682:7;43704:6;43725;43746:7;43768;43790;43812;43834;43861:15;;;;;;;;;;;:33;;;43895:5;43861:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43854:47;;;;;;;;;;;;;;;;43581:328;;;;;;;;;:::o;2701:201::-;2513:12;:10;:12::i;:::-;2502:23;;:7;:5;:7::i;:::-;:23;;;2494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2810:1:::1;2790:22;;:8;:22;;::::0;2782:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2866:28;2885:8;2866:18;:28::i;:::-;2701:201:::0;:::o;32179:36::-;;;:::o;35720:441::-;2513:12;:10;:12::i;:::-;2502:23;;:7;:5;:7::i;:::-;:23;;;2494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35816:4:::1;35799:22;;:5;:22;;::::0;35791:67:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;35890:3;35873:21;;:5;:21;;::::0;35869:126:::1;;35919:10;35911:28;;:51;35940:21;35911:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;35977:7;;35869:126;36005:17;36032:5;36005:33;;36049:15;36067:10;:20;;;36096:4;36067:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36049:53;;36113:10;:19;;;36133:10;36145:7;36113:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35780:381;;2573:1;35720:441:::0;:::o;1913:98::-;1966:7;1993:10;1986:17;;1913:98;:::o;18812:378::-;18965:1;18948:19;;:5;:19;;;18940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19046:1;19027:21;;:7;:21;;;19019:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19128:6;19098:11;:18;19110:5;19098:18;;;;;;;;;;;;;;;:27;19117:7;19098:27;;;;;;;;;;;;;;;:36;;;;19166:7;19150:32;;19159:5;19150:32;;;19175:6;19150:32;;;;;;:::i;:::-;;;;;;;;18812:378;;;:::o;37449:3681::-;37597:1;37581:18;;:4;:18;;;37573:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37674:1;37660:16;;:2;:16;;;37652:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;37747:4;37733:19;;:2;:19;;;;:42;;;;;37762:13;;;;;;;;;;;37756:19;;:2;:19;;;;37733:42;37729:279;;;37792:21;37816:13;37826:2;37816:9;:13::i;:::-;37792:37;;37844:18;37903:3;37881:19;;37865:13;:11;:13::i;:::-;:35;;;;:::i;:::-;:41;;;;:::i;:::-;37844:62;;37955:10;37945:6;37929:13;:22;;;;:::i;:::-;:36;;37921:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;37777:231;;37729:279;38041:1;38031:6;:11;38028:92;;38059:28;38075:4;38081:2;38085:1;38059:15;:28::i;:::-;38102:7;;38028:92;38132:28;38163:24;38181:4;38163:9;:24::i;:::-;38132:55;;38200:12;38239:18;;38215:20;:42;;38200:57;;38274:7;:33;;;;;38299:8;;;;;;;;;;;38298:9;38274:33;:79;;;;;38324:25;:29;38350:2;38324:29;;;;;;;;;;;;;;;;;;;;;;;;;38274:79;:126;;;;;38399:1;38384:12;;38370:11;;:26;;;;:::i;:::-;:30;38274:126;38270:1570;;;38438:4;38427:8;;:15;;;;;;;;;;;;;;;;;;38471:16;38552;;38534:15;;:34;;;;:::i;:::-;38511:18;;38491:17;;:38;;;;:::i;:::-;38490:79;;;;:::i;:::-;38471:98;;38624:1;38601:20;:24;:40;;;;;38640:1;38629:8;:12;38601:40;38598:1198;;;38662:22;38687:21;38662:46;;38729:21;38767:1;38753:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38729:40;;38806:4;38788;38793:1;38788:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;38840:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38830:4;38835:1;38830:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;38883:15;;;;;;;;;;;:66;;;38972:20;39015:1;39039:4;39074;39102:15;38883:235;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39155:18;39200:14;39176:21;:38;;;;:::i;:::-;39155:59;;39281:1;39259:18;;39239:17;;:38;;;;:::i;:::-;39238:44;39235:304;;;39307:20;39386:8;39364:18;;39344:17;;:38;;;;:::i;:::-;39330:10;:53;;;;:::i;:::-;:64;;;;:::i;:::-;39307:87;;39417:47;39433:15;;;;;;;;;;;39451:12;39417:7;:47::i;:::-;39492:27;39506:12;39492:27;;;;;;:::i;:::-;;;;;;;;39284:255;39235:304;39601:1;39581:16;;39563:15;;:34;;;;:::i;:::-;39562:40;39559:222;;;39627:17;39699:8;39679:16;;39661:15;;:34;;;;:::i;:::-;39647:10;:49;;;;:::i;:::-;:60;;;;:::i;:::-;39627:80;;39730:31;39751:9;39730:20;:31::i;:::-;39604:177;39559:222;38643:1153;;;38598:1198;39823:5;39812:8;;:16;;;;;;;;;;;;;;;;;;38412:1428;38270:1570;39852:12;39868:8;;;;;;;;;;;39867:9;39852:24;;39892:19;:25;39912:4;39892:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;39921:19;:23;39941:2;39921:23;;;;;;;;;;;;;;;;;;;;;;;;;39892:52;39889:99;;;39971:5;39961:15;;39889:99;40052:13;;;;;;;;;;;40044:21;;:4;:21;;;;:44;;;;;40075:13;;;;;;;;;;;40069:19;;:2;:19;;;;40044:44;:55;;;;;40092:7;40044:55;40041:102;;;40126:5;40116:15;;40041:102;40158:7;40155:387;;;40182:18;40226:13;;;;;;;;;;;40218:21;;:4;:21;;;40215:151;;40273:11;;40260:24;;40215:151;;;40338:12;;40325:25;;40215:151;40380:12;40417:3;40404:10;40395:6;:19;;;;:::i;:::-;:25;;;;:::i;:::-;40380:40;;40467:4;40458:6;:13;;;;:::i;:::-;40449:22;;40488:42;40504:4;40518;40525;40488:15;:42::i;:::-;40167:375;;40155:387;40554:33;40570:4;40576:2;40580:6;40554:15;:33::i;:::-;40604:15;;;;;;;;;;;:26;;;40639:4;40646:15;40656:4;40646:9;:15::i;:::-;40604:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40600:74;40688:15;;;;;;;;;;;:26;;;40723:2;40728:13;40738:2;40728:9;:13::i;:::-;40688:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40684:70;40770:8;;;;;;;;;;;40766:357;;40795:11;40809:16;;40795:30;;40846:15;;;;;;;;;;;:23;;;40870:3;40846:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40842:270;;;41048:9;40972:86;;41037:4;40972:86;;;40997:10;41009:6;41017:18;41043:3;40972:86;;;;;;;;;:::i;:::-;;;;;;;;40875:199;;;40842:270;40780:343;40766:357;37562:3568;;;37449:3681;;;;:::o;3465:192::-;3551:7;3584:1;3579;:6;;3587:12;3571:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;3611:9;3627:1;3623;:5;;;;:::i;:::-;3611:17;;3648:1;3641:8;;;3465:192;;;;;:::o;3132:181::-;3190:7;3210:9;3226:1;3222;:5;;;;:::i;:::-;3210:17;;3251:1;3246;:6;;3238:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;3304:1;3297:8;;;3132:181;;;;:::o;2910:191::-;2984:16;3003:6;;;;;;;;;;;2984:25;;3029:8;3020:6;;:17;;;;;;;;;;;;;;;;;;3084:8;3053:40;;3074:8;3053:40;;;;;;;;;;;;2973:128;2910:191;:::o;17431:569::-;17589:1;17571:20;;:6;:20;;;17563:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;17673:1;17652:23;;:9;:23;;;17644:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;17726:47;17747:6;17755:9;17766:6;17726:20;:47::i;:::-;17804:71;17826:6;17804:71;;;;;;;;;;;;;;;;;:9;:17;17814:6;17804:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;17784:9;:17;17794:6;17784:17;;;;;;;;;;;;;;;:91;;;;17909:32;17934:6;17909:9;:20;17919:9;17909:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;17886:9;:20;17896:9;17886:20;;;;;;;;;;;;;;;:55;;;;17974:9;17957:35;;17966:6;17957:35;;;17985:6;17957:35;;;;;;:::i;:::-;;;;;;;;17431:569;;;:::o;36292:315::-;36405:6;36380:21;:31;;36372:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36459:12;36477:9;:14;;36499:6;36477:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36458:52;;;36529:7;36521:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;36361:246;36292:315;;:::o;41138:739::-;41202:21;41240:1;41226:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41202:40;;41263:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41253:4;41258:1;41253:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;41306:11;41296:4;41301:1;41296:7;;;;;;;;:::i;:::-;;;;;;;:21;;;;;;;;;;;41330:15;;;;;;;;;;;:66;;;41404:6;41426:1;41442:4;41469;41489:15;41330:185;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41536:26;41572:11;41565:29;;;41603:4;41565:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41536:73;;41620:12;41642:11;41635:28;;;41672:15;;;;;;;;;;;41690:18;41635:74;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41620:89;;41726:7;41722:148;;;41750:15;;;;;;;;;;;:35;;;41786:18;41750:55;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41825:33;41839:18;41825:33;;;;;;:::i;:::-;;;;;;;;41722:148;41191:686;;;41138:739;:::o;19198:125::-;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:99::-;494:6;528:5;522:12;512:22;;442:99;;;:::o;547:169::-;631:11;665:6;660:3;653:19;705:4;700:3;696:14;681:29;;547:169;;;;:::o;722:246::-;803:1;813:113;827:6;824:1;821:13;813:113;;;912:1;907:3;903:11;897:18;893:1;888:3;884:11;877:39;849:2;846:1;842:10;837:15;;813:113;;;960:1;951:6;946:3;942:16;935:27;784:184;722:246;;;:::o;974:102::-;1015:6;1066:2;1062:7;1057:2;1050:5;1046:14;1042:28;1032:38;;974:102;;;:::o;1082:377::-;1170:3;1198:39;1231:5;1198:39;:::i;:::-;1253:71;1317:6;1312:3;1253:71;:::i;:::-;1246:78;;1333:65;1391:6;1386:3;1379:4;1372:5;1368:16;1333:65;:::i;:::-;1423:29;1445:6;1423:29;:::i;:::-;1418:3;1414:39;1407:46;;1174:285;1082:377;;;;:::o;1465:313::-;1578:4;1616:2;1605:9;1601:18;1593:26;;1665:9;1659:4;1655:20;1651:1;1640:9;1636:17;1629:47;1693:78;1766:4;1757:6;1693:78;:::i;:::-;1685:86;;1465:313;;;;:::o;1865:117::-;1974:1;1971;1964:12;2111:126;2148:7;2188:42;2181:5;2177:54;2166:65;;2111:126;;;:::o;2243:96::-;2280:7;2309:24;2327:5;2309:24;:::i;:::-;2298:35;;2243:96;;;:::o;2345:122::-;2418:24;2436:5;2418:24;:::i;:::-;2411:5;2408:35;2398:63;;2457:1;2454;2447:12;2398:63;2345:122;:::o;2473:139::-;2519:5;2557:6;2544:20;2535:29;;2573:33;2600:5;2573:33;:::i;:::-;2473:139;;;;:::o;2618:122::-;2691:24;2709:5;2691:24;:::i;:::-;2684:5;2681:35;2671:63;;2730:1;2727;2720:12;2671:63;2618:122;:::o;2746:139::-;2792:5;2830:6;2817:20;2808:29;;2846:33;2873:5;2846:33;:::i;:::-;2746:139;;;;:::o;2891:474::-;2959:6;2967;3016:2;3004:9;2995:7;2991:23;2987:32;2984:119;;;3022:79;;:::i;:::-;2984:119;3142:1;3167:53;3212:7;3203:6;3192:9;3188:22;3167:53;:::i;:::-;3157:63;;3113:117;3269:2;3295:53;3340:7;3331:6;3320:9;3316:22;3295:53;:::i;:::-;3285:63;;3240:118;2891:474;;;;;:::o;3371:90::-;3405:7;3448:5;3441:13;3434:21;3423:32;;3371:90;;;:::o;3467:109::-;3548:21;3563:5;3548:21;:::i;:::-;3543:3;3536:34;3467:109;;:::o;3582:210::-;3669:4;3707:2;3696:9;3692:18;3684:26;;3720:65;3782:1;3771:9;3767:17;3758:6;3720:65;:::i;:::-;3582:210;;;;:::o;3798:60::-;3826:3;3847:5;3840:12;;3798:60;;;:::o;3864:142::-;3914:9;3947:53;3965:34;3974:24;3992:5;3974:24;:::i;:::-;3965:34;:::i;:::-;3947:53;:::i;:::-;3934:66;;3864:142;;;:::o;4012:126::-;4062:9;4095:37;4126:5;4095:37;:::i;:::-;4082:50;;4012:126;;;:::o;4144:153::-;4221:9;4254:37;4285:5;4254:37;:::i;:::-;4241:50;;4144:153;;;:::o;4303:185::-;4417:64;4475:5;4417:64;:::i;:::-;4412:3;4405:77;4303:185;;:::o;4494:276::-;4614:4;4652:2;4641:9;4637:18;4629:26;;4665:98;4760:1;4749:9;4745:17;4736:6;4665:98;:::i;:::-;4494:276;;;;:::o;4776:619::-;4853:6;4861;4869;4918:2;4906:9;4897:7;4893:23;4889:32;4886:119;;;4924:79;;:::i;:::-;4886:119;5044:1;5069:53;5114:7;5105:6;5094:9;5090:22;5069:53;:::i;:::-;5059:63;;5015:117;5171:2;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5142:118;5299:2;5325:53;5370:7;5361:6;5350:9;5346:22;5325:53;:::i;:::-;5315:63;;5270:118;4776:619;;;;;:::o;5401:329::-;5460:6;5509:2;5497:9;5488:7;5484:23;5480:32;5477:119;;;5515:79;;:::i;:::-;5477:119;5635:1;5660:53;5705:7;5696:6;5685:9;5681:22;5660:53;:::i;:::-;5650:63;;5606:117;5401:329;;;;:::o;5736:150::-;5810:9;5843:37;5874:5;5843:37;:::i;:::-;5830:50;;5736:150;;;:::o;5892:179::-;6003:61;6058:5;6003:61;:::i;:::-;5998:3;5991:74;5892:179;;:::o;6077:270::-;6194:4;6232:2;6221:9;6217:18;6209:26;;6245:95;6337:1;6326:9;6322:17;6313:6;6245:95;:::i;:::-;6077:270;;;;:::o;6353:86::-;6388:7;6428:4;6421:5;6417:16;6406:27;;6353:86;;;:::o;6445:112::-;6528:22;6544:5;6528:22;:::i;:::-;6523:3;6516:35;6445:112;;:::o;6563:214::-;6652:4;6690:2;6679:9;6675:18;6667:26;;6703:67;6767:1;6756:9;6752:17;6743:6;6703:67;:::i;:::-;6563:214;;;;:::o;6783:329::-;6842:6;6891:2;6879:9;6870:7;6866:23;6862:32;6859:119;;;6897:79;;:::i;:::-;6859:119;7017:1;7042:53;7087:7;7078:6;7067:9;7063:22;7042:53;:::i;:::-;7032:63;;6988:117;6783:329;;;;:::o;7118:118::-;7205:24;7223:5;7205:24;:::i;:::-;7200:3;7193:37;7118:118;;:::o;7242:222::-;7335:4;7373:2;7362:9;7358:18;7350:26;;7386:71;7454:1;7443:9;7439:17;7430:6;7386:71;:::i;:::-;7242:222;;;;:::o;7470:76::-;7506:7;7535:5;7524:16;;7470:76;;;:::o;7552:115::-;7637:23;7654:5;7637:23;:::i;:::-;7632:3;7625:36;7552:115;;:::o;7673:989::-;7958:4;7996:3;7985:9;7981:19;7973:27;;8010:71;8078:1;8067:9;8063:17;8054:6;8010:71;:::i;:::-;8091:70;8157:2;8146:9;8142:18;8133:6;8091:70;:::i;:::-;8171;8237:2;8226:9;8222:18;8213:6;8171:70;:::i;:::-;8251:72;8319:2;8308:9;8304:18;8295:6;8251:72;:::i;:::-;8333:73;8401:3;8390:9;8386:19;8377:6;8333:73;:::i;:::-;8416;8484:3;8473:9;8469:19;8460:6;8416:73;:::i;:::-;8499;8567:3;8556:9;8552:19;8543:6;8499:73;:::i;:::-;8582;8650:3;8639:9;8635:19;8626:6;8582:73;:::i;:::-;7673:989;;;;;;;;;;;:::o;8668:116::-;8738:21;8753:5;8738:21;:::i;:::-;8731:5;8728:32;8718:60;;8774:1;8771;8764:12;8718:60;8668:116;:::o;8790:133::-;8833:5;8871:6;8858:20;8849:29;;8887:30;8911:5;8887:30;:::i;:::-;8790:133;;;;:::o;8929:468::-;8994:6;9002;9051:2;9039:9;9030:7;9026:23;9022:32;9019:119;;;9057:79;;:::i;:::-;9019:119;9177:1;9202:53;9247:7;9238:6;9227:9;9223:22;9202:53;:::i;:::-;9192:63;;9148:117;9304:2;9330:50;9372:7;9363:6;9352:9;9348:22;9330:50;:::i;:::-;9320:60;;9275:115;8929:468;;;;;:::o;9403:474::-;9471:6;9479;9528:2;9516:9;9507:7;9503:23;9499:32;9496:119;;;9534:79;;:::i;:::-;9496:119;9654:1;9679:53;9724:7;9715:6;9704:9;9700:22;9679:53;:::i;:::-;9669:63;;9625:117;9781:2;9807:53;9852:7;9843:6;9832:9;9828:22;9807:53;:::i;:::-;9797:63;;9752:118;9403:474;;;;;:::o;9883:180::-;9931:77;9928:1;9921:88;10028:4;10025:1;10018:15;10052:4;10049:1;10042:15;10069:410;10109:7;10132:20;10150:1;10132:20;:::i;:::-;10127:25;;10166:20;10184:1;10166:20;:::i;:::-;10161:25;;10221:1;10218;10214:9;10243:30;10261:11;10243:30;:::i;:::-;10232:41;;10422:1;10413:7;10409:15;10406:1;10403:22;10383:1;10376:9;10356:83;10333:139;;10452:18;;:::i;:::-;10333:139;10117:362;10069:410;;;;:::o;10485:180::-;10533:77;10530:1;10523:88;10630:4;10627:1;10620:15;10654:4;10651:1;10644:15;10671:185;10711:1;10728:20;10746:1;10728:20;:::i;:::-;10723:25;;10762:20;10780:1;10762:20;:::i;:::-;10757:25;;10801:1;10791:35;;10806:18;;:::i;:::-;10791:35;10848:1;10845;10841:9;10836:14;;10671:185;;;;:::o;10862:180::-;10910:77;10907:1;10900:88;11007:4;11004:1;10997:15;11031:4;11028:1;11021:15;11048:320;11092:6;11129:1;11123:4;11119:12;11109:22;;11176:1;11170:4;11166:12;11197:18;11187:81;;11253:4;11245:6;11241:17;11231:27;;11187:81;11315:2;11307:6;11304:14;11284:18;11281:38;11278:84;;11334:18;;:::i;:::-;11278:84;11099:269;11048:320;;;:::o;11374:182::-;11514:34;11510:1;11502:6;11498:14;11491:58;11374:182;:::o;11562:366::-;11704:3;11725:67;11789:2;11784:3;11725:67;:::i;:::-;11718:74;;11801:93;11890:3;11801:93;:::i;:::-;11919:2;11914:3;11910:12;11903:19;;11562:366;;;:::o;11934:419::-;12100:4;12138:2;12127:9;12123:18;12115:26;;12187:9;12181:4;12177:20;12173:1;12162:9;12158:17;12151:47;12215:131;12341:4;12215:131;:::i;:::-;12207:139;;11934:419;;;:::o;12359:143::-;12416:5;12447:6;12441:13;12432:22;;12463:33;12490:5;12463:33;:::i;:::-;12359:143;;;;:::o;12508:351::-;12578:6;12627:2;12615:9;12606:7;12602:23;12598:32;12595:119;;;12633:79;;:::i;:::-;12595:119;12753:1;12778:64;12834:7;12825:6;12814:9;12810:22;12778:64;:::i;:::-;12768:74;;12724:128;12508:351;;;;:::o;12865:104::-;12910:7;12939:24;12957:5;12939:24;:::i;:::-;12928:35;;12865:104;;;:::o;12975:142::-;13078:32;13104:5;13078:32;:::i;:::-;13073:3;13066:45;12975:142;;:::o;13123:352::-;13254:4;13292:2;13281:9;13277:18;13269:26;;13305:87;13389:1;13378:9;13374:17;13365:6;13305:87;:::i;:::-;13402:66;13464:2;13453:9;13449:18;13440:6;13402:66;:::i;:::-;13123:352;;;;;:::o;13481:137::-;13535:5;13566:6;13560:13;13551:22;;13582:30;13606:5;13582:30;:::i;:::-;13481:137;;;;:::o;13624:345::-;13691:6;13740:2;13728:9;13719:7;13715:23;13711:32;13708:119;;;13746:79;;:::i;:::-;13708:119;13866:1;13891:61;13944:7;13935:6;13924:9;13920:22;13891:61;:::i;:::-;13881:71;;13837:125;13624:345;;;;:::o;13975:663::-;14063:6;14071;14079;14128:2;14116:9;14107:7;14103:23;14099:32;14096:119;;;14134:79;;:::i;:::-;14096:119;14254:1;14279:64;14335:7;14326:6;14315:9;14311:22;14279:64;:::i;:::-;14269:74;;14225:128;14392:2;14418:64;14474:7;14465:6;14454:9;14450:22;14418:64;:::i;:::-;14408:74;;14363:129;14531:2;14557:64;14613:7;14604:6;14593:9;14589:22;14557:64;:::i;:::-;14547:74;;14502:129;13975:663;;;;;:::o;14644:553::-;14821:4;14859:3;14848:9;14844:19;14836:27;;14873:71;14941:1;14930:9;14926:17;14917:6;14873:71;:::i;:::-;14954:72;15022:2;15011:9;15007:18;14998:6;14954:72;:::i;:::-;15036;15104:2;15093:9;15089:18;15080:6;15036:72;:::i;:::-;15118;15186:2;15175:9;15171:18;15162:6;15118:72;:::i;:::-;14644:553;;;;;;;:::o;15203:143::-;15260:5;15291:6;15285:13;15276:22;;15307:33;15334:5;15307:33;:::i;:::-;15203:143;;;;:::o;15352:120::-;15424:23;15441:5;15424:23;:::i;:::-;15417:5;15414:34;15404:62;;15462:1;15459;15452:12;15404:62;15352:120;:::o;15478:141::-;15534:5;15565:6;15559:13;15550:22;;15581:32;15607:5;15581:32;:::i;:::-;15478:141;;;;:::o;15625:1444::-;15756:6;15764;15772;15780;15788;15796;15804;15812;15861:3;15849:9;15840:7;15836:23;15832:33;15829:120;;;15868:79;;:::i;:::-;15829:120;15988:1;16013:64;16069:7;16060:6;16049:9;16045:22;16013:64;:::i;:::-;16003:74;;15959:128;16126:2;16152:63;16207:7;16198:6;16187:9;16183:22;16152:63;:::i;:::-;16142:73;;16097:128;16264:2;16290:63;16345:7;16336:6;16325:9;16321:22;16290:63;:::i;:::-;16280:73;;16235:128;16402:2;16428:64;16484:7;16475:6;16464:9;16460:22;16428:64;:::i;:::-;16418:74;;16373:129;16541:3;16568:64;16624:7;16615:6;16604:9;16600:22;16568:64;:::i;:::-;16558:74;;16512:130;16681:3;16708:64;16764:7;16755:6;16744:9;16740:22;16708:64;:::i;:::-;16698:74;;16652:130;16821:3;16848:64;16904:7;16895:6;16884:9;16880:22;16848:64;:::i;:::-;16838:74;;16792:130;16961:3;16988:64;17044:7;17035:6;17024:9;17020:22;16988:64;:::i;:::-;16978:74;;16932:130;15625:1444;;;;;;;;;;;:::o;17075:249::-;17215:34;17211:1;17203:6;17199:14;17192:58;17284:32;17279:2;17271:6;17267:15;17260:57;17075:249;:::o;17330:366::-;17472:3;17493:67;17557:2;17552:3;17493:67;:::i;:::-;17486:74;;17569:93;17658:3;17569:93;:::i;:::-;17687:2;17682:3;17678:12;17671:19;;17330:366;;;:::o;17702:419::-;17868:4;17906:2;17895:9;17891:18;17883:26;;17955:9;17949:4;17945:20;17941:1;17930:9;17926:17;17919:47;17983:131;18109:4;17983:131;:::i;:::-;17975:139;;17702:419;;;:::o;18127:223::-;18267:34;18263:1;18255:6;18251:14;18244:58;18336:6;18331:2;18323:6;18319:15;18312:31;18127:223;:::o;18356:366::-;18498:3;18519:67;18583:2;18578:3;18519:67;:::i;:::-;18512:74;;18595:93;18684:3;18595:93;:::i;:::-;18713:2;18708:3;18704:12;18697:19;;18356:366;;;:::o;18728:419::-;18894:4;18932:2;18921:9;18917:18;18909:26;;18981:9;18975:4;18971:20;18967:1;18956:9;18952:17;18945:47;19009:131;19135:4;19009:131;:::i;:::-;19001:139;;18728:419;;;:::o;19153:238::-;19293:34;19289:1;19281:6;19277:14;19270:58;19362:21;19357:2;19349:6;19345:15;19338:46;19153:238;:::o;19397:366::-;19539:3;19560:67;19624:2;19619:3;19560:67;:::i;:::-;19553:74;;19636:93;19725:3;19636:93;:::i;:::-;19754:2;19749:3;19745:12;19738:19;;19397:366;;;:::o;19769:419::-;19935:4;19973:2;19962:9;19958:18;19950:26;;20022:9;20016:4;20012:20;20008:1;19997:9;19993:17;19986:47;20050:131;20176:4;20050:131;:::i;:::-;20042:139;;19769:419;;;:::o;20194:225::-;20334:34;20330:1;20322:6;20318:14;20311:58;20403:8;20398:2;20390:6;20386:15;20379:33;20194:225;:::o;20425:366::-;20567:3;20588:67;20652:2;20647:3;20588:67;:::i;:::-;20581:74;;20664:93;20753:3;20664:93;:::i;:::-;20782:2;20777:3;20773:12;20766:19;;20425:366;;;:::o;20797:419::-;20963:4;21001:2;20990:9;20986:18;20978:26;;21050:9;21044:4;21040:20;21036:1;21025:9;21021:17;21014:47;21078:131;21204:4;21078:131;:::i;:::-;21070:139;;20797:419;;;:::o;21222:182::-;21362:34;21358:1;21350:6;21346:14;21339:58;21222:182;:::o;21410:366::-;21552:3;21573:67;21637:2;21632:3;21573:67;:::i;:::-;21566:74;;21649:93;21738:3;21649:93;:::i;:::-;21767:2;21762:3;21758:12;21751:19;;21410:366;;;:::o;21782:419::-;21948:4;21986:2;21975:9;21971:18;21963:26;;22035:9;22029:4;22025:20;22021:1;22010:9;22006:17;21999:47;22063:131;22189:4;22063:131;:::i;:::-;22055:139;;21782:419;;;:::o;22207:332::-;22328:4;22366:2;22355:9;22351:18;22343:26;;22379:71;22447:1;22436:9;22432:17;22423:6;22379:71;:::i;:::-;22460:72;22528:2;22517:9;22513:18;22504:6;22460:72;:::i;:::-;22207:332;;;;;:::o;22545:223::-;22685:34;22681:1;22673:6;22669:14;22662:58;22754:6;22749:2;22741:6;22737:15;22730:31;22545:223;:::o;22774:366::-;22916:3;22937:67;23001:2;22996:3;22937:67;:::i;:::-;22930:74;;23013:93;23102:3;23013:93;:::i;:::-;23131:2;23126:3;23122:12;23115:19;;22774:366;;;:::o;23146:419::-;23312:4;23350:2;23339:9;23335:18;23327:26;;23399:9;23393:4;23389:20;23385:1;23374:9;23370:17;23363:47;23427:131;23553:4;23427:131;:::i;:::-;23419:139;;23146:419;;;:::o;23571:221::-;23711:34;23707:1;23699:6;23695:14;23688:58;23780:4;23775:2;23767:6;23763:15;23756:29;23571:221;:::o;23798:366::-;23940:3;23961:67;24025:2;24020:3;23961:67;:::i;:::-;23954:74;;24037:93;24126:3;24037:93;:::i;:::-;24155:2;24150:3;24146:12;24139:19;;23798:366;;;:::o;24170:419::-;24336:4;24374:2;24363:9;24359:18;24351:26;;24423:9;24417:4;24413:20;24409:1;24398:9;24394:17;24387:47;24451:131;24577:4;24451:131;:::i;:::-;24443:139;;24170:419;;;:::o;24595:224::-;24735:34;24731:1;24723:6;24719:14;24712:58;24804:7;24799:2;24791:6;24787:15;24780:32;24595:224;:::o;24825:366::-;24967:3;24988:67;25052:2;25047:3;24988:67;:::i;:::-;24981:74;;25064:93;25153:3;25064:93;:::i;:::-;25182:2;25177:3;25173:12;25166:19;;24825:366;;;:::o;25197:419::-;25363:4;25401:2;25390:9;25386:18;25378:26;;25450:9;25444:4;25440:20;25436:1;25425:9;25421:17;25414:47;25478:131;25604:4;25478:131;:::i;:::-;25470:139;;25197:419;;;:::o;25622:222::-;25762:34;25758:1;25750:6;25746:14;25739:58;25831:5;25826:2;25818:6;25814:15;25807:30;25622:222;:::o;25850:366::-;25992:3;26013:67;26077:2;26072:3;26013:67;:::i;:::-;26006:74;;26089:93;26178:3;26089:93;:::i;:::-;26207:2;26202:3;26198:12;26191:19;;25850:366;;;:::o;26222:419::-;26388:4;26426:2;26415:9;26411:18;26403:26;;26475:9;26469:4;26465:20;26461:1;26450:9;26446:17;26439:47;26503:131;26629:4;26503:131;:::i;:::-;26495:139;;26222:419;;;:::o;26647:191::-;26687:3;26706:20;26724:1;26706:20;:::i;:::-;26701:25;;26740:20;26758:1;26740:20;:::i;:::-;26735:25;;26783:1;26780;26776:9;26769:16;;26804:3;26801:1;26798:10;26795:36;;;26811:18;;:::i;:::-;26795:36;26647:191;;;;:::o;26844:176::-;26984:28;26980:1;26972:6;26968:14;26961:52;26844:176;:::o;27026:366::-;27168:3;27189:67;27253:2;27248:3;27189:67;:::i;:::-;27182:74;;27265:93;27354:3;27265:93;:::i;:::-;27383:2;27378:3;27374:12;27367:19;;27026:366;;;:::o;27398:419::-;27564:4;27602:2;27591:9;27587:18;27579:26;;27651:9;27645:4;27641:20;27637:1;27626:9;27622:17;27615:47;27679:131;27805:4;27679:131;:::i;:::-;27671:139;;27398:419;;;:::o;27823:180::-;27871:77;27868:1;27861:88;27968:4;27965:1;27958:15;27992:4;27989:1;27982:15;28009:180;28057:77;28054:1;28047:88;28154:4;28151:1;28144:15;28178:4;28175:1;28168:15;28195:351;28265:6;28314:2;28302:9;28293:7;28289:23;28285:32;28282:119;;;28320:79;;:::i;:::-;28282:119;28440:1;28465:64;28521:7;28512:6;28501:9;28497:22;28465:64;:::i;:::-;28455:74;;28411:128;28195:351;;;;:::o;28552:85::-;28597:7;28626:5;28615:16;;28552:85;;;:::o;28643:158::-;28701:9;28734:61;28752:42;28761:32;28787:5;28761:32;:::i;:::-;28752:42;:::i;:::-;28734:61;:::i;:::-;28721:74;;28643:158;;;:::o;28807:147::-;28902:45;28941:5;28902:45;:::i;:::-;28897:3;28890:58;28807:147;;:::o;28960:114::-;29027:6;29061:5;29055:12;29045:22;;28960:114;;;:::o;29080:184::-;29179:11;29213:6;29208:3;29201:19;29253:4;29248:3;29244:14;29229:29;;29080:184;;;;:::o;29270:132::-;29337:4;29360:3;29352:11;;29390:4;29385:3;29381:14;29373:22;;29270:132;;;:::o;29408:108::-;29485:24;29503:5;29485:24;:::i;:::-;29480:3;29473:37;29408:108;;:::o;29522:179::-;29591:10;29612:46;29654:3;29646:6;29612:46;:::i;:::-;29690:4;29685:3;29681:14;29667:28;;29522:179;;;;:::o;29707:113::-;29777:4;29809;29804:3;29800:14;29792:22;;29707:113;;;:::o;29856:732::-;29975:3;30004:54;30052:5;30004:54;:::i;:::-;30074:86;30153:6;30148:3;30074:86;:::i;:::-;30067:93;;30184:56;30234:5;30184:56;:::i;:::-;30263:7;30294:1;30279:284;30304:6;30301:1;30298:13;30279:284;;;30380:6;30374:13;30407:63;30466:3;30451:13;30407:63;:::i;:::-;30400:70;;30493:60;30546:6;30493:60;:::i;:::-;30483:70;;30339:224;30326:1;30323;30319:9;30314:14;;30279:284;;;30283:14;30579:3;30572:10;;29980:608;;;29856:732;;;;:::o;30594:831::-;30857:4;30895:3;30884:9;30880:19;30872:27;;30909:71;30977:1;30966:9;30962:17;30953:6;30909:71;:::i;:::-;30990:80;31066:2;31055:9;31051:18;31042:6;30990:80;:::i;:::-;31117:9;31111:4;31107:20;31102:2;31091:9;31087:18;31080:48;31145:108;31248:4;31239:6;31145:108;:::i;:::-;31137:116;;31263:72;31331:2;31320:9;31316:18;31307:6;31263:72;:::i;:::-;31345:73;31413:3;31402:9;31398:19;31389:6;31345:73;:::i;:::-;30594:831;;;;;;;;:::o;31431:194::-;31471:4;31491:20;31509:1;31491:20;:::i;:::-;31486:25;;31525:20;31543:1;31525:20;:::i;:::-;31520:25;;31569:1;31566;31562:9;31554:17;;31593:1;31587:4;31584:11;31581:37;;;31598:18;;:::i;:::-;31581:37;31431:194;;;;:::o;31631:364::-;31768:4;31806:2;31795:9;31791:18;31783:26;;31819:87;31903:1;31892:9;31888:17;31879:6;31819:87;:::i;:::-;31916:72;31984:2;31973:9;31969:18;31960:6;31916:72;:::i;:::-;31631:364;;;;;:::o;32001:177::-;32141:29;32137:1;32129:6;32125:14;32118:53;32001:177;:::o;32184:366::-;32326:3;32347:67;32411:2;32406:3;32347:67;:::i;:::-;32340:74;;32423:93;32512:3;32423:93;:::i;:::-;32541:2;32536:3;32532:12;32525:19;;32184:366;;;:::o;32556:419::-;32722:4;32760:2;32749:9;32745:18;32737:26;;32809:9;32803:4;32799:20;32795:1;32784:9;32780:17;32773:47;32837:131;32963:4;32837:131;:::i;:::-;32829:139;;32556:419;;;:::o;32981:179::-;33121:31;33117:1;33109:6;33105:14;33098:55;32981:179;:::o;33166:366::-;33308:3;33329:67;33393:2;33388:3;33329:67;:::i;:::-;33322:74;;33405:93;33494:3;33405:93;:::i;:::-;33523:2;33518:3;33514:12;33507:19;;33166:366;;;:::o;33538:419::-;33704:4;33742:2;33731:9;33727:18;33719:26;;33791:9;33785:4;33781:20;33777:1;33766:9;33762:17;33755:47;33819:131;33945:4;33819:131;:::i;:::-;33811:139;;33538:419;;;:::o;33963:147::-;34064:11;34101:3;34086:18;;33963:147;;;;:::o;34116:114::-;;:::o;34236:398::-;34395:3;34416:83;34497:1;34492:3;34416:83;:::i;:::-;34409:90;;34508:93;34597:3;34508:93;:::i;:::-;34626:1;34621:3;34617:11;34610:18;;34236:398;;;:::o;34640:379::-;34824:3;34846:147;34989:3;34846:147;:::i;:::-;34839:154;;35010:3;35003:10;;34640:379;;;:::o;35025:245::-;35165:34;35161:1;35153:6;35149:14;35142:58;35234:28;35229:2;35221:6;35217:15;35210:53;35025:245;:::o;35276:366::-;35418:3;35439:67;35503:2;35498:3;35439:67;:::i;:::-;35432:74;;35515:93;35604:3;35515:93;:::i;:::-;35633:2;35628:3;35624:12;35617:19;;35276:366;;;:::o;35648:419::-;35814:4;35852:2;35841:9;35837:18;35829:26;;35901:9;35895:4;35891:20;35887:1;35876:9;35872:17;35865:47;35929:131;36055:4;35929:131;:::i;:::-;35921:139;;35648:419;;;:::o;36073:720::-;36308:4;36346:3;36335:9;36331:19;36323:27;;36360:79;36436:1;36425:9;36421:17;36412:6;36360:79;:::i;:::-;36486:9;36480:4;36476:20;36471:2;36460:9;36456:18;36449:48;36514:108;36617:4;36608:6;36514:108;:::i;:::-;36506:116;;36632:72;36700:2;36689:9;36685:18;36676:6;36632:72;:::i;:::-;36714;36782:2;36771:9;36767:18;36758:6;36714:72;:::i;:::-;36073:720;;;;;;;:::o

Swarm Source

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