BNB Price: $696.85 (-1.84%)
Gas: 1 GWei
 

Overview

Max Total Supply

100,000$D.O.G.E

Holders

308 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.15 $D.O.G.E

Value
$0.00
0x773ae23983e1e9720bafe6e214971ff762d9758d
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Introducing $D.O.G.E. - a novel cryptocurrency project inspired by Elon Musk's vision for a 'Department of Government Efficiency.


Update? Click here to update the token ICO / general information

Contract Source Code Verified (Exact Match)

Contract Name:
$DOGE

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2024-10-23
*/

/**
Telegram: https://t.me/dogedept_bsc
Twitter: https://x.com/Doge_deptbsc
Website: https://dogeonbsc.net
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;

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

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see
        return msg.data;
    }
}

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

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    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 (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

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

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);
}

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

    mapping(address => uint256) private _balances;

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

    uint256 internal _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _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 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);
}

interface DividendPayingTokenInterface {
    function dividendOf(address _owner) external view returns (uint256);

    function distributeDividends() external payable;

    function withdrawDividend() external;

    event DividendsDistributed(address indexed from, uint256 weiAmount);

    event DividendWithdrawn(address indexed to, uint256 weiAmount);
}

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

contract Ownable is Context {
    address private _owner;

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

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

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

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

        // 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 IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

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

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

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

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

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

    uint256 internal constant magnitude = 2**128;

    uint256 internal magnifiedDividendPerShare;

    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;

    uint256 public totalDividendsDistributed;

    constructor(string memory _name, string memory _symbol)
        ERC20(_name, _symbol)
    {}

    receive() external payable {
        distributeDividends();
    }

    function distributeDividends() public payable override {
        require(totalSupply() > 0);

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

            totalDividendsDistributed = totalDividendsDistributed.add(
                msg.value
            );
        }
    }

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

    function _withdrawDividendOfUser(address payable user)
        internal
        virtual
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );
            emit DividendWithdrawn(user, _withdrawableDividend);
            (bool success, ) = user.call{
                value: _withdrawableDividend,
                gas: 3000
            }("");

            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 $DOGE is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;

    address public uniswapV2Pair;
    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    bool private swapping;
    bool private stakingEnabled = false;
    bool public tradingEnabled = false;

    uint256 public sellAmount = 0;
    uint256 public buyAmount = 0;

    uint256 private totalSellFees;
    uint256 private totalBuyFees;

  
  $DOGEDividendTracker public dividendTracker;

    address payable public marketingWallet;
    address payable public devWallet;

    // Max tx, dividend threshold and tax variables
    uint256 public maxWallet;
    uint256 public swapTokensAtAmount;
    uint256 public sellRewardsFee;
    uint256 public sellDeadFees;
    uint256 public sellMarketingFees;
    uint256 public sellLiquidityFee;
    uint256 public buyDeadFees;
    uint256 public buyMarketingFees;
    uint256 public buyLiquidityFee;
    uint256 public buyRewardsFee;
    uint256 public buyDevFee;
    uint256 public sellDevFee;
    uint256 public transferFee;

    bool public swapAndLiquifyEnabled = true;

    // gas for processing auto claim dividends 
    uint256 public gasForProcessing = 300000;

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

    mapping(address => bool) public automatedMarketMakerPairs;

    // staking variables
    mapping(address => uint256) public stakingBonus;
    mapping(address => uint256) public stakingUntilDate;
    mapping(uint256 => uint256) public stakingAmounts;

    //for allowing specific address to trade while trading has not been enabled yet 
    mapping(address => bool) private canTransferBeforeTradingIsEnabled;

    // Limit variables for bot protection
    bool public limitsInEffect = true; //boolean used to turn limits on and off
    uint256 private gasPriceLimit = 7 * 1 gwei; 
    mapping(address => uint256) private _holderLastTransferBlock; // for 1 tx per block
    mapping(address => uint256) private _holderLastTransferTimestamp; // for sell cooldown timer
    uint256 public launchblock;
    uint256 public cooldowntimer = 60; //default cooldown 60s

    event EnableAccountStaking(address indexed account, uint256 duration);
    event UpdateStakingAmounts(uint256 duration, uint256 amount);

    event EnableSwapAndLiquify(bool enabled);
    event EnableStaking(bool enabled);

    event SetPreSaleWallet(address wallet);

    event UpdateDividendTracker(
        address indexed newAddress,
        address indexed oldAddress
    );

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event TradingEnabled();

    event UpdateFees(
        uint256 sellDeadFees,
        uint256 sellMarketingFees,
        uint256 sellLiquidityFee,
        uint256 sellRewardsFee,
        uint256 buyDeadFees,
        uint256 buyMarketingFees,
        uint256 buyLiquidityFee,
        uint256 buyRewardsFee,
        uint256 buyDevFee,
        uint256 sellDevFee
    );

    event UpdateTransferFee(uint256 transferFee);

    event Airdrop(address holder, uint256 amount);

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

    event GasForProcessingUpdated(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );

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

    event SendDividends(uint256 amount, uint256 opAmount, bool success);

    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );

    event UpdatePayoutToken(address token);

    constructor() ERC20("DEPT. OF GOVERNMENT EFFICIENCY", "$D.O.G.E") {
        marketingWallet = payable(0x3d920E616B92EC47fDBe9676337DD879A30Fd3bD);
        devWallet = payable(0x3886989d984236D60296268befd1eF0feCf2CE13);
        address router = 0x10ED43C718714eb63d5aA57B78B54704E256024E;

        buyDeadFees = 0;
        sellDeadFees = 0;
        buyMarketingFees = 3;
        sellMarketingFees = 3;
        buyLiquidityFee = 0;
        sellLiquidityFee = 0;
        buyRewardsFee = 1;
        sellRewardsFee = 1;
        buyDevFee = 1;
        sellDevFee = 1;
        transferFee = 0;

        totalBuyFees = buyRewardsFee
            .add(buyLiquidityFee)
            .add(buyMarketingFees)
            .add(buyDevFee);
        totalSellFees = sellRewardsFee
            .add(sellLiquidityFee)
            .add(sellMarketingFees)
            .add(sellDevFee);

        dividendTracker = new $DOGEDividendTracker(
            payable(this),
            router,
            0xbA2aE424d960c26247Dd6c32edC70B295c744C43,
            "$DOGETRACKER",
            "$DOGETRACKER"
        );

        uniswapV2Router = IUniswapV2Router02(router);
        // Create a uniswap pair for this new token
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
                address(this),
                uniswapV2Router.WETH()
            );

        _setAutomatedMarketMakerPair(uniswapV2Pair, true);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(DEAD);
        dividendTracker.excludedFromDividends(address(0));
        dividendTracker.excludeFromDividends(router);
        dividendTracker.excludeFromDividends(marketingWallet);
        dividendTracker.excludeFromDividends(owner());

        // exclude from paying fees or having max transaction amount
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[address(dividendTracker)] = true;
        _isExcludedFromFees[address(marketingWallet)] = true;
        _isExcludedFromFees[address(devWallet)] = true;
        _isExcludedFromFees[msg.sender] = true;

        uint256 totalTokenSupply = (100_000) * (10**18);
        _mint(owner(), totalTokenSupply); // only time internal mint function is ever called is to create supply
        maxWallet = totalTokenSupply / 20000; // 0.005%
        swapTokensAtAmount = totalTokenSupply / 200000; // 0.05%;
        canTransferBeforeTradingIsEnabled[owner()] = true;
        canTransferBeforeTradingIsEnabled[address(this)] = true;
    }

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

    receive() external payable {}

    function updateStakingAmounts(uint256 duration, uint256 bonus)
        public
        onlyOwner
    {
        require(stakingAmounts[duration] != bonus);
        require(bonus <= 100, "Staking bonus can't exceed 100");
        stakingAmounts[duration] = bonus;
        emit UpdateStakingAmounts(duration, bonus);
    }

    // writeable function to enable trading, can only enable, trading can never be disabled
    function enableTrading() external onlyOwner {
        require(!tradingEnabled);
        tradingEnabled = true;
        launchblock = block.number;
        emit TradingEnabled();
    }
    // use for pre sale wallet, adds all exclusions to it
    function setPresaleWallet(address wallet) external onlyOwner {
        canTransferBeforeTradingIsEnabled[wallet] = true;
        _isExcludedFromFees[wallet] = true;
        dividendTracker.excludeFromDividends(wallet);
        emit SetPreSaleWallet(wallet);
    }
    
    // exclude a wallet from fees 
    function setExcludeFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    // exclude from dividends (rewards)
    function setExcludeDividends(address account) public onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }

    // include in dividends 
    function setIncludeDividends(address account) public onlyOwner {
        dividendTracker.includeFromDividends(account);
        dividendTracker.setBalance(account, getStakingBalance(account));
    }

    //allow a wallet to trade before trading enabled
    function setCanTransferBefore(address wallet, bool enable)
        external
        onlyOwner
    {
        canTransferBeforeTradingIsEnabled[wallet] = enable;
    }

    // turn limits on and off
    function setLimitsInEffect(bool value) external onlyOwner {
        limitsInEffect = value;
    }

    // set max GWEI
    function setGasPriceLimit(uint256 GWEI) external onlyOwner {
        require(GWEI >= 5, "can never be set below 5");
        gasPriceLimit = GWEI * 1 gwei;
    }

    // set cooldown timer, can only be between 0 and 300 seconds (5 mins max)
    function setcooldowntimer(uint256 value) external onlyOwner {
        require(value <= 300, "cooldown timer cannot exceed 5 minutes");
        cooldowntimer = value;
    }

    // set max wallet, can not be lower than 0.05% of supply
    function setmaxWallet(uint256 value) external onlyOwner {
        value = value * (10**18);
        require(value >= _totalSupply / 2000, "max wallet cannot be set to less than 0.05%");
        maxWallet = value;
    }

    
    function enableStaking(bool enable) public onlyOwner {
        require(stakingEnabled != enable);
        stakingEnabled = enable;
        emit EnableStaking(enable);
    }

    function stake(uint256 duration) public {
        require(stakingEnabled, "Staking is not enabled");
        require(stakingAmounts[duration] != 0, "Invalid staking duration");
        require(
            stakingUntilDate[_msgSender()] < block.timestamp.add(duration),
            "already staked for a longer duration"
        );
        stakingBonus[_msgSender()] = stakingAmounts[duration];
        stakingUntilDate[_msgSender()] = block.timestamp.add(duration);
        dividendTracker.setBalance(
            _msgSender(),
            getStakingBalance(_msgSender())
        );
        emit EnableAccountStaking(_msgSender(), duration);
    }

    // rewards threshold
    function setSwapTriggerAmount(uint256 amount) public onlyOwner {
        swapTokensAtAmount = amount * (10**18);
    }

    function enableSwapAndLiquify(bool enabled) public onlyOwner {
        require(swapAndLiquifyEnabled != enabled);
        swapAndLiquifyEnabled = enabled;
        emit EnableSwapAndLiquify(enabled);
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        _setAutomatedMarketMakerPair(pair, value);
    }

    function setAllowCustomTokens(bool allow) public onlyOwner {
        dividendTracker.setAllowCustomTokens(allow);
    }

    function setAllowAutoReinvest(bool allow) public onlyOwner {
        dividendTracker.setAllowAutoReinvest(allow);
    }

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

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(newValue >= 200000 && newValue <= 1000000);
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    function transferAdmin(address newOwner) public onlyOwner {
        dividendTracker.excludeFromDividends(newOwner);
        _isExcludedFromFees[newOwner] = true;
        transferOwnership(newOwner);
    }

    function updateTransferFee(uint256 newTransferFee) public onlyOwner {
        require (newTransferFee <= 15, "transfer fee cannot exceed 15%");
        transferFee = newTransferFee;
        emit UpdateTransferFee(transferFee);
    }

    function updateFees(
        uint256 deadBuy,
        uint256 deadSell,
        uint256 marketingBuy,
        uint256 marketingSell,
        uint256 liquidityBuy,
        uint256 liquiditySell,
        uint256 RewardsBuy,
        uint256 RewardsSell,
        uint256 devBuy,
        uint256 devSell
    ) public onlyOwner {
        buyDeadFees = deadBuy;
        buyMarketingFees = marketingBuy;
        buyLiquidityFee = liquidityBuy;
        buyRewardsFee = RewardsBuy;
        sellDeadFees = deadSell;
        sellMarketingFees = marketingSell;
        sellLiquidityFee = liquiditySell;
        sellRewardsFee = RewardsSell;
        buyDevFee = devBuy;
        sellDevFee = devSell;

        totalSellFees = sellRewardsFee
            .add(sellLiquidityFee)
            .add(sellMarketingFees)
            .add(sellDevFee);

        totalBuyFees = buyRewardsFee
            .add(buyLiquidityFee)
            .add(buyMarketingFees)
            .add(buyDevFee);

        require(totalSellFees <= 35 && totalBuyFees <= 35, "total fees cannot exceed 35% sell or buy");

        emit UpdateFees(
            sellDeadFees,
            sellMarketingFees,
            sellLiquidityFee,
            sellRewardsFee,
            buyDeadFees,
            buyMarketingFees,
            buyLiquidityFee,
            buyRewardsFee,
            buyDevFee,
            sellDevFee
        );
    }

    function getStakingInfo(address account)
        external
        view
        returns (uint256, uint256)
    {
        return (stakingUntilDate[account], stakingBonus[account]);
    }

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

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

    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 getAccountDividendsInfo(address account)
        external
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256
        )
    {
        return dividendTracker.getAccount(account);
    }

    function getAccountDividendsInfoAtIndex(uint256 index)
        external
        view
        returns (
            address,
            int256,
            int256,
            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 getLastProcessedIndex() external view returns (uint256) {
        return dividendTracker.getLastProcessedIndex();
    }

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

    function setAutoClaim(bool value) external {
        dividendTracker.setAutoClaim(msg.sender, value);
    }

    function setReinvest(bool value) external {
        dividendTracker.setReinvest(msg.sender, value);
    }

    function setDividendsPaused(bool value) external onlyOwner {
        dividendTracker.setDividendsPaused(value);
    }

    function isExcludedFromAutoClaim(address account)
        external
        view
        returns (bool)
    {
        return dividendTracker.isExcludedFromAutoClaim(account);
    }

    function isReinvest(address account) external view returns (bool) {
        return dividendTracker.isReinvest(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");
        uint256 RewardsFee;
        uint256 deadFees;
        uint256 marketingFees;
        uint256 liquidityFee;
        uint256 devFees;

        if (!canTransferBeforeTradingIsEnabled[from]) {
            require(tradingEnabled, "Trading has not yet been enabled");
        }
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        } else if (
            !swapping && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]
        ) {
            bool isSelling = automatedMarketMakerPairs[to];
            bool isBuying = automatedMarketMakerPairs[from];

            if (!isBuying && !isSelling) {
                uint256 tFees = amount.mul(transferFee).div(100);
                amount = amount.sub(tFees);
                super._transfer(from, address(this), tFees);
                super._transfer(from, to, amount);
                dividendTracker.setBalance(from, getStakingBalance(from));
                dividendTracker.setBalance(to, getStakingBalance(to));
                return;
            }
            
            else if (!isBuying && stakingEnabled) {
                require(
                    stakingUntilDate[from] <= block.timestamp,
                    "Tokens are staked and locked!"
                );
                if (stakingUntilDate[from] != 0) {
                    stakingUntilDate[from] = 0;
                    stakingBonus[from] = 0;
                }
            }

            else if (isSelling) {
                RewardsFee = sellRewardsFee;
                deadFees = sellDeadFees;
                marketingFees = sellMarketingFees;
                liquidityFee = sellLiquidityFee;
                devFees = sellDevFee;

                if (limitsInEffect) {
                require(block.timestamp >= _holderLastTransferTimestamp[tx.origin] + cooldowntimer,
                        "cooldown period active");
                _holderLastTransferTimestamp[tx.origin] = block.timestamp;

                }

            } else if (isBuying) {
                RewardsFee = buyRewardsFee;
                deadFees = buyDeadFees;
                marketingFees = buyMarketingFees;
                liquidityFee = buyLiquidityFee;
                devFees = buyDevFee;

                if (limitsInEffect) {
                require(block.number > launchblock + 30,"you shall not pass");
                require(tx.gasprice <= gasPriceLimit,"Gas price exceeds limit.");
                require(_holderLastTransferBlock[tx.origin] != block.number,"Too many TX in block");
                _holderLastTransferBlock[tx.origin] = block.number;
            }
            
            uint256 contractBalanceRecipient = balanceOf(to);
            require(contractBalanceRecipient + amount <= maxWallet,
                    "Exceeds maximum wallet token amount." );
            }

            uint256 totalFees = RewardsFee
                .add(liquidityFee + marketingFees + devFees);

            uint256 contractTokenBalance = balanceOf(address(this));

            bool canSwap = contractTokenBalance >= swapTokensAtAmount;

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

                if (swapAndLiquifyEnabled && liquidityFee > 0 && totalBuyFees > 0) {
                    uint256 totalBuySell = buyAmount.add(sellAmount);
                    uint256 swapAmountBought = contractTokenBalance
                        .mul(buyAmount)
                        .div(totalBuySell);
                    uint256 swapAmountSold = contractTokenBalance
                        .mul(sellAmount)
                        .div(totalBuySell);

                    uint256 swapBuyTokens = swapAmountBought
                        .mul(liquidityFee)
                        .div(totalBuyFees);

                    uint256 swapSellTokens = swapAmountSold
                        .mul(liquidityFee)
                        .div(totalSellFees);

                    uint256 swapTokens = swapSellTokens.add(swapBuyTokens);

                    swapAndLiquify(swapTokens);
                }

                uint256 remainingBalance = balanceOf(address(this));
                swapAndSendDividends(remainingBalance);
                buyAmount = 0;
                sellAmount = 0;
                swapping = false;
            }

            uint256 fees = amount.mul(totalFees).div(100);
            uint256 burntokens;

            if (deadFees > 0) {
            burntokens = amount.mul(deadFees) / 100;
            super._transfer(from, DEAD, burntokens);
            _totalSupply = _totalSupply.sub(burntokens);

            }

            amount = amount.sub(fees + burntokens);

            if (isSelling) {
                sellAmount = sellAmount.add(fees);
            } else {
                buyAmount = buyAmount.add(fees);
            }

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

            uint256 gas = gasForProcessing;

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

        super._transfer(from, to, amount);
        dividendTracker.setBalance(from, getStakingBalance(from));
        dividendTracker.setBalance(to, getStakingBalance(to));
    }

    function getStakingBalance(address account) private view returns (uint256) {
        return
            stakingEnabled
                ? balanceOf(account).mul(stakingBonus[account].add(100)).div(
                    100
                )
                : balanceOf(account);
    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);
        uint256 initialBalance = address(this).balance;
        swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered
        uint256 newBalance = address(this).balance.sub(initialBalance);
        addLiquidity(otherHalf, newBalance);
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function updatePayoutToken(address token) public onlyOwner {
        dividendTracker.updatePayoutToken(token);
        emit UpdatePayoutToken(token);
    }

    function getPayoutToken() public view returns (address) {
        return dividendTracker.getPayoutToken();
    }

    function setMinimumTokenBalanceForAutoDividends(uint256 value)
        public
        onlyOwner
    {
        dividendTracker.setMinimumTokenBalanceForAutoDividends(value);
    }

    function setMinimumTokenBalanceForDividends(uint256 value)
        public
        onlyOwner
    {
        dividendTracker.setMinimumTokenBalanceForDividends(value);
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

    function forceSwapAndSendDividends(uint256 tokens) public onlyOwner {
        tokens = tokens * (10**18);
        uint256 totalAmount = buyAmount.add(sellAmount);
        uint256 fromBuy = tokens.mul(buyAmount).div(totalAmount);
        uint256 fromSell = tokens.mul(sellAmount).div(totalAmount);

        swapAndSendDividends(tokens);

        buyAmount = buyAmount.sub(fromBuy);
        sellAmount = sellAmount.sub(fromSell);
    }

    function swapAndSendDividends(uint256 tokens) private {
        if (tokens == 0) {
            return;
        }
        swapTokensForEth(tokens);
        uint256 totalAmount = buyAmount.add(sellAmount);

        bool success = true;
        bool successOp1 = true;
        bool successOp2 = true;

        uint256 dividends;
        uint256 dividendsFromBuy;
        uint256 dividendsFromSell;

        if (buyRewardsFee > 0) {
            dividendsFromBuy = address(this)
            .balance
            .mul(buyAmount)
            .div(totalAmount)
            .mul(buyRewardsFee)
            .div(buyRewardsFee + buyMarketingFees + buyDevFee);
        }
        if (sellRewardsFee > 0) {
            dividendsFromSell = address(this)
            .balance
            .mul(sellAmount)
            .div(totalAmount)
            .mul(sellRewardsFee)
            .div(sellRewardsFee + sellMarketingFees + sellDevFee);
        }
        dividends = dividendsFromBuy.add(dividendsFromSell);

        if (dividends > 0) {
            (success, ) = address(dividendTracker).call{value: dividends}("");
        }
        
        uint256 _completeFees = sellMarketingFees.add(sellDevFee) +
            buyMarketingFees.add(buyDevFee);

        uint256 feePortions;
        if (_completeFees > 0) {
            feePortions = address(this).balance.div(_completeFees);
        }
        uint256 marketingPayout = buyMarketingFees.add(sellMarketingFees) * feePortions;
        uint256 devPayout = buyDevFee.add(sellDevFee) * feePortions;

        if (marketingPayout > 0) {
            (successOp1, ) = address(marketingWallet).call{value: marketingPayout}("");
        }
        if (devPayout > 0) {
            (successOp2, ) = address(devWallet).call{value: devPayout}("");
        }

        emit SendDividends(
            dividends,
            marketingPayout + devPayout,
            success && successOp1 && successOp2
        );
    }

    function multiSend(
        address[] memory _contributors,
        uint256[] memory _balances
    ) public onlyOwner {
        require(
            _contributors.length == _balances.length,
            "Contributors and balances must be same size"
        );
        // Max 200 sends in bulk, uint8 in loop limited to 255
        require(
            _contributors.length <= 200,
            "Contributor list length must be <= 200"
        );
        uint256 sumOfBalances = 0;
        for (uint8 i = 0; i < _balances.length; i++) {
            sumOfBalances = sumOfBalances.add(_balances[i]);
        }
        require(
            balanceOf(msg.sender) >= sumOfBalances,
            "Account balance must be >= sum of balances. "
        );
        require(
            allowance(msg.sender, address(this)) >= sumOfBalances,
            "Contract allowance must be >= sum of balances. "
        );
        address contributor;
        uint256 origBalance;
        for (uint8 j; j < _contributors.length; j++) {
            contributor = _contributors[j];
            require(
                contributor != address(0) &&
                    contributor != 0x000000000000000000000000000000000000dEaD,
                "Cannot airdrop to a dead address"
            );
            origBalance = balanceOf(contributor);
            this.transferFrom(msg.sender, contributor, _balances[j]);
            require(
                balanceOf(contributor) == origBalance + _balances[j],
                "Contributor must recieve full balance of airdrop"
            );
            emit Airdrop(contributor, _balances[j]);
        }
    }

    function airdropToWallets(
        address[] memory airdropWallets,
        uint256[] memory amount
    ) external onlyOwner {
        require(airdropWallets.length == amount.length,"Arrays must be the same length");
        require(airdropWallets.length <= 200, "Wallets list length must be <= 200");
        for (uint256 i = 0; i < airdropWallets.length; i++) {
            address wallet = airdropWallets[i];
            uint256 airdropAmount = amount[i] * (10**18);
            super._transfer(msg.sender, wallet, airdropAmount);
            dividendTracker.setBalance(payable(wallet), balanceOf(wallet));
        }
    }
}

contract $DOGEDividendTracker is DividendPayingToken, Ownable {
    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 => bool) public excludedFromAutoClaim;
    mapping(address => bool) public autoReinvest;
    address public defaultToken; // BUSD
    bool public allowCustomTokens;
    bool public allowAutoReinvest;
    bool public dividendsPaused = false;

    string private trackerName;
    string private trackerTicker;

    IUniswapV2Router02 public uniswapV2Router;

    $DOGE public $DOGEContract;

    mapping(address => uint256) public lastClaimTimes;

    uint256 private minimumTokenBalanceForAutoDividends;
    uint256 private minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event DividendReinvested(
        address indexed acount,
        uint256 value,
        bool indexed automatic
    );
    event Claim(
        address indexed account,
        uint256 amount,
        bool indexed automatic
    );
    event DividendsPaused(bool paused);
    event SetAllowCustomTokens(bool allow);
    event SetAllowAutoReinvest(bool allow);

    constructor(
        address payable mainContract,
        address router,
        address token,
        string memory _name,
        string memory _ticker
    ) DividendPayingToken(_name, _ticker) {
        trackerName = _name;
        trackerTicker = _ticker;
        defaultToken = token;
        $DOGEContract = $DOGE(mainContract);
        minimumTokenBalanceForAutoDividends = 100_000000000000000000; // 100 tokens
        minimumTokenBalanceForDividends = minimumTokenBalanceForAutoDividends;

        uniswapV2Router = IUniswapV2Router02(router);
        allowCustomTokens = true;
        allowAutoReinvest = false;
    }

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

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

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

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

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

    function isExcludedFromAutoClaim(address account)
        external
        view
        onlyOwner
        returns (bool)
    {
        return excludedFromAutoClaim[account];
    }

    function isReinvest(address account)
        external
        view
        onlyOwner
        returns (bool)
    {
        return autoReinvest[account];
    }

    function setAllowCustomTokens(bool allow) external onlyOwner {
        require(allowCustomTokens != allow);
        allowCustomTokens = allow;
        emit SetAllowCustomTokens(allow);
    }

    function setAllowAutoReinvest(bool allow) external onlyOwner {
        require(allowAutoReinvest != allow);
        allowAutoReinvest = allow;
        emit SetAllowAutoReinvest(allow);
    }

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

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

        emit ExcludeFromDividends(account);
    }

    function includeFromDividends(address account) external onlyOwner {
        excludedFromDividends[account] = false;
    }

    function setAutoClaim(address account, bool value) external onlyOwner {
        excludedFromAutoClaim[account] = value;
    }

    function setReinvest(address account, bool value) external onlyOwner {
        autoReinvest[account] = value;
    }

    function setMinimumTokenBalanceForAutoDividends(uint256 value)
        external
        onlyOwner
    {
        minimumTokenBalanceForAutoDividends = value * (10**18);
    }

    function setMinimumTokenBalanceForDividends(uint256 value)
        external
        onlyOwner
    {
        minimumTokenBalanceForDividends = value * (10**18);
    }

    function setDividendsPaused(bool value) external onlyOwner {
        require(dividendsPaused != value);
        dividendsPaused = value;
        emit DividendsPaused(value);
    }

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

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

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

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

        if (newBalance < minimumTokenBalanceForDividends) {
            tokenHoldersMap.remove(account);
            _setBalance(account, 0);

            return;
        }

        _setBalance(account, newBalance);

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

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

        if (numberOfTokenHolders == 0 || dividendsPaused) {
            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 >= numberOfTokenHolders) {
                _lastProcessedIndex = 0;
            }

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

            if (!excludedFromAutoClaim[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)
    {
        if (dividendsPaused) {
            return false;
        }

        bool reinvest = autoReinvest[account];

        if (automatic && reinvest && !allowAutoReinvest) {
            return false;
        }

        uint256 amount = reinvest
            ? _reinvestDividendOfUser(account)
            : _withdrawDividendOfUser(account);

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

        return false;
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }

    function updatePayoutToken(address token) public onlyOwner {
        defaultToken = token;
    }

    function getPayoutToken() public view returns (address) {
        return defaultToken;
    }

    function _reinvestDividendOfUser(address account)
        private
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(account);
        if (_withdrawableDividend > 0) {
            bool success;

            withdrawnDividends[account] = withdrawnDividends[account].add(
                _withdrawableDividend
            );

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

            uint256 prevBalance = $DOGEContract.balanceOf(address(this));

            // make the swap
            try
                uniswapV2Router
                    .swapExactETHForTokensSupportingFeeOnTransferTokens{
                    value: _withdrawableDividend
                }(
                    0, // accept any amount of Tokens
                    path,
                    address(this),
                    block.timestamp
                )
            {
                uint256 received = $DOGEContract
                    .balanceOf(address(this))
                    .sub(prevBalance);
                if (received > 0) {
                    success = true;
                    $DOGEContract.transfer(account, received);
                } else {
                    success = false;
                }
            } catch {
                success = false;
            }

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

            return _withdrawableDividend;
        }

        return 0;
    }

    function _withdrawDividendOfUser(address payable user)
        internal
        override
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );

            address tokenAddress = defaultToken;
            bool success;

            if (tokenAddress == address(0)) {
                (success, ) = user.call{
                    value: _withdrawableDividend,
                    gas: 3000
                }("");
            } else {
                address[] memory path = new address[](2);
                path[0] = uniswapV2Router.WETH();
                path[1] = tokenAddress;
                try
                    uniswapV2Router
                        .swapExactETHForTokensSupportingFeeOnTransferTokens{
                        value: _withdrawableDividend
                    }(
                        0, // accept any amount of Tokens
                        path,
                        user,
                        block.timestamp
                    )
                {
                    success = true;
                } catch {
                    success = false;
                }
            }

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

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

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

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

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

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

    function set(
        Map storage map,
        address key,
        uint256 val
    ) internal {
        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) internal {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint256 index = map.indexOf[key];
        uint256 lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Airdrop","type":"event"},{"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":"uint256","name":"duration","type":"uint256"}],"name":"EnableAccountStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableSwapAndLiquify","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"},{"indexed":false,"internalType":"uint256","name":"opAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"SetPreSaleWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","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":false,"internalType":"uint256","name":"sellDeadFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellMarketingFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellRewardsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyDeadFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyMarketingFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyRewardsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyDevFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellDevFee","type":"uint256"}],"name":"UpdateFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"UpdatePayoutToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UpdateStakingAmounts","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"transferFee","type":"uint256"}],"name":"UpdateTransferFee","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":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"airdropWallets","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"airdropToWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDeadFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldowntimer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","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 $DOGEDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"enableStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"forceSwapAndSendDividends","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"}],"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"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","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":"getPayoutToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getStakingInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"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":"isExcludedFromAutoClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isReinvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchblock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_contributors","type":"address[]"},{"internalType":"uint256[]","name":"_balances","type":"uint256[]"}],"name":"multiSend","outputs":[],"stateMutability":"nonpayable","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":"sellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDeadFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"allow","type":"bool"}],"name":"setAllowAutoReinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"allow","type":"bool"}],"name":"setAllowCustomTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutoClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setCanTransferBefore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setDividendsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setExcludeDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"GWEI","type":"uint256"}],"name":"setGasPriceLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setIncludeDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setLimitsInEffect","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMinimumTokenBalanceForAutoDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setPresaleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setReinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTriggerAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setcooldowntimer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setmaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingUntilDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"deadBuy","type":"uint256"},{"internalType":"uint256","name":"deadSell","type":"uint256"},{"internalType":"uint256","name":"marketingBuy","type":"uint256"},{"internalType":"uint256","name":"marketingSell","type":"uint256"},{"internalType":"uint256","name":"liquidityBuy","type":"uint256"},{"internalType":"uint256","name":"liquiditySell","type":"uint256"},{"internalType":"uint256","name":"RewardsBuy","type":"uint256"},{"internalType":"uint256","name":"RewardsSell","type":"uint256"},{"internalType":"uint256","name":"devBuy","type":"uint256"},{"internalType":"uint256","name":"devSell","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"updatePayoutToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"bonus","type":"uint256"}],"name":"updateStakingAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTransferFee","type":"uint256"}],"name":"updateTransferFee","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"}]

608060405260088054600162ffff0160a01b03191661dead17905560006009819055600a55601d805460ff199081166001908117909255620493e0601e556025805490911690911790556401a13b8600602655603c602a553480156200006457600080fd5b506040518060400160405280601e81526020017f444550542e204f4620474f5645524e4d454e5420454646494349454e435900008152506040518060400160405280600881526020016724442e4f2e472e4560c01b8152508160039081620000cd919062000b87565b506004620000dc828262000b87565b5050506000620000f16200089760201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600e8054733d920e616b92ec47fdbe9676337dd879a30fd3bd6001600160a01b031991821617909155600f8054733886989d984236d60296268befd1ef0fecf2ce13921691909117905560006016819055601381905560036017819055601481905560188290556015829055600160198190556012819055601a819055601b819055601c8390557310ed43c718714eb63d5aa57b78b54704e256024e926200021092620001fc91829084906200089b602090811b6200306b17901c565b6200089b60201b6200306b1790919060201c565b600c8190555062000242601b54620001fc601454620001fc6015546012546200089b60201b6200306b1790919060201c565b600b81905550308173ba2ae424d960c26247dd6c32edc70b295c744c436040516200026d9062000ad5565b6001600160a01b0393841681529183166020830152909116604082015260a060608201819052600c9082018190526b122227a3a2aa2920a1a5a2a960a11b60c0830181905260e06080840181905283019190915261010082015261012001604051809103906000f080158015620002e8573d6000803e3d6000fd5b50600d80546001600160a01b039283166001600160a01b0319918216179091556006805492841692909116821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000353573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000379919062000c53565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000402919062000c53565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000450573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000476919062000c53565b600780546001600160a01b0319166001600160a01b03929092169182179055620004a290600162000909565b600d5460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b158015620004e957600080fd5b505af1158015620004fe573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200054857600080fd5b505af11580156200055d573d6000803e3d6000fd5b5050600d5460085460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b158015620005ab57600080fd5b505af1158015620005c0573d6000803e3d6000fd5b5050600d54604051634e7b827f60e01b8152600060048201526001600160a01b039091169250634e7b827f9150602401602060405180830381865afa1580156200060e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000634919062000c7e565b50600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b1580156200067d57600080fd5b505af115801562000692573d6000803e3d6000fd5b5050600d54600e5460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b158015620006e057600080fd5b505af1158015620006f5573d6000803e3d6000fd5b5050600d546001600160a01b031691506331e79db090506200071f6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156200076157600080fd5b505af115801562000776573d6000803e3d6000fd5b5050306000908152601f60205260408082208054600160ff199182168117909255600d546001600160a01b0390811685528385208054831684179055600e54811685528385208054831684179055600f54168452828420805482168317905533845291909220805490911690911790555069152d02c7e14af68000009050620008126200080b6005546001600160a01b031690565b82620009d4565b62000820614e208262000ca2565b6010556200083262030d408262000ca2565b6011556001602460006200084e6005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905530815260249092529020805490911660011790555062000cec9050565b3390565b600080620008aa838562000cc5565b905083811015620009025760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b9392505050565b6001600160a01b03821660009081526020805260409020805460ff191682158015919091179091556200099857600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200097e57600080fd5b505af115801562000993573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b03821662000a2c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620008f9565b62000a48816002546200089b60201b6200306b1790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000a7b9183906200306b6200089b821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b6130e1806200599183390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000b0e57607f821691505b60208210810362000b2f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000ad057600081815260208120601f850160051c8101602086101562000b5e5750805b601f850160051c820191505b8181101562000b7f5782815560010162000b6a565b505050505050565b81516001600160401b0381111562000ba35762000ba362000ae3565b62000bbb8162000bb4845462000af9565b8462000b35565b602080601f83116001811462000bf3576000841562000bda5750858301515b600019600386901b1c1916600185901b17855562000b7f565b600085815260208120601f198616915b8281101562000c245788860151825594840194600190910190840162000c03565b508582101562000c435787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000c6657600080fd5b81516001600160a01b03811681146200090257600080fd5b60006020828403121562000c9157600080fd5b815180151581146200090257600080fd5b60008262000cc057634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111562000ce757634e487b7160e01b600052601160045260246000fd5b500190565b614c958062000cfc6000396000f3fe6080604052600436106104e55760003560e01c80637fdde05c11610281578063aa4704f31161015a578063d8032ed3116100cc578063f27fd25411610085578063f27fd25414610f7c578063f2fde38b14610f9c578063f5d3c79a14610fbc578063f637434214610fdc578063f8b45b0514610ff2578063fc6b151c1461100857600080fd5b8063d8032ed314610ea8578063dd62ed3e14610ec8578063e2f4560514610f0e578063e7841ec014610f24578063f11a24d314610f39578063f1c0ddff14610f4f57600080fd5b8063b74e3b111161011e578063b74e3b1114610df2578063ba079d4914610e12578063bb4c9f0b14610e32578063bb8d513114610e52578063d07a091c14610e68578063d5e3725114610e8857600080fd5b8063aa4704f314610ce8578063acb2ad6f14610d40578063ad56c13c14610d56578063b494298814610dad578063b62496f514610dc357600080fd5b80639a7a23d6116101f35780639ec1037e116101b75780639ec1037e14610c32578063a0d82dc514610c52578063a457c2d714610c68578063a694fc3a14610c88578063a8b9d24014610ca8578063a9059cbb14610cc857600080fd5b80639a7a23d614610ba65780639c1b8af514610bc65780639c3372ea14610bdc5780639c3b4fdc14610bfc5780639cefc1da14610c1257600080fd5b80638a8c523c116102455780638a8c523c14610b125780638ca2923a14610b275780638da5cb5b14610b3d5780638ea5220f14610b5b57806395451c2914610b7b57806395d89b4114610b9157600080fd5b80637fdde05c14610a72578063837ae2d014610a925780638577a6d514610ab2578063868730c714610ad2578063871c128d14610af257600080fd5b806349bd5a5e116103be57806364b0f65311610330578063715018a6116102e9578063715018a6146109ba57806372d8edf4146109cf57806375829def146109ef57806375f0a87414610a0f57806377a3b60914610a2f5780637d32f34214610a4557600080fd5b806364b0f65314610905578063679ca6e91461091a5780636843cd841461093a5780636d48467b1461095a578063700bb1911461097a57806370a082311461099a57600080fd5b80634fbee193116103825780634fbee193146108405780635124f874146108795780635a84c5eb1461088f5780635c234bb6146108af5780635ebf4db9146108c55780635eee4bae146108e557600080fd5b806349bd5a5e146107b65780634a62bb65146107d65780634a74bb02146107f05780634ada218b1461080a5780634e71d92d1461082b57600080fd5b80632307b44111610457578063313ce5671161041b578063313ce567146106f75780633599bb171461071357806339509351146107335780633f407b841461075357806340ffdd8014610769578063435c89e41461078957600080fd5b80632307b4411461066d57806323b872dd1461068d57806325cd3598146106ad5780632c1f5216146106c257806330bb4cff146106e257600080fd5b8063095ea7b3116104a9578063095ea7b3146105b25780630ef35b7e146105e25780631694505e1461060257806318160ddd146106225780631d7b1fb4146106415780631fa705311461065757600080fd5b806303fd2a45146104f157806305ca5f081461052e57806306fdde031461055057806308dfe8a514610572578063092316021461059257600080fd5b366104ec57005b600080fd5b3480156104fd57600080fd5b50600854610511906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561053a57600080fd5b5061054e61054936600461451b565b611028565b005b34801561055c57600080fd5b506105656110f9565b6040516105259190614534565b34801561057e57600080fd5b5061054e61058d3660046145ac565b61118b565b34801561059e57600080fd5b5061054e6105ad36600461451b565b611214565b3480156105be57600080fd5b506105d26105cd3660046145e5565b6112a3565b6040519015158152602001610525565b3480156105ee57600080fd5b5061054e6105fd366004614611565b6112ba565b34801561060e57600080fd5b50600654610511906001600160a01b031681565b34801561062e57600080fd5b506002545b604051908152602001610525565b34801561064d57600080fd5b50610633602a5481565b34801561066357600080fd5b50610633600a5481565b34801561067957600080fd5b5061054e610688366004614709565b61139f565b34801561069957600080fd5b506105d26106a83660046147cb565b611570565b3480156106b957600080fd5b506105116115d9565b3480156106ce57600080fd5b50600d54610511906001600160a01b031681565b3480156106ee57600080fd5b5061063361164c565b34801561070357600080fd5b5060405160128152602001610525565b34801561071f57600080fd5b5061054e61072e36600461480c565b6116ba565b34801561073f57600080fd5b506105d261074e3660046145e5565b611747565b34801561075f57600080fd5b5061063360095481565b34801561077557600080fd5b5061054e61078436600461480c565b61177d565b34801561079557600080fd5b506106336107a436600461451b565b60236020526000908152604090205481565b3480156107c257600080fd5b50600754610511906001600160a01b031681565b3480156107e257600080fd5b506025546105d29060ff1681565b3480156107fc57600080fd5b50601d546105d29060ff1681565b34801561081657600080fd5b506008546105d290600160b01b900460ff1681565b34801561083757600080fd5b5061054e6117d8565b34801561084c57600080fd5b506105d261085b366004614829565b6001600160a01b03166000908152601f602052604090205460ff1690565b34801561088557600080fd5b5061063360175481565b34801561089b57600080fd5b5061054e6108aa36600461451b565b611850565b3480156108bb57600080fd5b5061063360165481565b3480156108d157600080fd5b5061054e6108e036600461451b565b6118ab565b3480156108f157600080fd5b5061054e61090036600461451b565b611906565b34801561091157600080fd5b50610633611948565b34801561092657600080fd5b5061054e61093536600461480c565b611992565b34801561094657600080fd5b50610633610955366004614829565b6119cf565b34801561096657600080fd5b506105d2610975366004614829565b611a3f565b34801561098657600080fd5b5061054e61099536600461451b565b611aaf565b3480156109a657600080fd5b506106336109b5366004614829565b611b81565b3480156109c657600080fd5b5061054e611b9c565b3480156109db57600080fd5b5061054e6109ea366004614829565b611c10565b3480156109fb57600080fd5b5061054e610a0a366004614829565b611c6c565b348015610a1b57600080fd5b50600e54610511906001600160a01b031681565b348015610a3b57600080fd5b5061063360195481565b348015610a5157600080fd5b50610633610a60366004614829565b60226020526000908152604090205481565b348015610a7e57600080fd5b5061054e610a8d3660046145ac565b611d21565b348015610a9e57600080fd5b5061054e610aad366004614846565b611d76565b348015610abe57600080fd5b5061054e610acd36600461451b565b611f20565b348015610ade57600080fd5b5061054e610aed36600461480c565b611fd7565b348015610afe57600080fd5b5061054e610b0d36600461451b565b61200f565b348015610b1e57600080fd5b5061054e61208b565b348015610b3357600080fd5b5061063360135481565b348015610b4957600080fd5b506005546001600160a01b0316610511565b348015610b6757600080fd5b50600f54610511906001600160a01b031681565b348015610b8757600080fd5b5061063360145481565b348015610b9d57600080fd5b5061056561210e565b348015610bb257600080fd5b5061054e610bc13660046145ac565b61211d565b348015610bd257600080fd5b50610633601e5481565b348015610be857600080fd5b5061054e610bf736600461480c565b612155565b348015610c0857600080fd5b50610633601a5481565b348015610c1e57600080fd5b5061054e610c2d36600461480c565b6121b1565b348015610c3e57600080fd5b5061054e610c4d366004614829565b612247565b348015610c5e57600080fd5b50610633601b5481565b348015610c7457600080fd5b506105d2610c833660046145e5565b61231e565b348015610c9457600080fd5b5061054e610ca336600461451b565b61236d565b348015610cb457600080fd5b50610633610cc3366004614829565b612590565b348015610cd457600080fd5b506105d2610ce33660046145e5565b6125c3565b348015610cf457600080fd5b50610d2b610d03366004614829565b6001600160a01b03166000908152602260209081526040808320546021909252909120549091565b60408051928352602083019190915201610525565b348015610d4c57600080fd5b50610633601c5481565b348015610d6257600080fd5b50610d76610d71366004614829565b6125d0565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610525565b348015610db957600080fd5b5061063360295481565b348015610dcf57600080fd5b506105d2610dde366004614829565b602080526000908152604090205460ff1681565b348015610dfe57600080fd5b5061054e610e0d36600461451b565b612660565b348015610e1e57600080fd5b506105d2610e2d366004614829565b6126f0565b348015610e3e57600080fd5b5061054e610e4d366004614709565b612723565b348015610e5e57600080fd5b5061063360125481565b348015610e7457600080fd5b5061054e610e83366004614829565b612bd0565b348015610e9457600080fd5b5061054e610ea336600461480c565b612cc5565b348015610eb457600080fd5b5061054e610ec3366004614829565b612d47565b348015610ed457600080fd5b50610633610ee33660046148ae565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610f1a57600080fd5b5061063360115481565b348015610f3057600080fd5b50610633612e0a565b348015610f4557600080fd5b5061063360185481565b348015610f5b57600080fd5b50610633610f6a366004614829565b60216020526000908152604090205481565b348015610f8857600080fd5b50610d76610f9736600461451b565b612e54565b348015610fa857600080fd5b5061054e610fb7366004614829565b612e92565b348015610fc857600080fd5b5061054e610fd736600461480c565b612f7d565b348015610fe857600080fd5b5061063360155481565b348015610ffe57600080fd5b5061063360105481565b34801561101457600080fd5b5061054e61102336600461451b565b612fb5565b6005546001600160a01b0316331461105b5760405162461bcd60e51b8152600401611052906148dc565b60405180910390fd5b61106d81670de0b6b3a7640000614927565b90506000611088600954600a5461306b90919063ffffffff16565b905060006110ab826110a5600a54866130d190919063ffffffff16565b90613153565b905060006110c8836110a5600954876130d190919063ffffffff16565b90506110d384613195565b600a546110e09083613495565b600a556009546110f09082613495565b60095550505050565b60606003805461110890614946565b80601f016020809104026020016040519081016040528092919081815260200182805461113490614946565b80156111815780601f1061115657610100808354040283529160200191611181565b820191906000526020600020905b81548152906001019060200180831161116457829003601f168201915b5050505050905090565b6005546001600160a01b031633146111b55760405162461bcd60e51b8152600401611052906148dc565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b0316331461123e5760405162461bcd60e51b8152600401611052906148dc565b600581101561128f5760405162461bcd60e51b815260206004820152601860248201527f63616e206e65766572206265207365742062656c6f77203500000000000000006044820152606401611052565b61129d81633b9aca00614927565b60265550565b60006112b03384846134d7565b5060015b92915050565b6005546001600160a01b031633146112e45760405162461bcd60e51b8152600401611052906148dc565b6000828152602360205260409020548190036112ff57600080fd5b60648111156113505760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e6720626f6e75732063616e2774206578636565642031303000006044820152606401611052565b60008281526023602090815260409182902083905581518481529081018390527f065c0eec5c5d031ee25323575d53db5536226ab058b74d8bdb03c517dd4f605d910160405180910390a15050565b6005546001600160a01b031633146113c95760405162461bcd60e51b8152600401611052906148dc565b805182511461141a5760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401611052565b60c8825111156114775760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b6064820152608401611052565b60005b825181101561156b57600083828151811061149757611497614980565b6020026020010151905060008383815181106114b5576114b5614980565b6020026020010151670de0b6b3a76400006114d09190614927565b90506114dd3383836135fc565b600d546001600160a01b031663e30443bc836114f881611b81565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561153e57600080fd5b505af1158015611552573d6000803e3d6000fd5b505050505050808061156390614996565b91505061147a565b505050565b600061157d848484613705565b6115cf84336115ca85604051806060016040528060288152602001614c13602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906140eb565b6134d7565b5060019392505050565b600d54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa158015611623573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164791906149af565b905090565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611696573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164791906149cc565b6005546001600160a01b031633146116e45760405162461bcd60e51b8152600401611052906148dc565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b15801561172c57600080fd5b505af1158015611740573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916112b09185906115ca908661306b565b6005546001600160a01b031633146117a75760405162461bcd60e51b8152600401611052906148dc565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd8090602401611712565b600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611829573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184d91906149e5565b50565b6005546001600160a01b0316331461187a5760405162461bcd60e51b8152600401611052906148dc565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb90602401611712565b6005546001600160a01b031633146118d55760405162461bcd60e51b8152600401611052906148dc565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db990602401611712565b6005546001600160a01b031633146119305760405162461bcd60e51b8152600401611052906148dc565b61194281670de0b6b3a7640000614927565b60115550565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611696573d6000803e3d6000fd5b6005546001600160a01b031633146119bc5760405162461bcd60e51b8152600401611052906148dc565b6025805460ff1916911515919091179055565b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611a1b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b491906149cc565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa158015611a8b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b491906149e5565b600d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611b02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b269190614a02565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314611bc65760405162461bcd60e51b8152600401611052906148dc565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314611c3a5760405162461bcd60e51b8152600401611052906148dc565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401611712565b6005546001600160a01b03163314611c965760405162461bcd60e51b8152600401611052906148dc565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015611cdd57600080fd5b505af1158015611cf1573d6000803e3d6000fd5b5050506001600160a01b0382166000908152601f60205260409020805460ff191660011790555061184d81612e92565b6005546001600160a01b03163314611d4b5760405162461bcd60e51b8152600401611052906148dc565b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611da05760405162461bcd60e51b8152600401611052906148dc565b60168a90556017889055601886905560198490556013899055601487905560158590556012839055601a829055601b819055611de881611de28981878a61306b565b9061306b565b600b81905550611e11601a54611de2601754611de260185460195461306b90919063ffffffff16565b600c55600b54602310801590611e2a57506023600c5411155b611e875760405162461bcd60e51b815260206004820152602860248201527f746f74616c20666565732063616e6e6f7420657863656564203335252073656c6044820152676c206f722062757960c01b6064820152608401611052565b601354601454601554601254601654601754601854601954601a54601b54604080519a8b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301526101208201527f07cec4532bdb36ce729ae72905c09f7bfbf8682c2cc2f1999f745188d9975122906101400160405180910390a150505050505050505050565b6005546001600160a01b03163314611f4a5760405162461bcd60e51b8152600401611052906148dc565b600f811115611f9b5760405162461bcd60e51b815260206004820152601e60248201527f7472616e73666572206665652063616e6e6f74206578636565642031352500006044820152606401611052565b601c8190556040518181527f6fbeac6c79c640ca4f5f47271bd7a36c7eb83076224c65a3b3378c8844720343906020015b60405180910390a150565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d63990604401611712565b6005546001600160a01b031633146120395760405162461bcd60e51b8152600401611052906148dc565b62030d40811015801561204f5750620f42408111155b61205857600080fd5b601e5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601e55565b6005546001600160a01b031633146120b55760405162461bcd60e51b8152600401611052906148dc565b600854600160b01b900460ff16156120cc57600080fd5b6008805460ff60b01b1916600160b01b179055436029556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b60606004805461110890614946565b6005546001600160a01b031633146121475760405162461bcd60e51b8152600401611052906148dc565b6121518282614125565b5050565b6005546001600160a01b0316331461217f5760405162461bcd60e51b8152600401611052906148dc565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea90602401611712565b6005546001600160a01b031633146121db5760405162461bcd60e51b8152600401611052906148dc565b801515600860159054906101000a900460ff161515036121fa57600080fd5b60088054821515600160a81b0260ff60a81b199091161790556040517f0d240c24014ec8c204fc1bdcc286f7d01fd2ab6a07c558a9b2d3f12904323a8790611fcc90831515815260200190565b6005546001600160a01b031633146122715760405162461bcd60e51b8152600401611052906148dc565b600d54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b1580156122b857600080fd5b505af11580156122cc573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc9050826122ed816141ed565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611712565b60006112b033846115ca85604051806060016040528060258152602001614c3b602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906140eb565b600854600160a81b900460ff166123bf5760405162461bcd60e51b815260206004820152601660248201527514dd185ada5b99c81a5cc81b9bdd08195b98589b195960521b6044820152606401611052565b600081815260236020526040812054900361241c5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207374616b696e67206475726174696f6e00000000000000006044820152606401611052565b612426428261306b565b336000908152602260205260409020541061248f5760405162461bcd60e51b8152602060048201526024808201527f616c7265616479207374616b656420666f722061206c6f6e67657220647572616044820152633a34b7b760e11b6064820152608401611052565b6000818152602360209081526040808320543384526021909252909120556124b7428261306b565b33600081815260226020526040902091909155600d546001600160a01b03169063e30443bc906124e6816141ed565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561252c57600080fd5b505af1158015612540573d6000803e3d6000fd5b5050505061254b3390565b6001600160a01b03167f13dd201d7da4f9b31a9064a09abc1a6ce420dacd837a77abafaec5bd9d28d2c88260405161258591815260200190565b60405180910390a250565b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016119fe565b60006112b0338484613705565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa158015612628573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264c9190614a30565b949c939b5091995097509550909350915050565b6005546001600160a01b0316331461268a5760405162461bcd60e51b8152600401611052906148dc565b61012c8111156126eb5760405162461bcd60e51b815260206004820152602660248201527f636f6f6c646f776e2074696d65722063616e6e6f74206578636565642035206d604482015265696e7574657360d01b6064820152608401611052565b602a55565b600d5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d4990602401611a6e565b6005546001600160a01b0316331461274d5760405162461bcd60e51b8152600401611052906148dc565b80518251146127b25760405162461bcd60e51b815260206004820152602b60248201527f436f6e7472696275746f727320616e642062616c616e636573206d757374206260448201526a652073616d652073697a6560a81b6064820152608401611052565b60c8825111156128135760405162461bcd60e51b815260206004820152602660248201527f436f6e7472696275746f72206c697374206c656e677468206d7573742062652060448201526503c3d203230360d41b6064820152608401611052565b6000805b82518160ff16101561286657612852838260ff168151811061283b5761283b614980565b60200260200101518361306b90919063ffffffff16565b91508061285e81614a83565b915050612817565b508061287133611b81565b10156128d45760405162461bcd60e51b815260206004820152602c60248201527f4163636f756e742062616c616e6365206d757374206265203e3d2073756d206f60448201526b033103130b630b731b2b997160a51b6064820152608401611052565b3360009081526001602090815260408083203084529091529020548111156129565760405162461bcd60e51b815260206004820152602f60248201527f436f6e747261637420616c6c6f77616e6365206d757374206265203e3d20737560448201526e0369037b3103130b630b731b2b9971608d1b6064820152608401611052565b60008060005b85518160ff161015612bc857858160ff168151811061297d5761297d614980565b6020026020010151925060006001600160a01b0316836001600160a01b0316141580156129b5575061dead6001600160a01b03841614155b612a015760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742061697264726f7020746f2061206465616420616464726573736044820152606401611052565b612a0a83611b81565b9150306001600160a01b03166323b872dd3385888560ff1681518110612a3257612a32614980565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015612a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab591906149e5565b50848160ff1681518110612acb57612acb614980565b602002602001015182612ade9190614aa2565b612ae784611b81565b14612b4d5760405162461bcd60e51b815260206004820152603060248201527f436f6e7472696275746f72206d75737420726563696576652066756c6c20626160448201526f06c616e6365206f662061697264726f760841b6064820152608401611052565b7f8c32c568416fcf97be35ce5b27844cfddcd63a67a1a602c3595ba5dac38f303a83868360ff1681518110612b8457612b84614980565b6020026020010151604051612bae9291906001600160a01b03929092168252602082015260400190565b60405180910390a180612bc081614a83565b91505061295c565b505050505050565b6005546001600160a01b03163314612bfa5760405162461bcd60e51b8152600401611052906148dc565b6001600160a01b0381811660008181526024602081815260408084208054600160ff199182168117909255601f9093529381902080549092169093179055600d54915163031e79db60e41b815260048101939093529216916331e79db09101600060405180830381600087803b158015612c7357600080fd5b505af1158015612c87573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c592506020019050611fcc565b6005546001600160a01b03163314612cef5760405162461bcd60e51b8152600401611052906148dc565b601d5481151560ff909116151503612d0657600080fd5b601d805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef90602001611fcc565b6005546001600160a01b03163314612d715760405162461bcd60e51b8152600401611052906148dc565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b158015612db857600080fd5b505af1158015612dcc573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050611fcc565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611696573d6000803e3d6000fd5b600d54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd9060240161260b565b6005546001600160a01b03163314612ebc5760405162461bcd60e51b8152600401611052906148dc565b6001600160a01b038116612f215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611052565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a0490604401611712565b6005546001600160a01b03163314612fdf5760405162461bcd60e51b8152600401611052906148dc565b612ff181670de0b6b3a7640000614927565b90506107d06002546130039190614aba565b8110156130665760405162461bcd60e51b815260206004820152602b60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c65737360448201526a207468616e20302e30352560a81b6064820152608401611052565b601055565b6000806130788385614aa2565b9050838110156130ca5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401611052565b9392505050565b6000826000036130e3575060006112b4565b60006130ef8385614927565b9050826130fc8583614aba565b146130ca5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401611052565b60006130ca83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614246565b806000036131a05750565b6131a981614274565b60006131c2600954600a5461306b90919063ffffffff16565b60195490915060019081908190600090819081901561322357613220601a546017546019546131f19190614aa2565b6131fb9190614aa2565b6110a560195461321a8b6110a5600a54476130d190919063ffffffff16565b906130d1565b91505b6012541561326d5761326a601b546014546012546132419190614aa2565b61324b9190614aa2565b6110a560125461321a8b6110a5600954476130d190919063ffffffff16565b90505b613277828261306b565b925082156132d757600d546040516001600160a01b03909116908490600081818185875af1925050503d80600081146132cc576040519150601f19603f3d011682016040523d82523d6000602084013e6132d1565b606091505b50909650505b60006132f0601a5460175461306b90919063ffffffff16565b601b546014546132ff9161306b565b6133099190614aa2565b9050600081156133205761331d4783613153565b90505b60008161333a60145460175461306b90919063ffffffff16565b6133449190614927565b9050600082613360601b54601a5461306b90919063ffffffff16565b61336a9190614927565b905081156133ca57600e546040516001600160a01b03909116908390600081818185875af1925050503d80600081146133bf576040519150601f19603f3d011682016040523d82523d6000602084013e6133c4565b606091505b50909950505b801561342857600f546040516001600160a01b03909116908290600081818185875af1925050503d806000811461341d576040519150601f19603f3d011682016040523d82523d6000602084013e613422565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd0876134548385614aa2565b8c801561345e57508b5b801561346757508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b60006130ca83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506140eb565b6001600160a01b0383166135395760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611052565b6001600160a01b03821661359a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611052565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166136225760405162461bcd60e51b815260040161105290614adc565b6001600160a01b0382166136485760405162461bcd60e51b815260040161105290614b21565b61368581604051806060016040528060268152602001614bed602691396001600160a01b03861660009081526020819052604090205491906140eb565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546136b4908261306b565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016135ef565b6001600160a01b03831661372b5760405162461bcd60e51b815260040161105290614adc565b6001600160a01b0382166137515760405162461bcd60e51b815260040161105290614b21565b6001600160a01b038316600090815260246020526040812054819081908190819060ff166137d257600854600160b01b900460ff166137d25760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401611052565b856000036137f0576137e6888860006135fc565b5050505050505050565b600854600160a01b900460ff1615801561382357506001600160a01b0388166000908152601f602052604090205460ff16155b801561384857506001600160a01b0387166000908152601f602052604090205460ff16155b15613fe2576001600160a01b03808816600090815260208052604080822054928b16825290205460ff918216911680158015613882575081155b156139c85760006138a360646110a5601c548c6130d190919063ffffffff16565b90506138af8982613495565b98506138bc8b30836135fc565b6138c78b8b8b6135fc565b600d546001600160a01b031663e30443bc8c6138e2816141ed565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561392857600080fd5b505af115801561393c573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508b61395d816141ed565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156139a357600080fd5b505af11580156139b7573d6000803e3d6000fd5b505050505050505050505050505050565b801580156139df5750600854600160a81b900460ff165b15613a96576001600160a01b038a16600090815260226020526040902054421015613a4c5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e7320617265207374616b656420616e64206c6f636b6564210000006044820152606401611052565b6001600160a01b038a1660009081526022602052604090205415613a91576001600160a01b038a16600090815260226020908152604080832083905560219091528120555b613cef565b8115613b3f57601254601354601454601554601b54602554949b509299509097509550935060ff1615613a9157602a5432600090815260286020526040902054613ae09190614aa2565b421015613b285760405162461bcd60e51b8152602060048201526016602482015275636f6f6c646f776e20706572696f642061637469766560501b6044820152606401611052565b326000908152602860205260409020429055613cef565b8015613cef57601954601654601754601854601a54602554949b509299509097509550935060ff1615613c7857602954613b7a90601e614aa2565b4311613bbd5760405162461bcd60e51b8152602060048201526012602482015271796f75207368616c6c206e6f74207061737360701b6044820152606401611052565b6026543a1115613c0f5760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e00000000000000006044820152606401611052565b32600090815260276020526040902054439003613c655760405162461bcd60e51b8152602060048201526014602482015273546f6f206d616e7920545820696e20626c6f636b60601b6044820152606401611052565b3260009081526027602052604090204390555b6000613c838a611b81565b601054909150613c938a83614aa2565b1115613ced5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401611052565b505b6000613d1084613cff8888614aa2565b613d099190614aa2565b899061306b565b90506000613d1d30611b81565b60115490915081108015908190613d4c57506001600160a01b038d16600090815260208052604090205460ff16155b15613e65576008805460ff60a01b1916600160a01b179055601d5460ff168015613d765750600087115b8015613d8457506000600c54115b15613e36576000613da2600954600a5461306b90919063ffffffff16565b90506000613dbf826110a5600a54876130d190919063ffffffff16565b90506000613ddc836110a5600954886130d190919063ffffffff16565b90506000613df9600c546110a58d866130d190919063ffffffff16565b90506000613e16600b546110a58e866130d190919063ffffffff16565b90506000613e24828461306b565b9050613e2f816143c6565b5050505050505b6000613e4130611b81565b9050613e4c81613195565b506000600a8190556009556008805460ff60a01b191690555b6000613e7660646110a58e876130d1565b905060008a15613ec9576064613e8c8e8d6130d1565b613e969190614aba565b9050613eb88f600860009054906101000a90046001600160a01b0316836135fc565b600254613ec59082613495565b6002555b613edd613ed68284614aa2565b8e90613495565b9c508615613efa57600954613ef2908361306b565b600955613f0b565b600a54613f07908361306b565b600a555b613f168f30846135fc565b601e54600d546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015613f83575060408051601f3d908101601f19168201909252613f8091810190614a02565b60015b15613fd95760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b50505050505050505b613fed8888886135fc565b600d546001600160a01b031663e30443bc89614008816141ed565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561404e57600080fd5b505af1158015614062573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905088614083816141ed565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156140c957600080fd5b505af11580156140dd573d6000803e3d6000fd5b505050505050505050505050565b6000818484111561410f5760405162461bcd60e51b81526004016110529190614534565b50600061411c8486614b64565b95945050505050565b6001600160a01b03821660009081526020805260409020805460ff191682158015919091179091556141b157600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801561419857600080fd5b505af11580156141ac573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600854600090600160a81b900460ff1661420f5761420a82611b81565b6112b4565b6001600160a01b0382166000908152602160205260409020546112b4906064906110a59061423d908361306b565b61321a86611b81565b600081836142675760405162461bcd60e51b81526004016110529190614534565b50600061411c8486614aba565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106142a9576142a9614980565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015614302573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061432691906149af565b8160018151811061433957614339614980565b6001600160a01b03928316602091820292909201015260065461435f91309116846134d7565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790614398908590600090869030904290600401614b7b565b600060405180830381600087803b1580156143b257600080fd5b505af1158015612bc8573d6000803e3d6000fd5b60006143d3826002613153565b905060006143e18383613495565b9050476143ed83614274565b60006143f94783613495565b9050614405838261444d565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b6006546144659030906001600160a01b0316846134d7565b6006546001600160a01b031663f305d71982308560008061448e6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156144f6573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117409190614a02565b60006020828403121561452d57600080fd5b5035919050565b600060208083528351808285015260005b8181101561456157858101830151858201604001528201614545565b81811115614573576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461184d57600080fd5b801515811461184d57600080fd5b600080604083850312156145bf57600080fd5b82356145ca81614589565b915060208301356145da8161459e565b809150509250929050565b600080604083850312156145f857600080fd5b823561460381614589565b946020939093013593505050565b6000806040838503121561462457600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561467257614672614633565b604052919050565b600067ffffffffffffffff82111561469457614694614633565b5060051b60200190565b600082601f8301126146af57600080fd5b813560206146c46146bf8361467a565b614649565b82815260059290921b840181019181810190868411156146e357600080fd5b8286015b848110156146fe57803583529183019183016146e7565b509695505050505050565b6000806040838503121561471c57600080fd5b823567ffffffffffffffff8082111561473457600080fd5b818501915085601f83011261474857600080fd5b813560206147586146bf8361467a565b82815260059290921b8401810191818101908984111561477757600080fd5b948201945b8386101561479e57853561478f81614589565b8252948201949082019061477c565b965050860135925050808211156147b457600080fd5b506147c18582860161469e565b9150509250929050565b6000806000606084860312156147e057600080fd5b83356147eb81614589565b925060208401356147fb81614589565b929592945050506040919091013590565b60006020828403121561481e57600080fd5b81356130ca8161459e565b60006020828403121561483b57600080fd5b81356130ca81614589565b6000806000806000806000806000806101408b8d03121561486657600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b600080604083850312156148c157600080fd5b82356148cc81614589565b915060208301356145da81614589565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561494157614941614911565b500290565b600181811c9082168061495a57607f821691505b60208210810361497a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000600182016149a8576149a8614911565b5060010190565b6000602082840312156149c157600080fd5b81516130ca81614589565b6000602082840312156149de57600080fd5b5051919050565b6000602082840312156149f757600080fd5b81516130ca8161459e565b600080600060608486031215614a1757600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c08789031215614a4957600080fd5b8651614a5481614589565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b600060ff821660ff8103614a9957614a99614911565b60010192915050565b60008219821115614ab557614ab5614911565b500190565b600082614ad757634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600082821015614b7657614b76614911565b500390565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015614bcb5784516001600160a01b031683529383019391830191600101614ba6565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220647cd75e31308f927bbb4efb2ffb6b79c313f218899c382219fc762c5e1f070664736f6c634300080f003360806040526012805460ff60b01b191690553480156200001e57600080fd5b50604051620030e1380380620030e1833981016040819052620000419162000241565b8181818160036200005383826200037b565b5060046200006282826200037b565b50505050506000620000796200015760201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506013620000d583826200037b565b506014620000e482826200037b565b505060128054601680546001600160a01b03199081166001600160a01b039889161790915568056bc75e2d6310000060188190556019556015805490911695871695909517909455600160a01b929094166001600160a81b0319909316929092171760ff60a81b19169091555062000447565b3390565b6001600160a01b03811681146200017157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200019c57600080fd5b81516001600160401b0380821115620001b957620001b962000174565b604051601f8301601f19908116603f01168101908282118183101715620001e457620001e462000174565b816040528381526020925086838588010111156200020157600080fd5b600091505b8382101562000225578582018301518183018401529082019062000206565b83821115620002375760008385830101525b9695505050505050565b600080600080600060a086880312156200025a57600080fd5b855162000267816200015b565b60208701519095506200027a816200015b565b60408701519094506200028d816200015b565b60608701519093506001600160401b0380821115620002ab57600080fd5b620002b989838a016200018a565b93506080880151915080821115620002d057600080fd5b50620002df888289016200018a565b9150509295509295909350565b600181811c908216806200030157607f821691505b6020821081036200032257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200037657600081815260208120601f850160051c81016020861015620003515750805b601f850160051c820191505b8181101562000372578281556001016200035d565b5050505b505050565b81516001600160401b0381111562000397576200039762000174565b620003af81620003a88454620002ec565b8462000328565b602080601f831160018114620003e75760008415620003ce5750858301515b600019600386901b1c1916600185901b17855562000372565b600085815260208120601f198616915b828110156200041857888601518255948401946001909101908401620003f7565b5085821015620004375787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612c8a80620004576000396000f3fe60806040526004361061031e5760003560e01c80636b69163b116101ab578063a457c2d7116100f7578063d8032ed311610095578063e7841ec01161006f578063e7841ec0146109ed578063f2fde38b14610a02578063fbcbc0f114610a22578063ffb2c47914610a4257600080fd5b8063d8032ed314610967578063dd62ed3e14610987578063e30443bc146109cd57600080fd5b8063aafd847a116100d1578063aafd847a146108d1578063b22f8a0414610907578063ba079d4914610927578063bc4c4b371461094757600080fd5b8063a457c2d714610871578063a8b9d24014610891578063a9059cbb146108b157600080fd5b80638bc1d6391161016457806395d89b411161013e57806395d89b41146107fa5780639c3372ea1461080f5780639eec101e1461082f578063a42340691461085057600080fd5b80638bc1d6391461079c5780638da5cb5b146107bc57806391b89fba146107da57600080fd5b80636b69163b146106cb5780636d48467b146106fb57806370a082311461071b578063715018a61461075157806374c13fda1461076657806385a6b3ae1461078657600080fd5b80633009a6091161026a57806341808904116102235780635a84c5eb116101fd5780635a84c5eb146106565780635ebf4db91461067657806365b8dbc0146106965780636a474002146106b657600080fd5b806341808904146105ae5780634e7b827f146105cf5780635183d6fd146105ff57600080fd5b80633009a609146104fc578063313ce5671461051257806331e79db01461052e5780633599bb171461054e578063395093511461056e57806340ffdd801461058e57600080fd5b80631694505e116102d7578063226cfa3d116102b1578063226cfa3d1461047157806323b872dd1461049e57806325cd3598146104be57806327ce0147146104dc57600080fd5b80631694505e1461040c57806318160ddd1461042c5780631d4ff89a1461044157600080fd5b806303c833021461033257806306fdde031461033a5780630928847114610365578063095ea7b31461038557806309bbedde146103b557806313d05e6e146103d457600080fd5b3661032d5761032b610a7d565b005b600080fd5b61032b610a7d565b34801561034657600080fd5b5061034f610b10565b60405161035c91906127bd565b60405180910390f35b34801561037157600080fd5b5061032b61038036600461282a565b610ba2565b34801561039157600080fd5b506103a56103a0366004612847565b610bf6565b604051901515815260200161035c565b3480156103c157600080fd5b50600a545b60405190815260200161035c565b3480156103e057600080fd5b506016546103f4906001600160a01b031681565b6040516001600160a01b03909116815260200161035c565b34801561041857600080fd5b506015546103f4906001600160a01b031681565b34801561043857600080fd5b506002546103c6565b34801561044d57600080fd5b506103a561045c36600461282a565b60116020526000908152604090205460ff1681565b34801561047d57600080fd5b506103c661048c36600461282a565b60176020526000908152604090205481565b3480156104aa57600080fd5b506103a56104b9366004612873565b610c0d565b3480156104ca57600080fd5b506012546001600160a01b03166103f4565b3480156104e857600080fd5b506103c66104f736600461282a565b610c76565b34801561050857600080fd5b506103c6600e5481565b34801561051e57600080fd5b506040516012815260200161035c565b34801561053a57600080fd5b5061032b61054936600461282a565b610cd2565b34801561055a57600080fd5b5061032b6105693660046128c2565b610d6c565b34801561057a57600080fd5b506103a5610589366004612847565b610e0d565b34801561059a57600080fd5b5061032b6105a93660046128c2565b610e43565b3480156105ba57600080fd5b506012546103a590600160a81b900460ff1681565b3480156105db57600080fd5b506103a56105ea36600461282a565b600f6020526000908152604090205460ff1681565b34801561060b57600080fd5b5061061f61061a3660046128df565b610ed9565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c00161035c565b34801561066257600080fd5b5061032b6106713660046128df565b610f39565b34801561068257600080fd5b5061032b6106913660046128df565b610f7b565b3480156106a257600080fd5b5061032b6106b136600461282a565b610fbd565b3480156106c257600080fd5b5061032b611009565b3480156106d757600080fd5b506103a56106e636600461282a565b60106020526000908152604090205460ff1681565b34801561070757600080fd5b506103a561071636600461282a565b6110ab565b34801561072757600080fd5b506103c661073636600461282a565b6001600160a01b031660009081526020819052604090205490565b34801561075d57600080fd5b5061032b6110f7565b34801561077257600080fd5b506012546103f4906001600160a01b031681565b34801561079257600080fd5b506103c660085481565b3480156107a857600080fd5b5061032b6107b73660046128f8565b61116b565b3480156107c857600080fd5b506009546001600160a01b03166103f4565b3480156107e657600080fd5b506103c66107f536600461282a565b6111c0565b34801561080657600080fd5b5061034f6111cb565b34801561081b57600080fd5b5061032b61082a3660046128c2565b6111da565b34801561083b57600080fd5b506012546103a590600160a01b900460ff1681565b34801561085c57600080fd5b506012546103a590600160b01b900460ff1681565b34801561087d57600080fd5b506103a561088c366004612847565b611270565b34801561089d57600080fd5b506103c66108ac36600461282a565b6112bf565b3480156108bd57600080fd5b506103a56108cc366004612847565b6112eb565b3480156108dd57600080fd5b506103c66108ec36600461282a565b6001600160a01b031660009081526007602052604090205490565b34801561091357600080fd5b5061032b6109223660046128f8565b6112f8565b34801561093357600080fd5b506103a561094236600461282a565b61134d565b34801561095357600080fd5b506103a56109623660046128f8565b611399565b34801561097357600080fd5b5061032b61098236600461282a565b61151a565b34801561099357600080fd5b506103c66109a2366004612931565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156109d957600080fd5b5061032b6109e8366004612847565b611566565b3480156109f957600080fd5b50600e546103c6565b348015610a0e57600080fd5b5061032b610a1d36600461282a565b6115fe565b348015610a2e57600080fd5b5061061f610a3d36600461282a565b6116e9565b348015610a4e57600080fd5b50610a62610a5d3660046128df565b611798565b6040805193845260208401929092529082015260600161035c565b6000610a8860025490565b11610a9257600080fd5b3415610b0e57610ac5610aa460025490565b610ab234600160801b6118be565b610abc9190612975565b60055490611947565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600854610b0a9034611947565b6008555b565b606060138054610b1f90612997565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b90612997565b8015610b985780601f10610b6d57610100808354040283529160200191610b98565b820191906000526020600020905b815481529060010190602001808311610b7b57829003601f168201915b5050505050905090565b6009546001600160a01b03163314610bd55760405162461bcd60e51b8152600401610bcc906129d1565b60405180910390fd5b6001600160a01b03166000908152600f60205260409020805460ff19169055565b6000610c033384846119a6565b5060015b92915050565b6000610c1a848484611aca565b610c6c8433610c6785604051806060016040528060288152602001612c08602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611b2b565b6119a6565b5060019392505050565b6001600160a01b03811660009081526006602090815260408083205491839052822054600554600160801b92610cc892610cc392610cbd91610cb891906118be565b611b65565b90611b75565b611bb3565b610c079190612975565b6009546001600160a01b03163314610cfc5760405162461bcd60e51b8152600401610bcc906129d1565b6001600160a01b0381166000908152600f60205260408120805460ff19166001179055610d2a908290611bc6565b610d35600a82611c25565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6009546001600160a01b03163314610d965760405162461bcd60e51b8152600401610bcc906129d1565b801515601260169054906101000a900460ff16151503610db557600080fd5b60128054821515600160b01b0260ff60b01b199091161790556040517f3da2593f2c4724acfbd754045321e852cad26f3974834b1890045530f89c21b390610e0290831515815260200190565b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c03918590610c679086611947565b6009546001600160a01b03163314610e6d5760405162461bcd60e51b8152600401610bcc906129d1565b801515601260159054906101000a900460ff16151503610e8c57600080fd5b60128054821515600160a81b0260ff60a81b199091161790556040517fc138a28750b971696f46ea59731c471ef1e08e4015404afdb139fd2e87dca1bb90610e0290831515815260200190565b600080600080600080610eeb600a5490565b8710610f0a575060009450600019935083925084915081905080610f30565b6000610f17600a89611d60565b9050610f22816116e9565b965096509650965096509650505b91939550919395565b6009546001600160a01b03163314610f635760405162461bcd60e51b8152600401610bcc906129d1565b610f7581670de0b6b3a7640000612a06565b60185550565b6009546001600160a01b03163314610fa55760405162461bcd60e51b8152600401610bcc906129d1565b610fb781670de0b6b3a7640000612a06565b60195550565b6009546001600160a01b03163314610fe75760405162461bcd60e51b8152600401610bcc906129d1565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b60405162461bcd60e51b815260206004820152606560248201527f245350545f4469766964656e645f547261636b65723a2077697468647261774460448201527f69766964656e642064697361626c65642e20557365207468652027636c61696d60648201527f272066756e6374696f6e206f6e20746865206d61696e204669736820636f6e746084820152643930b1ba1760d91b60a482015260c401610bcc565b6009546000906001600160a01b031633146110d85760405162461bcd60e51b8152600401610bcc906129d1565b506001600160a01b031660009081526010602052604090205460ff1690565b6009546001600160a01b031633146111215760405162461bcd60e51b8152600401610bcc906129d1565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b6009546001600160a01b031633146111955760405162461bcd60e51b8152600401610bcc906129d1565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6000610c07826112bf565b606060148054610b1f90612997565b6009546001600160a01b031633146112045760405162461bcd60e51b8152600401610bcc906129d1565b801515601260149054906101000a900460ff1615150361122357600080fd5b60128054821515600160a01b0260ff60a01b199091161790556040517f8d34c313963017194ed726d050e868657d0e2d2c6748d13e358cd4b89d4ee7c890610e0290831515815260200190565b6000610c033384610c6785604051806060016040528060258152602001612c30602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611b2b565b6001600160a01b038116600090815260076020526040812054610c07906112e584610c76565b90611d93565b6000610c03338484611aca565b6009546001600160a01b031633146113225760405162461bcd60e51b8152600401610bcc906129d1565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6009546000906001600160a01b0316331461137a5760405162461bcd60e51b8152600401610bcc906129d1565b506001600160a01b031660009081526011602052604090205460ff1690565b6009546000906001600160a01b031633146113c65760405162461bcd60e51b8152600401610bcc906129d1565b601254600160b01b900460ff16156113e057506000610c07565b6001600160a01b03831660009081526011602052604090205460ff168280156114065750805b801561141c5750601254600160a81b900460ff16155b1561142b576000915050610c07565b6000816114405761143b85611dd5565b611449565b6114498561208e565b9050801561150f576001600160a01b038516600090815260176020526040902042905581156114bd57831515856001600160a01b03167ffbd928dd3806a2bdf802f3a28a2cc55205f95dbcd2c3ed313abfca278366f80c836040516114b091815260200190565b60405180910390a3611504565b831515856001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092836040516114fb91815260200190565b60405180910390a35b600192505050610c07565b506000949350505050565b6009546001600160a01b031633146115445760405162461bcd60e51b8152600401610bcc906129d1565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b031633146115905760405162461bcd60e51b8152600401610bcc906129d1565b6001600160a01b0382166000908152600f602052604090205460ff166115d0576019548110156115d4576115c5600a83611c25565b6115d0826000611bc6565b5050565b6115de8282611bc6565b60185481106115f3576115d0600a8383612401565b6115d0600a83611c25565b6009546001600160a01b031633146116285760405162461bcd60e51b8152600401610bcc906129d1565b6001600160a01b03811661168d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bcc565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b806000808080806116fb600a876124aa565b945060001993506000851261175d57600e5485111561172957600e546117229086906124f5565b935061175d565b600e54600a546000911061173e57600061174d565b600e54600a5461174d91611d93565b90506117598682611b75565b9450505b611766866112bf565b925061177186610c76565b6001600160a01b038716600090815260176020526040902054969895975093959294915050565b600a54600090819081908015806117b85750601254600160b01b900460ff165b156117ce575050600e54600092508291506118b7565b600e546000805a90506000805b89841080156117e957508582105b156118a657846117f881612a25565b95505085851061180757600094505b6000600a600001868154811061181f5761181f612a3e565b60009182526020808320909101546001600160a01b0316808352601090915260409091205490915060ff1661186c57611859816001611399565b1561186c578161186881612a25565b9250505b8261187681612a25565b93505060005a90508085111561189d5761189a6118938683611d93565b8790611947565b95505b93506117db9050565b600e85905590975095509193505050505b9193909250565b6000826000036118d057506000610c07565b60006118dc8385612a06565b9050826118e98583612975565b146119405760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610bcc565b9392505050565b6000806119548385612a54565b9050838110156119405760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610bcc565b6001600160a01b038316611a085760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bcc565b6001600160a01b038216611a695760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bcc565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602b60248201527f245350545f4469766964656e645f547261636b65723a204e6f207472616e736660448201526a195c9cc8185b1b1bddd95960aa1b6064820152608401610bcc565b505050565b60008184841115611b4f5760405162461bcd60e51b8152600401610bcc91906127bd565b506000611b5c8486612a6c565b95945050505050565b60008181811215610c0757600080fd5b600080611b828385612a83565b905060008312158015611b955750838112155b80611baa5750600083128015611baa57508381125b61194057600080fd5b600080821215611bc257600080fd5b5090565b6001600160a01b03821660009081526020819052604090205480821115611c05576000611bf38383611d93565b9050611bff8482612532565b50505050565b80821015611b26576000611c198284611d93565b9050611bff8482612596565b6001600160a01b038116600090815260038301602052604090205460ff16611c4b575050565b6001600160a01b03811660009081526003830160209081526040808320805460ff1916905560018086018352818420849055600286019092528220548454909291611c9591612a6c565b90506000846000018281548110611cae57611cae612a3e565b60009182526020808320909101546001600160a01b03908116808452600289019092526040808420879055908716835282209190915585549091508190869085908110611cfd57611cfd612a3e565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558454859080611d3757611d37612ac4565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6000826000018281548110611d7757611d77612a3e565b6000918252602090912001546001600160a01b03169392505050565b600061194083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b2b565b600080611de1836112bf565b90508015612085576001600160a01b038316600090815260076020526040902054611e0c9082611947565b6001600160a01b03808516600090815260076020526040812092909255601254169081611e91576040516001600160a01b03861690610bb89085906000818181858888f193505050503d8060008114611e81576040519150601f19603f3d011682016040523d82523d6000602084013e611e86565b606091505b505080915050611feb565b6040805160028082526060820183526000926020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611efb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1f9190612ada565b81600081518110611f3257611f32612a3e565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611f6657611f66612a3e565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de95908690611fac9060009086908c904290600401612b3b565b6000604051808303818588803b158015611fc557600080fd5b505af193505050508015611fd7575060015b611fe45760009150611fe9565b600191505b505b80612039576001600160a01b0385166000908152600760205260409020546120139084611d93565b6001600160a01b0390951660009081526007602052604081209590955550929392505050565b846001600160a01b03167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d8460405161207491815260200190565b60405180910390a250909392505050565b50600092915050565b60008061209a836112bf565b90508015612085576001600160a01b0383166000908152600760205260408120546120c59083611947565b6001600160a01b03851660009081526007602052604080822092909255815160028082526060820190935290918160200160208202803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa15801561214d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121719190612ada565b8160008151811061218457612184612a3e565b6001600160a01b0392831660209182029290920101526016548251911690829060019081106121b5576121b5612a3e565b6001600160a01b0392831660209182029290920101526016546040516370a0823160e01b815230600482015260009291909116906370a0823190602401602060405180830381865afa15801561220f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122339190612b70565b60155460405163b6f9de9560e01b81529192506001600160a01b03169063b6f9de9590869061226d90600090879030904290600401612b3b565b6000604051808303818588803b15801561228657600080fd5b505af193505050508015612298575060015b6122a557600092506123a8565b6016546040516370a0823160e01b81523060048201526000916123189184916001600160a01b0316906370a0823190602401602060405180830381865afa1580156122f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e59190612b70565b905080156123a15760165460405163a9059cbb60e01b81526001600160a01b03898116600483015260248201849052600196509091169063a9059cbb906044016020604051808303816000875af1158015612377573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239b9190612b89565b506123a6565b600093505b505b826123f7576001600160a01b0386166000908152600760205260409020546123d09085611d93565b6001600160a01b039096166000908152600760205260408120969096555093949350505050565b5091949350505050565b6001600160a01b038216600090815260038401602052604090205460ff1615612446576001600160a01b03821660009081526001840160205260409020819055505050565b6001600160a01b03821660008181526003850160209081526040808320805460ff19166001908117909155878101835281842086905587546002890184529184208290558101875586835291200180546001600160a01b0319169091179055505050565b6001600160a01b038116600090815260038301602052604081205460ff166124d55750600019610c07565b506001600160a01b03166000908152600291909101602052604090205490565b6000806125028385612ba6565b9050600083121580156125155750838113155b80611baa5750600083128015611baa575083811361194057600080fd5b61253c82826125da565b612576612557610cb8836005546118be90919063ffffffff16565b6001600160a01b038416600090815260066020526040902054906124f5565b6001600160a01b0390921660009081526006602052604090209190915550565b6125a082826126b9565b6125766125bb610cb8836005546118be90919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611b75565b6001600160a01b0382166126305760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610bcc565b60025461263d9082611947565b6002556001600160a01b0382166000908152602081905260409020546126639082611947565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b0382166127195760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610bcc565b61275681604051806060016040528060228152602001612be6602291396001600160a01b0385166000908152602081905260409020549190611b2b565b6001600160a01b03831660009081526020819052604090205560025461277c9082611d93565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016126ad565b600060208083528351808285015260005b818110156127ea578581018301518582016040015282016127ce565b818111156127fc576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461282757600080fd5b50565b60006020828403121561283c57600080fd5b813561194081612812565b6000806040838503121561285a57600080fd5b823561286581612812565b946020939093013593505050565b60008060006060848603121561288857600080fd5b833561289381612812565b925060208401356128a381612812565b929592945050506040919091013590565b801515811461282757600080fd5b6000602082840312156128d457600080fd5b8135611940816128b4565b6000602082840312156128f157600080fd5b5035919050565b6000806040838503121561290b57600080fd5b823561291681612812565b91506020830135612926816128b4565b809150509250929050565b6000806040838503121561294457600080fd5b823561294f81612812565b9150602083013561292681612812565b634e487b7160e01b600052601160045260246000fd5b60008261299257634e487b7160e01b600052601260045260246000fd5b500490565b600181811c908216806129ab57607f821691505b6020821081036129cb57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000816000190483118215151615612a2057612a2061295f565b500290565b600060018201612a3757612a3761295f565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008219821115612a6757612a6761295f565b500190565b600082821015612a7e57612a7e61295f565b500390565b600080821280156001600160ff1b0384900385131615612aa557612aa561295f565b600160ff1b8390038412811615612abe57612abe61295f565b50500190565b634e487b7160e01b600052603160045260246000fd5b600060208284031215612aec57600080fd5b815161194081612812565b600081518084526020808501945080840160005b83811015612b305781516001600160a01b031687529582019590820190600101612b0b565b509495945050505050565b848152608060208201526000612b546080830186612af7565b6001600160a01b03949094166040830152506060015292915050565b600060208284031215612b8257600080fd5b5051919050565b600060208284031215612b9b57600080fd5b8151611940816128b4565b60008083128015600160ff1b850184121615612bc457612bc461295f565b6001600160ff1b0384018313811615612bdf57612bdf61295f565b5050039056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b0f5ff12dbd6d9c30adbe7349004c562bb0497e46c4b2ca3932954703c3feff764736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106104e55760003560e01c80637fdde05c11610281578063aa4704f31161015a578063d8032ed3116100cc578063f27fd25411610085578063f27fd25414610f7c578063f2fde38b14610f9c578063f5d3c79a14610fbc578063f637434214610fdc578063f8b45b0514610ff2578063fc6b151c1461100857600080fd5b8063d8032ed314610ea8578063dd62ed3e14610ec8578063e2f4560514610f0e578063e7841ec014610f24578063f11a24d314610f39578063f1c0ddff14610f4f57600080fd5b8063b74e3b111161011e578063b74e3b1114610df2578063ba079d4914610e12578063bb4c9f0b14610e32578063bb8d513114610e52578063d07a091c14610e68578063d5e3725114610e8857600080fd5b8063aa4704f314610ce8578063acb2ad6f14610d40578063ad56c13c14610d56578063b494298814610dad578063b62496f514610dc357600080fd5b80639a7a23d6116101f35780639ec1037e116101b75780639ec1037e14610c32578063a0d82dc514610c52578063a457c2d714610c68578063a694fc3a14610c88578063a8b9d24014610ca8578063a9059cbb14610cc857600080fd5b80639a7a23d614610ba65780639c1b8af514610bc65780639c3372ea14610bdc5780639c3b4fdc14610bfc5780639cefc1da14610c1257600080fd5b80638a8c523c116102455780638a8c523c14610b125780638ca2923a14610b275780638da5cb5b14610b3d5780638ea5220f14610b5b57806395451c2914610b7b57806395d89b4114610b9157600080fd5b80637fdde05c14610a72578063837ae2d014610a925780638577a6d514610ab2578063868730c714610ad2578063871c128d14610af257600080fd5b806349bd5a5e116103be57806364b0f65311610330578063715018a6116102e9578063715018a6146109ba57806372d8edf4146109cf57806375829def146109ef57806375f0a87414610a0f57806377a3b60914610a2f5780637d32f34214610a4557600080fd5b806364b0f65314610905578063679ca6e91461091a5780636843cd841461093a5780636d48467b1461095a578063700bb1911461097a57806370a082311461099a57600080fd5b80634fbee193116103825780634fbee193146108405780635124f874146108795780635a84c5eb1461088f5780635c234bb6146108af5780635ebf4db9146108c55780635eee4bae146108e557600080fd5b806349bd5a5e146107b65780634a62bb65146107d65780634a74bb02146107f05780634ada218b1461080a5780634e71d92d1461082b57600080fd5b80632307b44111610457578063313ce5671161041b578063313ce567146106f75780633599bb171461071357806339509351146107335780633f407b841461075357806340ffdd8014610769578063435c89e41461078957600080fd5b80632307b4411461066d57806323b872dd1461068d57806325cd3598146106ad5780632c1f5216146106c257806330bb4cff146106e257600080fd5b8063095ea7b3116104a9578063095ea7b3146105b25780630ef35b7e146105e25780631694505e1461060257806318160ddd146106225780631d7b1fb4146106415780631fa705311461065757600080fd5b806303fd2a45146104f157806305ca5f081461052e57806306fdde031461055057806308dfe8a514610572578063092316021461059257600080fd5b366104ec57005b600080fd5b3480156104fd57600080fd5b50600854610511906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561053a57600080fd5b5061054e61054936600461451b565b611028565b005b34801561055c57600080fd5b506105656110f9565b6040516105259190614534565b34801561057e57600080fd5b5061054e61058d3660046145ac565b61118b565b34801561059e57600080fd5b5061054e6105ad36600461451b565b611214565b3480156105be57600080fd5b506105d26105cd3660046145e5565b6112a3565b6040519015158152602001610525565b3480156105ee57600080fd5b5061054e6105fd366004614611565b6112ba565b34801561060e57600080fd5b50600654610511906001600160a01b031681565b34801561062e57600080fd5b506002545b604051908152602001610525565b34801561064d57600080fd5b50610633602a5481565b34801561066357600080fd5b50610633600a5481565b34801561067957600080fd5b5061054e610688366004614709565b61139f565b34801561069957600080fd5b506105d26106a83660046147cb565b611570565b3480156106b957600080fd5b506105116115d9565b3480156106ce57600080fd5b50600d54610511906001600160a01b031681565b3480156106ee57600080fd5b5061063361164c565b34801561070357600080fd5b5060405160128152602001610525565b34801561071f57600080fd5b5061054e61072e36600461480c565b6116ba565b34801561073f57600080fd5b506105d261074e3660046145e5565b611747565b34801561075f57600080fd5b5061063360095481565b34801561077557600080fd5b5061054e61078436600461480c565b61177d565b34801561079557600080fd5b506106336107a436600461451b565b60236020526000908152604090205481565b3480156107c257600080fd5b50600754610511906001600160a01b031681565b3480156107e257600080fd5b506025546105d29060ff1681565b3480156107fc57600080fd5b50601d546105d29060ff1681565b34801561081657600080fd5b506008546105d290600160b01b900460ff1681565b34801561083757600080fd5b5061054e6117d8565b34801561084c57600080fd5b506105d261085b366004614829565b6001600160a01b03166000908152601f602052604090205460ff1690565b34801561088557600080fd5b5061063360175481565b34801561089b57600080fd5b5061054e6108aa36600461451b565b611850565b3480156108bb57600080fd5b5061063360165481565b3480156108d157600080fd5b5061054e6108e036600461451b565b6118ab565b3480156108f157600080fd5b5061054e61090036600461451b565b611906565b34801561091157600080fd5b50610633611948565b34801561092657600080fd5b5061054e61093536600461480c565b611992565b34801561094657600080fd5b50610633610955366004614829565b6119cf565b34801561096657600080fd5b506105d2610975366004614829565b611a3f565b34801561098657600080fd5b5061054e61099536600461451b565b611aaf565b3480156109a657600080fd5b506106336109b5366004614829565b611b81565b3480156109c657600080fd5b5061054e611b9c565b3480156109db57600080fd5b5061054e6109ea366004614829565b611c10565b3480156109fb57600080fd5b5061054e610a0a366004614829565b611c6c565b348015610a1b57600080fd5b50600e54610511906001600160a01b031681565b348015610a3b57600080fd5b5061063360195481565b348015610a5157600080fd5b50610633610a60366004614829565b60226020526000908152604090205481565b348015610a7e57600080fd5b5061054e610a8d3660046145ac565b611d21565b348015610a9e57600080fd5b5061054e610aad366004614846565b611d76565b348015610abe57600080fd5b5061054e610acd36600461451b565b611f20565b348015610ade57600080fd5b5061054e610aed36600461480c565b611fd7565b348015610afe57600080fd5b5061054e610b0d36600461451b565b61200f565b348015610b1e57600080fd5b5061054e61208b565b348015610b3357600080fd5b5061063360135481565b348015610b4957600080fd5b506005546001600160a01b0316610511565b348015610b6757600080fd5b50600f54610511906001600160a01b031681565b348015610b8757600080fd5b5061063360145481565b348015610b9d57600080fd5b5061056561210e565b348015610bb257600080fd5b5061054e610bc13660046145ac565b61211d565b348015610bd257600080fd5b50610633601e5481565b348015610be857600080fd5b5061054e610bf736600461480c565b612155565b348015610c0857600080fd5b50610633601a5481565b348015610c1e57600080fd5b5061054e610c2d36600461480c565b6121b1565b348015610c3e57600080fd5b5061054e610c4d366004614829565b612247565b348015610c5e57600080fd5b50610633601b5481565b348015610c7457600080fd5b506105d2610c833660046145e5565b61231e565b348015610c9457600080fd5b5061054e610ca336600461451b565b61236d565b348015610cb457600080fd5b50610633610cc3366004614829565b612590565b348015610cd457600080fd5b506105d2610ce33660046145e5565b6125c3565b348015610cf457600080fd5b50610d2b610d03366004614829565b6001600160a01b03166000908152602260209081526040808320546021909252909120549091565b60408051928352602083019190915201610525565b348015610d4c57600080fd5b50610633601c5481565b348015610d6257600080fd5b50610d76610d71366004614829565b6125d0565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610525565b348015610db957600080fd5b5061063360295481565b348015610dcf57600080fd5b506105d2610dde366004614829565b602080526000908152604090205460ff1681565b348015610dfe57600080fd5b5061054e610e0d36600461451b565b612660565b348015610e1e57600080fd5b506105d2610e2d366004614829565b6126f0565b348015610e3e57600080fd5b5061054e610e4d366004614709565b612723565b348015610e5e57600080fd5b5061063360125481565b348015610e7457600080fd5b5061054e610e83366004614829565b612bd0565b348015610e9457600080fd5b5061054e610ea336600461480c565b612cc5565b348015610eb457600080fd5b5061054e610ec3366004614829565b612d47565b348015610ed457600080fd5b50610633610ee33660046148ae565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610f1a57600080fd5b5061063360115481565b348015610f3057600080fd5b50610633612e0a565b348015610f4557600080fd5b5061063360185481565b348015610f5b57600080fd5b50610633610f6a366004614829565b60216020526000908152604090205481565b348015610f8857600080fd5b50610d76610f9736600461451b565b612e54565b348015610fa857600080fd5b5061054e610fb7366004614829565b612e92565b348015610fc857600080fd5b5061054e610fd736600461480c565b612f7d565b348015610fe857600080fd5b5061063360155481565b348015610ffe57600080fd5b5061063360105481565b34801561101457600080fd5b5061054e61102336600461451b565b612fb5565b6005546001600160a01b0316331461105b5760405162461bcd60e51b8152600401611052906148dc565b60405180910390fd5b61106d81670de0b6b3a7640000614927565b90506000611088600954600a5461306b90919063ffffffff16565b905060006110ab826110a5600a54866130d190919063ffffffff16565b90613153565b905060006110c8836110a5600954876130d190919063ffffffff16565b90506110d384613195565b600a546110e09083613495565b600a556009546110f09082613495565b60095550505050565b60606003805461110890614946565b80601f016020809104026020016040519081016040528092919081815260200182805461113490614946565b80156111815780601f1061115657610100808354040283529160200191611181565b820191906000526020600020905b81548152906001019060200180831161116457829003601f168201915b5050505050905090565b6005546001600160a01b031633146111b55760405162461bcd60e51b8152600401611052906148dc565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b0316331461123e5760405162461bcd60e51b8152600401611052906148dc565b600581101561128f5760405162461bcd60e51b815260206004820152601860248201527f63616e206e65766572206265207365742062656c6f77203500000000000000006044820152606401611052565b61129d81633b9aca00614927565b60265550565b60006112b03384846134d7565b5060015b92915050565b6005546001600160a01b031633146112e45760405162461bcd60e51b8152600401611052906148dc565b6000828152602360205260409020548190036112ff57600080fd5b60648111156113505760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e6720626f6e75732063616e2774206578636565642031303000006044820152606401611052565b60008281526023602090815260409182902083905581518481529081018390527f065c0eec5c5d031ee25323575d53db5536226ab058b74d8bdb03c517dd4f605d910160405180910390a15050565b6005546001600160a01b031633146113c95760405162461bcd60e51b8152600401611052906148dc565b805182511461141a5760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401611052565b60c8825111156114775760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b6064820152608401611052565b60005b825181101561156b57600083828151811061149757611497614980565b6020026020010151905060008383815181106114b5576114b5614980565b6020026020010151670de0b6b3a76400006114d09190614927565b90506114dd3383836135fc565b600d546001600160a01b031663e30443bc836114f881611b81565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561153e57600080fd5b505af1158015611552573d6000803e3d6000fd5b505050505050808061156390614996565b91505061147a565b505050565b600061157d848484613705565b6115cf84336115ca85604051806060016040528060288152602001614c13602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906140eb565b6134d7565b5060019392505050565b600d54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa158015611623573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164791906149af565b905090565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611696573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164791906149cc565b6005546001600160a01b031633146116e45760405162461bcd60e51b8152600401611052906148dc565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b15801561172c57600080fd5b505af1158015611740573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916112b09185906115ca908661306b565b6005546001600160a01b031633146117a75760405162461bcd60e51b8152600401611052906148dc565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd8090602401611712565b600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611829573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184d91906149e5565b50565b6005546001600160a01b0316331461187a5760405162461bcd60e51b8152600401611052906148dc565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb90602401611712565b6005546001600160a01b031633146118d55760405162461bcd60e51b8152600401611052906148dc565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db990602401611712565b6005546001600160a01b031633146119305760405162461bcd60e51b8152600401611052906148dc565b61194281670de0b6b3a7640000614927565b60115550565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611696573d6000803e3d6000fd5b6005546001600160a01b031633146119bc5760405162461bcd60e51b8152600401611052906148dc565b6025805460ff1916911515919091179055565b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611a1b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b491906149cc565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa158015611a8b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b491906149e5565b600d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611b02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b269190614a02565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314611bc65760405162461bcd60e51b8152600401611052906148dc565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314611c3a5760405162461bcd60e51b8152600401611052906148dc565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401611712565b6005546001600160a01b03163314611c965760405162461bcd60e51b8152600401611052906148dc565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015611cdd57600080fd5b505af1158015611cf1573d6000803e3d6000fd5b5050506001600160a01b0382166000908152601f60205260409020805460ff191660011790555061184d81612e92565b6005546001600160a01b03163314611d4b5760405162461bcd60e51b8152600401611052906148dc565b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611da05760405162461bcd60e51b8152600401611052906148dc565b60168a90556017889055601886905560198490556013899055601487905560158590556012839055601a829055601b819055611de881611de28981878a61306b565b9061306b565b600b81905550611e11601a54611de2601754611de260185460195461306b90919063ffffffff16565b600c55600b54602310801590611e2a57506023600c5411155b611e875760405162461bcd60e51b815260206004820152602860248201527f746f74616c20666565732063616e6e6f7420657863656564203335252073656c6044820152676c206f722062757960c01b6064820152608401611052565b601354601454601554601254601654601754601854601954601a54601b54604080519a8b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301526101208201527f07cec4532bdb36ce729ae72905c09f7bfbf8682c2cc2f1999f745188d9975122906101400160405180910390a150505050505050505050565b6005546001600160a01b03163314611f4a5760405162461bcd60e51b8152600401611052906148dc565b600f811115611f9b5760405162461bcd60e51b815260206004820152601e60248201527f7472616e73666572206665652063616e6e6f74206578636565642031352500006044820152606401611052565b601c8190556040518181527f6fbeac6c79c640ca4f5f47271bd7a36c7eb83076224c65a3b3378c8844720343906020015b60405180910390a150565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d63990604401611712565b6005546001600160a01b031633146120395760405162461bcd60e51b8152600401611052906148dc565b62030d40811015801561204f5750620f42408111155b61205857600080fd5b601e5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601e55565b6005546001600160a01b031633146120b55760405162461bcd60e51b8152600401611052906148dc565b600854600160b01b900460ff16156120cc57600080fd5b6008805460ff60b01b1916600160b01b179055436029556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b60606004805461110890614946565b6005546001600160a01b031633146121475760405162461bcd60e51b8152600401611052906148dc565b6121518282614125565b5050565b6005546001600160a01b0316331461217f5760405162461bcd60e51b8152600401611052906148dc565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea90602401611712565b6005546001600160a01b031633146121db5760405162461bcd60e51b8152600401611052906148dc565b801515600860159054906101000a900460ff161515036121fa57600080fd5b60088054821515600160a81b0260ff60a81b199091161790556040517f0d240c24014ec8c204fc1bdcc286f7d01fd2ab6a07c558a9b2d3f12904323a8790611fcc90831515815260200190565b6005546001600160a01b031633146122715760405162461bcd60e51b8152600401611052906148dc565b600d54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b1580156122b857600080fd5b505af11580156122cc573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc9050826122ed816141ed565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611712565b60006112b033846115ca85604051806060016040528060258152602001614c3b602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906140eb565b600854600160a81b900460ff166123bf5760405162461bcd60e51b815260206004820152601660248201527514dd185ada5b99c81a5cc81b9bdd08195b98589b195960521b6044820152606401611052565b600081815260236020526040812054900361241c5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207374616b696e67206475726174696f6e00000000000000006044820152606401611052565b612426428261306b565b336000908152602260205260409020541061248f5760405162461bcd60e51b8152602060048201526024808201527f616c7265616479207374616b656420666f722061206c6f6e67657220647572616044820152633a34b7b760e11b6064820152608401611052565b6000818152602360209081526040808320543384526021909252909120556124b7428261306b565b33600081815260226020526040902091909155600d546001600160a01b03169063e30443bc906124e6816141ed565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561252c57600080fd5b505af1158015612540573d6000803e3d6000fd5b5050505061254b3390565b6001600160a01b03167f13dd201d7da4f9b31a9064a09abc1a6ce420dacd837a77abafaec5bd9d28d2c88260405161258591815260200190565b60405180910390a250565b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016119fe565b60006112b0338484613705565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa158015612628573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264c9190614a30565b949c939b5091995097509550909350915050565b6005546001600160a01b0316331461268a5760405162461bcd60e51b8152600401611052906148dc565b61012c8111156126eb5760405162461bcd60e51b815260206004820152602660248201527f636f6f6c646f776e2074696d65722063616e6e6f74206578636565642035206d604482015265696e7574657360d01b6064820152608401611052565b602a55565b600d5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d4990602401611a6e565b6005546001600160a01b0316331461274d5760405162461bcd60e51b8152600401611052906148dc565b80518251146127b25760405162461bcd60e51b815260206004820152602b60248201527f436f6e7472696275746f727320616e642062616c616e636573206d757374206260448201526a652073616d652073697a6560a81b6064820152608401611052565b60c8825111156128135760405162461bcd60e51b815260206004820152602660248201527f436f6e7472696275746f72206c697374206c656e677468206d7573742062652060448201526503c3d203230360d41b6064820152608401611052565b6000805b82518160ff16101561286657612852838260ff168151811061283b5761283b614980565b60200260200101518361306b90919063ffffffff16565b91508061285e81614a83565b915050612817565b508061287133611b81565b10156128d45760405162461bcd60e51b815260206004820152602c60248201527f4163636f756e742062616c616e6365206d757374206265203e3d2073756d206f60448201526b033103130b630b731b2b997160a51b6064820152608401611052565b3360009081526001602090815260408083203084529091529020548111156129565760405162461bcd60e51b815260206004820152602f60248201527f436f6e747261637420616c6c6f77616e6365206d757374206265203e3d20737560448201526e0369037b3103130b630b731b2b9971608d1b6064820152608401611052565b60008060005b85518160ff161015612bc857858160ff168151811061297d5761297d614980565b6020026020010151925060006001600160a01b0316836001600160a01b0316141580156129b5575061dead6001600160a01b03841614155b612a015760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742061697264726f7020746f2061206465616420616464726573736044820152606401611052565b612a0a83611b81565b9150306001600160a01b03166323b872dd3385888560ff1681518110612a3257612a32614980565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015612a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab591906149e5565b50848160ff1681518110612acb57612acb614980565b602002602001015182612ade9190614aa2565b612ae784611b81565b14612b4d5760405162461bcd60e51b815260206004820152603060248201527f436f6e7472696275746f72206d75737420726563696576652066756c6c20626160448201526f06c616e6365206f662061697264726f760841b6064820152608401611052565b7f8c32c568416fcf97be35ce5b27844cfddcd63a67a1a602c3595ba5dac38f303a83868360ff1681518110612b8457612b84614980565b6020026020010151604051612bae9291906001600160a01b03929092168252602082015260400190565b60405180910390a180612bc081614a83565b91505061295c565b505050505050565b6005546001600160a01b03163314612bfa5760405162461bcd60e51b8152600401611052906148dc565b6001600160a01b0381811660008181526024602081815260408084208054600160ff199182168117909255601f9093529381902080549092169093179055600d54915163031e79db60e41b815260048101939093529216916331e79db09101600060405180830381600087803b158015612c7357600080fd5b505af1158015612c87573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c592506020019050611fcc565b6005546001600160a01b03163314612cef5760405162461bcd60e51b8152600401611052906148dc565b601d5481151560ff909116151503612d0657600080fd5b601d805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef90602001611fcc565b6005546001600160a01b03163314612d715760405162461bcd60e51b8152600401611052906148dc565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b158015612db857600080fd5b505af1158015612dcc573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050611fcc565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611696573d6000803e3d6000fd5b600d54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd9060240161260b565b6005546001600160a01b03163314612ebc5760405162461bcd60e51b8152600401611052906148dc565b6001600160a01b038116612f215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611052565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a0490604401611712565b6005546001600160a01b03163314612fdf5760405162461bcd60e51b8152600401611052906148dc565b612ff181670de0b6b3a7640000614927565b90506107d06002546130039190614aba565b8110156130665760405162461bcd60e51b815260206004820152602b60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c65737360448201526a207468616e20302e30352560a81b6064820152608401611052565b601055565b6000806130788385614aa2565b9050838110156130ca5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401611052565b9392505050565b6000826000036130e3575060006112b4565b60006130ef8385614927565b9050826130fc8583614aba565b146130ca5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401611052565b60006130ca83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614246565b806000036131a05750565b6131a981614274565b60006131c2600954600a5461306b90919063ffffffff16565b60195490915060019081908190600090819081901561322357613220601a546017546019546131f19190614aa2565b6131fb9190614aa2565b6110a560195461321a8b6110a5600a54476130d190919063ffffffff16565b906130d1565b91505b6012541561326d5761326a601b546014546012546132419190614aa2565b61324b9190614aa2565b6110a560125461321a8b6110a5600954476130d190919063ffffffff16565b90505b613277828261306b565b925082156132d757600d546040516001600160a01b03909116908490600081818185875af1925050503d80600081146132cc576040519150601f19603f3d011682016040523d82523d6000602084013e6132d1565b606091505b50909650505b60006132f0601a5460175461306b90919063ffffffff16565b601b546014546132ff9161306b565b6133099190614aa2565b9050600081156133205761331d4783613153565b90505b60008161333a60145460175461306b90919063ffffffff16565b6133449190614927565b9050600082613360601b54601a5461306b90919063ffffffff16565b61336a9190614927565b905081156133ca57600e546040516001600160a01b03909116908390600081818185875af1925050503d80600081146133bf576040519150601f19603f3d011682016040523d82523d6000602084013e6133c4565b606091505b50909950505b801561342857600f546040516001600160a01b03909116908290600081818185875af1925050503d806000811461341d576040519150601f19603f3d011682016040523d82523d6000602084013e613422565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd0876134548385614aa2565b8c801561345e57508b5b801561346757508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b60006130ca83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506140eb565b6001600160a01b0383166135395760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611052565b6001600160a01b03821661359a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611052565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166136225760405162461bcd60e51b815260040161105290614adc565b6001600160a01b0382166136485760405162461bcd60e51b815260040161105290614b21565b61368581604051806060016040528060268152602001614bed602691396001600160a01b03861660009081526020819052604090205491906140eb565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546136b4908261306b565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016135ef565b6001600160a01b03831661372b5760405162461bcd60e51b815260040161105290614adc565b6001600160a01b0382166137515760405162461bcd60e51b815260040161105290614b21565b6001600160a01b038316600090815260246020526040812054819081908190819060ff166137d257600854600160b01b900460ff166137d25760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401611052565b856000036137f0576137e6888860006135fc565b5050505050505050565b600854600160a01b900460ff1615801561382357506001600160a01b0388166000908152601f602052604090205460ff16155b801561384857506001600160a01b0387166000908152601f602052604090205460ff16155b15613fe2576001600160a01b03808816600090815260208052604080822054928b16825290205460ff918216911680158015613882575081155b156139c85760006138a360646110a5601c548c6130d190919063ffffffff16565b90506138af8982613495565b98506138bc8b30836135fc565b6138c78b8b8b6135fc565b600d546001600160a01b031663e30443bc8c6138e2816141ed565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561392857600080fd5b505af115801561393c573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508b61395d816141ed565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156139a357600080fd5b505af11580156139b7573d6000803e3d6000fd5b505050505050505050505050505050565b801580156139df5750600854600160a81b900460ff165b15613a96576001600160a01b038a16600090815260226020526040902054421015613a4c5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e7320617265207374616b656420616e64206c6f636b6564210000006044820152606401611052565b6001600160a01b038a1660009081526022602052604090205415613a91576001600160a01b038a16600090815260226020908152604080832083905560219091528120555b613cef565b8115613b3f57601254601354601454601554601b54602554949b509299509097509550935060ff1615613a9157602a5432600090815260286020526040902054613ae09190614aa2565b421015613b285760405162461bcd60e51b8152602060048201526016602482015275636f6f6c646f776e20706572696f642061637469766560501b6044820152606401611052565b326000908152602860205260409020429055613cef565b8015613cef57601954601654601754601854601a54602554949b509299509097509550935060ff1615613c7857602954613b7a90601e614aa2565b4311613bbd5760405162461bcd60e51b8152602060048201526012602482015271796f75207368616c6c206e6f74207061737360701b6044820152606401611052565b6026543a1115613c0f5760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e00000000000000006044820152606401611052565b32600090815260276020526040902054439003613c655760405162461bcd60e51b8152602060048201526014602482015273546f6f206d616e7920545820696e20626c6f636b60601b6044820152606401611052565b3260009081526027602052604090204390555b6000613c838a611b81565b601054909150613c938a83614aa2565b1115613ced5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401611052565b505b6000613d1084613cff8888614aa2565b613d099190614aa2565b899061306b565b90506000613d1d30611b81565b60115490915081108015908190613d4c57506001600160a01b038d16600090815260208052604090205460ff16155b15613e65576008805460ff60a01b1916600160a01b179055601d5460ff168015613d765750600087115b8015613d8457506000600c54115b15613e36576000613da2600954600a5461306b90919063ffffffff16565b90506000613dbf826110a5600a54876130d190919063ffffffff16565b90506000613ddc836110a5600954886130d190919063ffffffff16565b90506000613df9600c546110a58d866130d190919063ffffffff16565b90506000613e16600b546110a58e866130d190919063ffffffff16565b90506000613e24828461306b565b9050613e2f816143c6565b5050505050505b6000613e4130611b81565b9050613e4c81613195565b506000600a8190556009556008805460ff60a01b191690555b6000613e7660646110a58e876130d1565b905060008a15613ec9576064613e8c8e8d6130d1565b613e969190614aba565b9050613eb88f600860009054906101000a90046001600160a01b0316836135fc565b600254613ec59082613495565b6002555b613edd613ed68284614aa2565b8e90613495565b9c508615613efa57600954613ef2908361306b565b600955613f0b565b600a54613f07908361306b565b600a555b613f168f30846135fc565b601e54600d546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015613f83575060408051601f3d908101601f19168201909252613f8091810190614a02565b60015b15613fd95760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b50505050505050505b613fed8888886135fc565b600d546001600160a01b031663e30443bc89614008816141ed565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561404e57600080fd5b505af1158015614062573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905088614083816141ed565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156140c957600080fd5b505af11580156140dd573d6000803e3d6000fd5b505050505050505050505050565b6000818484111561410f5760405162461bcd60e51b81526004016110529190614534565b50600061411c8486614b64565b95945050505050565b6001600160a01b03821660009081526020805260409020805460ff191682158015919091179091556141b157600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801561419857600080fd5b505af11580156141ac573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600854600090600160a81b900460ff1661420f5761420a82611b81565b6112b4565b6001600160a01b0382166000908152602160205260409020546112b4906064906110a59061423d908361306b565b61321a86611b81565b600081836142675760405162461bcd60e51b81526004016110529190614534565b50600061411c8486614aba565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106142a9576142a9614980565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015614302573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061432691906149af565b8160018151811061433957614339614980565b6001600160a01b03928316602091820292909201015260065461435f91309116846134d7565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790614398908590600090869030904290600401614b7b565b600060405180830381600087803b1580156143b257600080fd5b505af1158015612bc8573d6000803e3d6000fd5b60006143d3826002613153565b905060006143e18383613495565b9050476143ed83614274565b60006143f94783613495565b9050614405838261444d565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b6006546144659030906001600160a01b0316846134d7565b6006546001600160a01b031663f305d71982308560008061448e6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156144f6573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117409190614a02565b60006020828403121561452d57600080fd5b5035919050565b600060208083528351808285015260005b8181101561456157858101830151858201604001528201614545565b81811115614573576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461184d57600080fd5b801515811461184d57600080fd5b600080604083850312156145bf57600080fd5b82356145ca81614589565b915060208301356145da8161459e565b809150509250929050565b600080604083850312156145f857600080fd5b823561460381614589565b946020939093013593505050565b6000806040838503121561462457600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561467257614672614633565b604052919050565b600067ffffffffffffffff82111561469457614694614633565b5060051b60200190565b600082601f8301126146af57600080fd5b813560206146c46146bf8361467a565b614649565b82815260059290921b840181019181810190868411156146e357600080fd5b8286015b848110156146fe57803583529183019183016146e7565b509695505050505050565b6000806040838503121561471c57600080fd5b823567ffffffffffffffff8082111561473457600080fd5b818501915085601f83011261474857600080fd5b813560206147586146bf8361467a565b82815260059290921b8401810191818101908984111561477757600080fd5b948201945b8386101561479e57853561478f81614589565b8252948201949082019061477c565b965050860135925050808211156147b457600080fd5b506147c18582860161469e565b9150509250929050565b6000806000606084860312156147e057600080fd5b83356147eb81614589565b925060208401356147fb81614589565b929592945050506040919091013590565b60006020828403121561481e57600080fd5b81356130ca8161459e565b60006020828403121561483b57600080fd5b81356130ca81614589565b6000806000806000806000806000806101408b8d03121561486657600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b600080604083850312156148c157600080fd5b82356148cc81614589565b915060208301356145da81614589565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561494157614941614911565b500290565b600181811c9082168061495a57607f821691505b60208210810361497a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000600182016149a8576149a8614911565b5060010190565b6000602082840312156149c157600080fd5b81516130ca81614589565b6000602082840312156149de57600080fd5b5051919050565b6000602082840312156149f757600080fd5b81516130ca8161459e565b600080600060608486031215614a1757600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c08789031215614a4957600080fd5b8651614a5481614589565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b600060ff821660ff8103614a9957614a99614911565b60010192915050565b60008219821115614ab557614ab5614911565b500190565b600082614ad757634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600082821015614b7657614b76614911565b500390565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015614bcb5784516001600160a01b031683529383019391830191600101614ba6565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220647cd75e31308f927bbb4efb2ffb6b79c313f218899c382219fc762c5e1f070664736f6c634300080f0033

Deployed Bytecode Sourcemap

25384:29994:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25544:64;;;;;;;;;;-1:-1:-1;25544:64:0;;;;-1:-1:-1;;;;;25544:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;25544:64:0;;;;;;;;50603:443;;;;;;;;;;-1:-1:-1;50603:443:0;;;;;:::i;:::-;;:::i;:::-;;5654:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33290:181::-;;;;;;;;;;-1:-1:-1;33290:181:0;;;;;:::i;:::-;;:::i;34285:164::-;;;;;;;;;;-1:-1:-1;34285:164:0;;;;;:::i;:::-;;:::i;6709:210::-;;;;;;;;;;-1:-1:-1;6709:210:0;;;;;:::i;:::-;;:::i;:::-;;;2140:14:1;;2133:22;2115:41;;2103:2;2088:18;6709:210:0;1975:187:1;32294:326:0;;;;;;;;;;-1:-1:-1;32294:326:0;;;;;:::i;:::-;;:::i;25459:41::-;;;;;;;;;;-1:-1:-1;25459:41:0;;;;-1:-1:-1;;;;;25459:41:0;;;5975:108;;;;;;;;;;-1:-1:-1;6063:12:0;;5975:108;;;2801:25:1;;;2789:2;2774:18;5975:108:0;2655:177:1;27604:33:0;;;;;;;;;;;;;;;;25764:28;;;;;;;;;;;;;;;;54738:637;;;;;;;;;;-1:-1:-1;54738:637:0;;;;;:::i;:::-;;:::i;6927:454::-;;;;;;;;;;-1:-1:-1;6927:454:0;;;;;:::i;:::-;;:::i;49586:114::-;;;;;;;;;;;;;:::i;25876:43::-;;;;;;;;;;-1:-1:-1;25876:43:0;;;;-1:-1:-1;;;;;25876:43:0;;;39301:141;;;;;;;;;;;;;:::i;32156:93::-;;;;;;;;;;-1:-1:-1;32156:93:0;;32239:2;6174:36:1;;6162:2;6147:18;32156:93:0;6032:184:1;41644:119:0;;;;;;;;;;-1:-1:-1;41644:119:0;;;;;:::i;:::-;;:::i;7389:300::-;;;;;;;;;;-1:-1:-1;7389:300:0;;;;;:::i;:::-;;:::i;25728:29::-;;;;;;;;;;;;;;;;36540:121;;;;;;;;;;-1:-1:-1;36540:121:0;;;;;:::i;:::-;;:::i;26991:49::-;;;;;;;;;;-1:-1:-1;26991:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;25509:28;;;;;;;;;;-1:-1:-1;25509:28:0;;;;-1:-1:-1;;;;;25509:28:0;;;27253:33;;;;;;;;;;-1:-1:-1;27253:33:0;;;;;;;;26526:40;;;;;;;;;;-1:-1:-1;26526:40:0;;;;;;;;25685:34;;;;;;;;;;-1:-1:-1;25685:34:0;;;;-1:-1:-1;;;25685:34:0;;;;;;41013:103;;;;;;;;;;;;;:::i;39450:126::-;;;;;;;;;;-1:-1:-1;39450:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;39540:28:0;39516:4;39540:28;;;:19;:28;;;;;;;;;39450:126;26318:31;;;;;;;;;;;;;;;;49708:183;;;;;;;;;;-1:-1:-1;49708:183:0;;;;;:::i;:::-;;:::i;26285:26::-;;;;;;;;;;;;;;;;49899:175;;;;;;;;;;-1:-1:-1;49899:175:0;;;;;:::i;:::-;;:::i;35896:120::-;;;;;;;;;;-1:-1:-1;35896:120:0;;;;;:::i;:::-;;:::i;41262:142::-;;;;;;;;;;;;;:::i;34157:99::-;;;;;;;;;;-1:-1:-1;34157:99:0;;;;;:::i;:::-;;:::i;39776:171::-;;;;;;;;;;-1:-1:-1;39776:171:0;;;;;:::i;:::-;;:::i;41771:185::-;;;;;;;;;;-1:-1:-1;41771:185:0;;;;;:::i;:::-;;:::i;40595:410::-;;;;;;;;;;-1:-1:-1;40595:410:0;;;;;:::i;:::-;;:::i;6091:177::-;;;;;;;;;;-1:-1:-1;6091:177:0;;;;;:::i;:::-;;:::i;13068:148::-;;;;;;;;;;;;;:::i;33520:127::-;;;;;;;;;;-1:-1:-1;33520:127:0;;;;;:::i;:::-;;:::i;37206:208::-;;;;;;;;;;-1:-1:-1;37206:208:0;;;;;:::i;:::-;;:::i;25928:38::-;;;;;;;;;;-1:-1:-1;25928:38:0;;;;-1:-1:-1;;;;;25928:38:0;;;26393:28;;;;;;;;;;;;;;;;26933:51;;;;;;;;;;-1:-1:-1;26933:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;33948:170;;;;;;;;;;-1:-1:-1;33948:170:0;;;;;:::i;:::-;;:::i;37666:1429::-;;;;;;;;;;-1:-1:-1;37666:1429:0;;;;;:::i;:::-;;:::i;37422:236::-;;;;;;;;;;-1:-1:-1;37422:236:0;;;;;:::i;:::-;;:::i;41412:109::-;;;;;;;;;;-1:-1:-1;41412:109:0;;;;;:::i;:::-;;:::i;36957:241::-;;;;;;;;;;-1:-1:-1;36957:241:0;;;;;:::i;:::-;;:::i;32721:188::-;;;;;;;;;;;;;:::i;26174:27::-;;;;;;;;;;;;;;;;12854:79;;;;;;;;;;-1:-1:-1;12919:6:0;;-1:-1:-1;;;;;12919:6:0;12854:79;;25973:32;;;;;;;;;;-1:-1:-1;25973:32:0;;;;-1:-1:-1;;;;;25973:32:0;;;26208;;;;;;;;;;;;;;;;5762:104;;;;;;;;;;;;;:::i;36240:163::-;;;;;;;;;;-1:-1:-1;36240:163:0;;;;;:::i;:::-;;:::i;26624:40::-;;;;;;;;;;;;;;;;36411:121;;;;;;;;;;-1:-1:-1;36411:121:0;;;;;:::i;:::-;;:::i;26428:24::-;;;;;;;;;;;;;;;;35016:176;;;;;;;;;;-1:-1:-1;35016:176:0;;;;;:::i;:::-;;:::i;33685:201::-;;;;;;;;;;-1:-1:-1;33685:201:0;;;;;:::i;:::-;;:::i;26459:25::-;;;;;;;;;;;;;;;;7697:400;;;;;;;;;;-1:-1:-1;7697:400:0;;;;;:::i;:::-;;:::i;35200:662::-;;;;;;;;;;-1:-1:-1;35200:662:0;;;;;:::i;:::-;;:::i;39584:184::-;;;;;;;;;;-1:-1:-1;39584:184:0;;;;;:::i;:::-;;:::i;6276:216::-;;;;;;;;;;-1:-1:-1;6276:216:0;;;;;:::i;:::-;;:::i;39103:190::-;;;;;;;;;;-1:-1:-1;39103:190:0;;;;;:::i;:::-;-1:-1:-1;;;;;39236:25:0;39194:7;39236:25;;;:16;:25;;;;;;;;;39263:12;:21;;;;;;;39236:25;;39103:190;;;;;7921:25:1;;;7977:2;7962:18;;7955:34;;;;7894:18;39103:190:0;7747:248:1;26491:26:0;;;;;;;;;;;;;;;;39955:307;;;;;;;;;;-1:-1:-1;39955:307:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8301:32:1;;;8283:51;;8365:2;8350:18;;8343:34;;;;8393:18;;;8386:34;;;;8451:2;8436:18;;8429:34;8494:3;8479:19;;8472:35;8321:3;8523:19;;8516:35;8270:3;8255:19;39955:307:0;8000:557:1;27571:26:0;;;;;;;;;;;;;;;;26787:57;;;;;;;;;;-1:-1:-1;26787:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;34536:174;;;;;;;;;;-1:-1:-1;34536:174:0;;;;;:::i;:::-;;:::i;41964:127::-;;;;;;;;;;-1:-1:-1;41964:127:0;;;;;:::i;:::-;;:::i;53057:1673::-;;;;;;;;;;-1:-1:-1;53057:1673:0;;;;;:::i;:::-;;:::i;26138:29::-;;;;;;;;;;;;;;;;32974:268;;;;;;;;;;-1:-1:-1;32974:268:0;;;;;:::i;:::-;;:::i;36024:208::-;;;;;;;;;;-1:-1:-1;36024:208:0;;;;;:::i;:::-;;:::i;49420:158::-;;;;;;;;;;-1:-1:-1;49420:158:0;;;;;:::i;:::-;;:::i;6500:201::-;;;;;;;;;;-1:-1:-1;6500:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;6666:18:0;;;6634:7;6666:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6500:201;26098:33;;;;;;;;;;;;;;;;41124:130;;;;;;;;;;;;;:::i;26356:30::-;;;;;;;;;;;;;;;;26879:47;;;;;;;;;;-1:-1:-1;26879:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;40270:317;;;;;;;;;;-1:-1:-1;40270:317:0;;;;;:::i;:::-;;:::i;13224:281::-;;;;;;;;;;-1:-1:-1;13224:281:0;;;;;:::i;:::-;;:::i;41529:107::-;;;;;;;;;;-1:-1:-1;41529:107:0;;;;;:::i;:::-;;:::i;26247:31::-;;;;;;;;;;;;;;;;26067:24;;;;;;;;;;;;;;;;34780:222;;;;;;;;;;-1:-1:-1;34780:222:0;;;;;:::i;:::-;;:::i;50603:443::-;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;;;;;;;;;50691:17:::1;:6:::0;50701::::1;50691:17;:::i;:::-;50682:26;;50719:19;50741:25;50755:10;;50741:9;;:13;;:25;;;;:::i;:::-;50719:47;;50777:15;50795:38;50821:11;50795:21;50806:9;;50795:6;:10;;:21;;;;:::i;:::-;:25:::0;::::1;:38::i;:::-;50777:56;;50844:16;50863:39;50890:11;50863:22;50874:10;;50863:6;:10;;:22;;;;:::i;:39::-;50844:58;;50915:28;50936:6;50915:20;:28::i;:::-;50968:9;::::0;:22:::1;::::0;50982:7;50968:13:::1;:22::i;:::-;50956:9;:34:::0;51014:10:::1;::::0;:24:::1;::::0;51029:8;51014:14:::1;:24::i;:::-;51001:10;:37:::0;-1:-1:-1;;;;50603:443:0:o;5654:100::-;5708:13;5741:5;5734:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5654:100;:::o;33290:181::-;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33374:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;33374:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;33429:34;;2115:41:1;;;33429:34:0::1;::::0;2088:18:1;33429:34:0::1;;;;;;;33290:181:::0;;:::o;34285:164::-;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;34371:1:::1;34363:4;:9;;34355:46;;;::::0;-1:-1:-1;;;34355:46:0;;10208:2:1;34355:46:0::1;::::0;::::1;10190:21:1::0;10247:2;10227:18;;;10220:30;10286:26;10266:18;;;10259:54;10330:18;;34355:46:0::1;10006:348:1::0;34355:46:0::1;34428:13;:4:::0;34435:6:::1;34428:13;:::i;:::-;34412;:29:::0;-1:-1:-1;34285:164:0:o;6709:210::-;6828:4;6850:39;289:10;6873:7;6882:6;6850:8;:39::i;:::-;-1:-1:-1;6907:4:0;6709:210;;;;;:::o;32294:326::-;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;32416:24:::1;::::0;;;:14:::1;:24;::::0;;;;;:33;;;32408:42:::1;;;::::0;::::1;;32478:3;32469:5;:12;;32461:55;;;::::0;-1:-1:-1;;;32461:55:0;;10561:2:1;32461:55:0::1;::::0;::::1;10543:21:1::0;10600:2;10580:18;;;10573:30;10639:32;10619:18;;;10612:60;10689:18;;32461:55:0::1;10359:354:1::0;32461:55:0::1;32527:24;::::0;;;:14:::1;:24;::::0;;;;;;;;:32;;;32575:37;;7921:25:1;;;7962:18;;;7955:34;;;32575:37:0::1;::::0;7894:18:1;32575:37:0::1;;;;;;;32294:326:::0;;:::o;54738:637::-;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;54910:6:::1;:13;54885:14;:21;:38;54877:80;;;::::0;-1:-1:-1;;;54877:80:0;;10920:2:1;54877:80:0::1;::::0;::::1;10902:21:1::0;10959:2;10939:18;;;10932:30;10998:32;10978:18;;;10971:60;11048:18;;54877:80:0::1;10718:354:1::0;54877:80:0::1;55001:3;54976:14;:21;:28;;54968:75;;;::::0;-1:-1:-1;;;54968:75:0;;11279:2:1;54968:75:0::1;::::0;::::1;11261:21:1::0;11318:2;11298:18;;;11291:30;11357:34;11337:18;;;11330:62;-1:-1:-1;;;11408:18:1;;;11401:32;11450:19;;54968:75:0::1;11077:398:1::0;54968:75:0::1;55059:9;55054:314;55078:14;:21;55074:1;:25;55054:314;;;55121:14;55138;55153:1;55138:17;;;;;;;;:::i;:::-;;;;;;;55121:34;;55170:21;55194:6;55201:1;55194:9;;;;;;;;:::i;:::-;;;;;;;55207:6;55194:20;;;;:::i;:::-;55170:44;;55229:50;55245:10;55257:6;55265:13;55229:15;:50::i;:::-;55294:15;::::0;-1:-1:-1;;;;;55294:15:0::1;:26;55329:6:::0;55338:17:::1;55329:6:::0;55338:9:::1;:17::i;:::-;55294:62;::::0;-1:-1:-1;;;;;;55294:62:0::1;::::0;;;;;;-1:-1:-1;;;;;11812:32:1;;;55294:62:0::1;::::0;::::1;11794:51:1::0;11861:18;;;11854:34;11767:18;;55294:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;55106:262;;55101:3;;;;;:::i;:::-;;;;55054:314;;;;54738:637:::0;;:::o;6927:454::-;7067:4;7084:36;7094:6;7102:9;7113:6;7084:9;:36::i;:::-;7131:220;7154:6;289:10;7202:138;7258:6;7202:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7202:19:0;;;;;;:11;:19;;;;;;;;289:10;7202:33;;;;;;;;;;:37;:138::i;:::-;7131:8;:220::i;:::-;-1:-1:-1;7369:4:0;6927:454;;;;;:::o;49586:114::-;49660:15;;:32;;;-1:-1:-1;;;49660:32:0;;;;49633:7;;-1:-1:-1;;;;;49660:15:0;;:30;;:32;;;;;;;;;;;;;;:15;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49653:39;;49586:114;:::o;39301:141::-;39391:15;;:43;;;-1:-1:-1;;;39391:43:0;;;;39364:7;;-1:-1:-1;;;;;39391:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;41644:119::-;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;41714:15:::1;::::0;:41:::1;::::0;-1:-1:-1;;;41714:41:0;;2140:14:1;;2133:22;41714:41:0::1;::::0;::::1;2115::1::0;-1:-1:-1;;;;;41714:15:0;;::::1;::::0;:34:::1;::::0;2088:18:1;;41714:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;41644:119:::0;:::o;7389:300::-;289:10;7504:4;7598:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;7598:34:0;;;;;;;;;;7504:4;;7526:133;;7576:7;;7598:50;;7637:10;7598:38;:50::i;36540:121::-;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;36610:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;36610:43:0;;2140:14:1;;2133:22;36610:43:0::1;::::0;::::1;2115:41:1::0;-1:-1:-1;;;;;36610:15:0;;::::1;::::0;:36:::1;::::0;2088:18:1;;36610:43:0::1;1975:187:1::0;41013:103:0;41050:15;;:58;;-1:-1:-1;;;41050:58:0;;41089:10;41050:58;;;12668:51:1;41050:15:0;12735:18:1;;;12728:50;-1:-1:-1;;;;;41050:15:0;;;;:30;;12641:18:1;;41050:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41013:103::o;49708:183::-;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;49822:15:::1;::::0;:61:::1;::::0;-1:-1:-1;;;49822:61:0;;::::1;::::0;::::1;2801:25:1::0;;;-1:-1:-1;;;;;49822:15:0;;::::1;::::0;:54:::1;::::0;2774:18:1;;49822:61:0::1;2655:177:1::0;49899:175:0;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;50009:15:::1;::::0;:57:::1;::::0;-1:-1:-1;;;50009:57:0;;::::1;::::0;::::1;2801:25:1::0;;;-1:-1:-1;;;;;50009:15:0;;::::1;::::0;:50:::1;::::0;2774:18:1;;50009:57:0::1;2655:177:1::0;35896:120:0;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;35991:17:::1;:6:::0;36001::::1;35991:17;:::i;:::-;35970:18;:38:::0;-1:-1:-1;35896:120:0:o;41262:142::-;41355:15;;:41;;;-1:-1:-1;;;41355:41:0;;;;41328:7;;-1:-1:-1;;;;;41355:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;34157:99;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;34226:14:::1;:22:::0;;-1:-1:-1;;34226:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34157:99::o;39776:171::-;39905:15;;:34;;-1:-1:-1;;;39905:34:0;;-1:-1:-1;;;;;178:32:1;;;39905:34:0;;;160:51:1;39873:7:0;;39905:15;;:25;;133:18:1;;39905:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;41771:185::-;41900:15;;:48;;-1:-1:-1;;;41900:48:0;;-1:-1:-1;;;;;178:32:1;;;41900:48:0;;;160:51:1;41871:4:0;;41900:15;;:39;;133:18:1;;41900:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;40595:410::-;40777:15;;:28;;-1:-1:-1;;;;;;40777:28:0;;;;;2801:25:1;;;40675:18:0;;;;;;-1:-1:-1;;;;;40777:15:0;;:23;;2774:18:1;;40777:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40821:176;;;13581:25:1;;;13637:2;13622:18;;13615:34;;;13665:18;;;13658:34;;;13723:2;13708:18;;13701:34;;;40660:145:0;;-1:-1:-1;40660:145:0;;-1:-1:-1;40660:145:0;-1:-1:-1;40977:9:0;;40939:5;;40821:176;;13568:3:1;13553:19;40821:176:0;;;;;;;40649:356;;;40595:410;:::o;6091:177::-;-1:-1:-1;;;;;6242:18:0;6210:7;6242:18;;;;;;;;;;;;6091:177::o;13068:148::-;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;13159:6:::1;::::0;13138:40:::1;::::0;13175:1:::1;::::0;-1:-1:-1;;;;;13159:6:0::1;::::0;13138:40:::1;::::0;13175:1;;13138:40:::1;13189:6;:19:::0;;-1:-1:-1;;;;;;13189:19:0::1;::::0;;13068:148::o;33520:127::-;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;33594:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;33594:45:0;;-1:-1:-1;;;;;178:32:1;;;33594:45:0::1;::::0;::::1;160:51:1::0;33594:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;33594:45:0::1;14:203:1::0;37206:208:0;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;37275:15:::1;::::0;:46:::1;::::0;-1:-1:-1;;;37275:46:0;;-1:-1:-1;;;;;178:32:1;;;37275:46:0::1;::::0;::::1;160:51:1::0;37275:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;37275:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;37332:29:0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:36;;-1:-1:-1;;37332:36:0::1;37364:4;37332:36;::::0;;-1:-1:-1;37379:27:0::1;37352:8:::0;37379:17:::1;:27::i;33948:170::-:0;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34060:41:0;;;::::1;;::::0;;;:33:::1;:41;::::0;;;;:50;;-1:-1:-1;;34060:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;33948:170::o;37666:1429::-;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;38010:11:::1;:21:::0;;;38042:16:::1;:31:::0;;;38084:15:::1;:30:::0;;;38125:13:::1;:26:::0;;;38162:12:::1;:23:::0;;;38196:17:::1;:33:::0;;;38240:16:::1;:32:::0;;;38283:14:::1;:28:::0;;;38322:9:::1;:18:::0;;;38351:10:::1;:20:::0;;;38400:117:::1;38364:7:::0;38400:87:::1;38216:13:::0;38400:87;38300:11;38259:13;38400:32:::1;:50::i;:::-;:68:::0;::::1;:87::i;:117::-;38384:13;:133;;;;38545:113;38648:9;;38545:84;38612:16;;38545:48;38577:15;;38545:13;;:31;;:48;;;;:::i;:113::-;38530:12;:128:::0;38679:13:::1;::::0;38696:2:::1;-1:-1:-1::0;38679:19:0;::::1;::::0;:41:::1;;;38718:2;38702:12;;:18;;38679:41;38671:94;;;::::0;-1:-1:-1;;;38671:94:0;;13948:2:1;38671:94:0::1;::::0;::::1;13930:21:1::0;13987:2;13967:18;;;13960:30;14026:34;14006:18;;;13999:62;-1:-1:-1;;;14077:18:1;;;14070:38;14125:19;;38671:94:0::1;13746:404:1::0;38671:94:0::1;38808:12;::::0;38835:17:::1;::::0;38867:16:::1;::::0;38898:14:::1;::::0;38927:11:::1;::::0;38953:16:::1;::::0;38984:15:::1;::::0;39014:13:::1;::::0;39042:9:::1;::::0;39066:10:::1;::::0;38783:304:::1;::::0;;14554:25:1;;;14610:2;14595:18;;14588:34;;;;14638:18;;;14631:34;;;;14696:2;14681:18;;14674:34;;;;14739:3;14724:19;;14717:35;;;;14783:3;14768:19;;14761:35;14827:3;14812:19;;14805:35;14871:3;14856:19;;14849:35;14915:3;14900:19;;14893:35;14959:3;14944:19;;14937:35;38783:304:0::1;::::0;14541:3:1;14526:19;38783:304:0::1;;;;;;;37666:1429:::0;;;;;;;;;;:::o;37422:236::-;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;37528:2:::1;37510:14;:20;;37501:64;;;::::0;-1:-1:-1;;;37501:64:0;;15185:2:1;37501:64:0::1;::::0;::::1;15167:21:1::0;15224:2;15204:18;;;15197:30;15263:32;15243:18;;;15236:60;15313:18;;37501:64:0::1;14983:354:1::0;37501:64:0::1;37576:11;:28:::0;;;37620:30:::1;::::0;2801:25:1;;;37620:30:0::1;::::0;2789:2:1;2774:18;37620:30:0::1;;;;;;;;37422:236:::0;:::o;41412:109::-;41466:15;;:47;;-1:-1:-1;;;41466:47:0;;41495:10;41466:47;;;12668:51:1;12762:14;;12755:22;12735:18;;;12728:50;-1:-1:-1;;;;;41466:15:0;;;;:28;;12641:18:1;;41466:47:0;12484:300:1;36957:241:0;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;37055:6:::1;37043:8;:18;;:41;;;;;37077:7;37065:8;:19;;37043:41;37035:50;;;::::0;::::1;;37135:16;::::0;37101:51:::1;::::0;37125:8;;37101:51:::1;::::0;;;::::1;37163:16;:27:::0;36957:241::o;32721:188::-;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;32785:14:::1;::::0;-1:-1:-1;;;32785:14:0;::::1;;;32784:15;32776:24;;;::::0;::::1;;32811:14;:21:::0;;-1:-1:-1;;;;32811:21:0::1;-1:-1:-1::0;;;32811:21:0::1;::::0;;32857:12:::1;32843:11;:26:::0;32885:16:::1;::::0;::::1;::::0;32811:21;;32885:16:::1;32721:188::o:0;5762:104::-;5818:13;5851:7;5844:14;;;;;:::i;36240:163::-;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;36354:41:::1;36383:4;36389:5;36354:28;:41::i;:::-;36240:163:::0;;:::o;36411:121::-;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;36481:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;36481:43:0;;2140:14:1;;2133:22;36481:43:0::1;::::0;::::1;2115:41:1::0;-1:-1:-1;;;;;36481:15:0;;::::1;::::0;:36:::1;::::0;2088:18:1;;36481:43:0::1;1975:187:1::0;35016:176:0;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;35106:6:::1;35088:24;;:14;;;;;;;;;;;:24;;::::0;35080:33:::1;;;::::0;::::1;;35124:14;:23:::0;;;::::1;;-1:-1:-1::0;;;35124:23:0::1;-1:-1:-1::0;;;;35124:23:0;;::::1;;::::0;;35163:21:::1;::::0;::::1;::::0;::::1;::::0;35141:6;2140:14:1;2133:22;2115:41;;2103:2;2088:18;;1975:187;33685:201:0;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;33759:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;33759:45:0;;-1:-1:-1;;;;;178:32:1;;;33759:45:0::1;::::0;::::1;160:51:1::0;33759:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;33759:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;33815:15:0::1;::::0;-1:-1:-1;;;;;33815:15:0::1;::::0;-1:-1:-1;33815:26:0::1;::::0;-1:-1:-1;33842:7:0;33851:26:::1;33842:7:::0;33851:17:::1;:26::i;:::-;33815:63;::::0;-1:-1:-1;;;;;;33815:63:0::1;::::0;;;;;;-1:-1:-1;;;;;11812:32:1;;;33815:63:0::1;::::0;::::1;11794:51:1::0;11861:18;;;11854:34;11767:18;;33815:63:0::1;11612:282:1::0;7697:400:0;7817:4;7839:228;289:10;7889:7;7911:145;7968:15;7911:145;;;;;;;;;;;;;;;;;289:10;7911:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;7911:34:0;;;;;;;;;;;;:38;:145::i;35200:662::-;35259:14;;-1:-1:-1;;;35259:14:0;;;;35251:49;;;;-1:-1:-1;;;35251:49:0;;16112:2:1;35251:49:0;;;16094:21:1;16151:2;16131:18;;;16124:30;-1:-1:-1;;;16170:18:1;;;16163:52;16232:18;;35251:49:0;15910:346:1;35251:49:0;35319:24;;;;:14;:24;;;;;;:29;;35311:66;;;;-1:-1:-1;;;35311:66:0;;16463:2:1;35311:66:0;;;16445:21:1;16502:2;16482:18;;;16475:30;16541:26;16521:18;;;16514:54;16585:18;;35311:66:0;16261:348:1;35311:66:0;35443:29;:15;35463:8;35443:19;:29::i;:::-;289:10;35410:30;;;;:16;:30;;;;;;:62;35388:148;;;;-1:-1:-1;;;35388:148:0;;16816:2:1;35388:148:0;;;16798:21:1;16855:2;16835:18;;;16828:30;16894:34;16874:18;;;16867:62;-1:-1:-1;;;16945:18:1;;;16938:34;16989:19;;35388:148:0;16614:400:1;35388:148:0;35576:24;;;;:14;:24;;;;;;;;;289:10;35547:26;;:12;:26;;;;;;:53;35644:29;:15;35576:24;35644:19;:29::i;:::-;289:10;35611:30;;;;:16;:30;;;;;:62;;;;35684:15;;-1:-1:-1;;;;;35684:15:0;;:26;;35752:31;289:10;35752:17;:31::i;:::-;35684:110;;-1:-1:-1;;;;;;35684:110:0;;;;;;;-1:-1:-1;;;;;11812:32:1;;;35684:110:0;;;11794:51:1;11861:18;;;11854:34;11767:18;;35684:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35831:12;289:10;;209:98;35831:12;-1:-1:-1;;;;;35810:44:0;;35845:8;35810:44;;;;2801:25:1;;2789:2;2774:18;;2655:177;35810:44:0;;;;;;;;35200:662;:::o;39584:184::-;39713:15;;:47;;-1:-1:-1;;;39713:47:0;;-1:-1:-1;;;;;178:32:1;;;39713:47:0;;;160:51:1;39681:7:0;;39713:15;;:38;;133:18:1;;39713:47:0;14:203:1;6276:216:0;6398:4;6420:42;289:10;6444:9;6455:6;6420:9;:42::i;39955:307::-;40219:15;;:35;;-1:-1:-1;;;40219:35:0;;-1:-1:-1;;;;;178:32:1;;;40219:35:0;;;160:51:1;40069:7:0;;;;;;;;;;;;40219:15;;;;:26;;133:18:1;;40219:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40212:42;;;;-1:-1:-1;40212:42:0;;-1:-1:-1;40212:42:0;-1:-1:-1;40212:42:0;-1:-1:-1;40212:42:0;;-1:-1:-1;39955:307:0;-1:-1:-1;;39955:307:0:o;34536:174::-;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;34624:3:::1;34615:5;:12;;34607:63;;;::::0;-1:-1:-1;;;34607:63:0;;17783:2:1;34607:63:0::1;::::0;::::1;17765:21:1::0;17822:2;17802:18;;;17795:30;17861:34;17841:18;;;17834:62;-1:-1:-1;;;17912:18:1;;;17905:36;17958:19;;34607:63:0::1;17581:402:1::0;34607:63:0::1;34681:13;:21:::0;34536:174::o;41964:127::-;42048:15;;:35;;-1:-1:-1;;;42048:35:0;;-1:-1:-1;;;;;178:32:1;;;42048:35:0;;;160:51:1;42024:4:0;;42048:15;;:26;;133:18:1;;42048:35:0;14:203:1;53057:1673:0;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;53235:9:::1;:16;53211:13;:20;:40;53189:133;;;::::0;-1:-1:-1;;;53189:133:0;;18190:2:1;53189:133:0::1;::::0;::::1;18172:21:1::0;18229:2;18209:18;;;18202:30;18268:34;18248:18;;;18241:62;-1:-1:-1;;;18319:18:1;;;18312:41;18370:19;;53189:133:0::1;17988:407:1::0;53189:133:0::1;53443:3;53419:13;:20;:27;;53397:115;;;::::0;-1:-1:-1;;;53397:115:0;;18602:2:1;53397:115:0::1;::::0;::::1;18584:21:1::0;18641:2;18621:18;;;18614:30;18680:34;18660:18;;;18653:62;-1:-1:-1;;;18731:18:1;;;18724:36;18777:19;;53397:115:0::1;18400:402:1::0;53397:115:0::1;53523:21;53564:7:::0;53559:119:::1;53581:9;:16;53577:1;:20;;;53559:119;;;53635:31;53653:9;53663:1;53653:12;;;;;;;;;;:::i;:::-;;;;;;;53635:13;:17;;:31;;;;:::i;:::-;53619:47:::0;-1:-1:-1;53599:3:0;::::1;::::0;::::1;:::i;:::-;;;;53559:119;;;;53735:13;53710:21;53720:10;53710:9;:21::i;:::-;:38;;53688:132;;;::::0;-1:-1:-1;;;53688:132:0;;19189:2:1;53688:132:0::1;::::0;::::1;19171:21:1::0;19228:2;19208:18;;;19201:30;19267:34;19247:18;;;19240:62;-1:-1:-1;;;19318:18:1;;;19311:42;19370:19;;53688:132:0::1;18987:408:1::0;53688:132:0::1;53863:10;6634:7:::0;6666:18;;;:11;:18;;;;;;;;53883:4:::1;6666:27:::0;;;;;;;;53893:13;-1:-1:-1;53853:53:0::1;53831:150;;;::::0;-1:-1:-1;;;53831:150:0;;19602:2:1;53831:150:0::1;::::0;::::1;19584:21:1::0;19641:2;19621:18;;;19614:30;19680:34;19660:18;;;19653:62;-1:-1:-1;;;19731:18:1;;;19724:45;19786:19;;53831:150:0::1;19400:411:1::0;53831:150:0::1;53992:19;54022::::0;54057:7:::1;54052:671;54070:13;:20;54066:1;:24;;;54052:671;;;54126:13;54140:1;54126:16;;;;;;;;;;:::i;:::-;;;;;;;54112:30;;54206:1;-1:-1:-1::0;;;;;54183:25:0::1;:11;-1:-1:-1::0;;;;;54183:25:0::1;;;:107;;;;-1:-1:-1::0;54248:42:0::1;-1:-1:-1::0;;;;;54233:57:0;::::1;;;54183:107;54157:201;;;::::0;-1:-1:-1;;;54157:201:0;;20018:2:1;54157:201:0::1;::::0;::::1;20000:21:1::0;;;20037:18;;;20030:30;20096:34;20076:18;;;20069:62;20148:18;;54157:201:0::1;19816:356:1::0;54157:201:0::1;54387:22;54397:11;54387:9;:22::i;:::-;54373:36;;54424:4;-1:-1:-1::0;;;;;54424:17:0::1;;54442:10;54454:11;54467:9;54477:1;54467:12;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;54424:56:::1;::::0;-1:-1:-1;;;;;;54424:56:0::1;::::0;;;;;;-1:-1:-1;;;;;20435:15:1;;;54424:56:0::1;::::0;::::1;20417:34:1::0;20487:15;;;;20467:18;;;20460:43;20519:18;;;20512:34;20352:18;;54424:56:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54561:9;54571:1;54561:12;;;;;;;;;;:::i;:::-;;;;;;;54547:11;:26;;;;:::i;:::-;54521:22;54531:11;54521:9;:22::i;:::-;:52;54495:162;;;::::0;-1:-1:-1;;;54495:162:0;;20892:2:1;54495:162:0::1;::::0;::::1;20874:21:1::0;20931:2;20911:18;;;20904:30;20970:34;20950:18;;;20943:62;-1:-1:-1;;;21021:18:1;;;21014:46;21077:19;;54495:162:0::1;20690:412:1::0;54495:162:0::1;54677:34;54685:11;54698:9;54708:1;54698:12;;;;;;;;;;:::i;:::-;;;;;;;54677:34;;;;;;-1:-1:-1::0;;;;;11812:32:1;;;;11794:51;;11876:2;11861:18;;11854:34;11782:2;11767:18;;11612:282;54677:34:0::1;;;;;;;;54092:3:::0;::::1;::::0;::::1;:::i;:::-;;;;54052:671;;;;53178:1552;;;53057:1673:::0;;:::o;32974:268::-;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33046:41:0;;::::1;;::::0;;;:33:::1;:41;::::0;;;;;;;:48;;33090:4:::1;-1:-1:-1::0;;33046:48:0;;::::1;::::0;::::1;::::0;;;33105:19:::1;:27:::0;;;;;;;:34;;;;::::1;::::0;;::::1;::::0;;33150:15:::1;::::0;:44;;-1:-1:-1;;;33150:44:0;;::::1;::::0;::::1;160:51:1::0;;;;33150:15:0;::::1;::::0;:36:::1;::::0;133:18:1;33150:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;33210:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;33210:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;33210:24:0::1;14:203:1::0;36024:208:0;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;36104:21:::1;::::0;:32;::::1;;:21;::::0;;::::1;:32;;::::0;36096:41:::1;;;::::0;::::1;;36148:21;:31:::0;;-1:-1:-1;;36148:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;36195:29:::1;::::0;2115:41:1;;;36195:29:0::1;::::0;2103:2:1;2088:18;36195:29:0::1;1975:187:1::0;49420:158:0;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;49490:15:::1;::::0;:40:::1;::::0;-1:-1:-1;;;49490:40:0;;-1:-1:-1;;;;;178:32:1;;;49490:40:0::1;::::0;::::1;160:51:1::0;49490:15:0;;::::1;::::0;:33:::1;::::0;133:18:1;;49490:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;49546:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;49546:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;49546:24:0::1;14:203:1::0;41124:130:0;41207:15;;:39;;;-1:-1:-1;;;41207:39:0;;;;41180:7;;-1:-1:-1;;;;;41207:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;40270:317;40539:15;;:40;;-1:-1:-1;;;40539:40:0;;;;;2801:25:1;;;40389:7:0;;;;;;;;;;;;-1:-1:-1;;;;;40539:15:0;;;;:33;;2774:18:1;;40539:40:0;2655:177:1;13224:281:0;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13327:22:0;::::1;13305:110;;;::::0;-1:-1:-1;;;13305:110:0;;21309:2:1;13305:110:0::1;::::0;::::1;21291:21:1::0;21348:2;21328:18;;;21321:30;21387:34;21367:18;;;21360:62;-1:-1:-1;;;21438:18:1;;;21431:36;21484:19;;13305:110:0::1;21107:402:1::0;13305:110:0::1;13452:6;::::0;13431:38:::1;::::0;-1:-1:-1;;;;;13431:38:0;;::::1;::::0;13452:6:::1;::::0;13431:38:::1;::::0;13452:6:::1;::::0;13431:38:::1;13480:6;:17:::0;;-1:-1:-1;;;;;;13480:17:0::1;-1:-1:-1::0;;;;;13480:17:0;;;::::1;::::0;;;::::1;::::0;;13224:281::o;41529:107::-;41582:15;;:46;;-1:-1:-1;;;41582:46:0;;41610:10;41582:46;;;12668:51:1;12762:14;;12755:22;12735:18;;;12728:50;-1:-1:-1;;;;;41582:15:0;;;;:27;;12641:18:1;;41582:46:0;12484:300:1;34780:222:0;12981:6;;-1:-1:-1;;;;;12981:6:0;289:10;12981:22;12973:67;;;;-1:-1:-1;;;12973:67:0;;;;;;;:::i;:::-;34855:16:::1;:5:::0;34864:6:::1;34855:16;:::i;:::-;34847:24;;34914:4;34899:12;;:19;;;;:::i;:::-;34890:5;:28;;34882:84;;;::::0;-1:-1:-1;;;34882:84:0;;21938:2:1;34882:84:0::1;::::0;::::1;21920:21:1::0;21977:2;21957:18;;;21950:30;22016:34;21996:18;;;21989:62;-1:-1:-1;;;22067:18:1;;;22060:41;22118:19;;34882:84:0::1;21736:407:1::0;34882:84:0::1;34977:9;:17:::0;34780:222::o;10880:181::-;10938:7;;10970:5;10974:1;10970;:5;:::i;:::-;10958:17;;10999:1;10994;:6;;10986:46;;;;-1:-1:-1;;;10986:46:0;;22350:2:1;10986:46:0;;;22332:21:1;22389:2;22369:18;;;22362:30;22428:29;22408:18;;;22401:57;22475:18;;10986:46:0;22148:351:1;10986:46:0;11052:1;10880:181;-1:-1:-1;;;10880:181:0:o;11447:250::-;11505:7;11529:1;11534;11529:6;11525:47;;-1:-1:-1;11559:1:0;11552:8;;11525:47;11584:9;11596:5;11600:1;11596;:5;:::i;:::-;11584:17;-1:-1:-1;11629:1:0;11620:5;11624:1;11584:17;11620:5;:::i;:::-;:10;11612:56;;;;-1:-1:-1;;;11612:56:0;;22706:2:1;11612:56:0;;;22688:21:1;22745:2;22725:18;;;22718:30;22784:34;22764:18;;;22757:62;-1:-1:-1;;;22835:18:1;;;22828:31;22876:19;;11612:56:0;22504:397:1;11705:132:0;11763:7;11790:39;11794:1;11797;11790:39;;;;;;;;;;;;;;;;;:3;:39::i;51054:1995::-;51123:6;51133:1;51123:11;51119:50;;51054:1995;:::o;51119:50::-;51179:24;51196:6;51179:16;:24::i;:::-;51214:19;51236:25;51250:10;;51236:9;;:13;;:25;;;;:::i;:::-;51477:13;;51214:47;;-1:-1:-1;51289:4:0;;;;;;51274:12;;;;;;51477:17;51473:261;;51530:192;51712:9;;51693:16;;51677:13;;:32;;;;:::i;:::-;:44;;;;:::i;:::-;51530:128;51644:13;;51530:95;51613:11;51530:64;51584:9;;51530:35;:53;;:64;;;;:::i;:95::-;:113;;:128::i;:192::-;51511:211;;51473:261;51748:14;;:18;51744:268;;51803:197;51989:10;;51969:17;;51952:14;;:34;;;;:::i;:::-;:47;;;;:::i;:::-;51803:130;51918:14;;51803:96;51887:11;51803:65;51857:10;;51803:35;:53;;:65;;;;:::i;:197::-;51783:217;;51744:268;52034:39;:16;52055:17;52034:20;:39::i;:::-;52022:51;-1:-1:-1;52090:13:0;;52086:111;;52142:15;;52134:51;;-1:-1:-1;;;;;52142:15:0;;;;52171:9;;52134:51;;;;52171:9;52142:15;52134:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52120:65:0;;-1:-1:-1;;52086:111:0;52217:21;52290:31;52311:9;;52290:16;;:20;;:31;;;;:::i;:::-;52263:10;;52241:17;;:33;;:21;:33::i;:::-;:80;;;;:::i;:::-;52217:104;-1:-1:-1;52334:19:0;52368:17;;52364:104;;52416:40;:21;52442:13;52416:25;:40::i;:::-;52402:54;;52364:104;52478:23;52546:11;52504:39;52525:17;;52504:16;;:20;;:39;;;;:::i;:::-;:53;;;;:::i;:::-;52478:79;;52568:17;52616:11;52588:25;52602:10;;52588:9;;:13;;:25;;;;:::i;:::-;:39;;;;:::i;:::-;52568:59;-1:-1:-1;52644:19:0;;52640:126;;52705:15;;52697:57;;-1:-1:-1;;;;;52705:15:0;;;;52734;;52697:57;;;;52734:15;52705;52697:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52680:74:0;;-1:-1:-1;;52640:126:0;52780:13;;52776:108;;52835:9;;52827:45;;-1:-1:-1;;;;;52835:9:0;;;;52858;;52827:45;;;;52858:9;52835;52827:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52810:62:0;;-1:-1:-1;;52776:108:0;52901:140;52929:9;52953:27;52971:9;52953:15;:27;:::i;:::-;52995:7;:21;;;;;53006:10;52995:21;:35;;;;;53020:10;52995:35;52901:140;;;23312:25:1;;;23368:2;23353:18;;23346:34;;;;23423:14;23416:22;23396:18;;;23389:50;23300:2;23285:18;52901:140:0;;;;;;;51108:1941;;;;;;;;;;;51054:1995;:::o;11069:136::-;11127:7;11154:43;11158:1;11161;11154:43;;;;;;;;;;;;;;;;;:3;:43::i;9572:380::-;-1:-1:-1;;;;;9708:19:0;;9700:68;;;;-1:-1:-1;;;9700:68:0;;23652:2:1;9700:68:0;;;23634:21:1;23691:2;23671:18;;;23664:30;23730:34;23710:18;;;23703:62;-1:-1:-1;;;23781:18:1;;;23774:34;23825:19;;9700:68:0;23450:400:1;9700:68:0;-1:-1:-1;;;;;9787:21:0;;9779:68;;;;-1:-1:-1;;;9779:68:0;;24057:2:1;9779:68:0;;;24039:21:1;24096:2;24076:18;;;24069:30;24135:34;24115:18;;;24108:62;-1:-1:-1;;;24186:18:1;;;24179:32;24228:19;;9779:68:0;23855:398:1;9779:68:0;-1:-1:-1;;;;;9860:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;9912:32;;2801:25:1;;;9912:32:0;;2774:18:1;9912:32:0;;;;;;;;9572:380;;;:::o;8105:610::-;-1:-1:-1;;;;;8245:20:0;;8237:70;;;;-1:-1:-1;;;8237:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8326:23:0;;8318:71;;;;-1:-1:-1;;;8318:71:0;;;;;;;:::i;:::-;8482:108;8518:6;8482:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8482:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;8462:17:0;;;:9;:17;;;;;;;;;;;:128;;;;8624:20;;;;;;;:32;;8649:6;8624:24;:32::i;:::-;-1:-1:-1;;;;;8601:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;8672:35;2801:25:1;;;8601:20:0;;8672:35;;;;;;2774:18:1;8672:35:0;2655:177:1;42099:6021:0;-1:-1:-1;;;;;42231:18:0;;42223:68;;;;-1:-1:-1;;;42223:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42310:16:0;;42302:64;;;;-1:-1:-1;;;42302:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42529:39:0;;42377:18;42529:39;;;:33;:39;;;;;;42377:18;;;;;;;;42529:39;;42524:132;;42593:14;;-1:-1:-1;;;42593:14:0;;;;42585:59;;;;-1:-1:-1;;;42585:59:0;;25270:2:1;42585:59:0;;;25252:21:1;;;25289:18;;;25282:30;25348:34;25328:18;;;25321:62;25400:18;;42585:59:0;25068:356:1;42585:59:0;42670:6;42680:1;42670:11;42666:5269;;42698:28;42714:4;42720:2;42724:1;42698:15;:28::i;:::-;42741:7;;;;;42099:6021;;;:::o;42666:5269::-;42784:8;;-1:-1:-1;;;42784:8:0;;;;42783:9;:39;;;;-1:-1:-1;;;;;;42797:25:0;;;;;;:19;:25;;;;;;;;42796:26;42783:39;:67;;;;-1:-1:-1;;;;;;42827:23:0;;;;;;:19;:23;;;;;;;;42826:24;42783:67;42765:5170;;;-1:-1:-1;;;;;42894:29:0;;;42877:14;42894:29;;;:25;:29;;;;;;;42954:31;;;;;;;;42894:29;;;;;42954:31;43006:9;;:23;;;;;43020:9;43019:10;43006:23;43002:2287;;;43050:13;43066:32;43094:3;43066:23;43077:11;;43066:6;:10;;:23;;;;:::i;:32::-;43050:48;-1:-1:-1;43126:17:0;:6;43050:48;43126:10;:17::i;:::-;43117:26;;43162:43;43178:4;43192;43199:5;43162:15;:43::i;:::-;43224:33;43240:4;43246:2;43250:6;43224:15;:33::i;:::-;43276:15;;-1:-1:-1;;;;;43276:15:0;:26;43303:4;43309:23;43303:4;43309:17;:23::i;:::-;43276:57;;-1:-1:-1;;;;;;43276:57:0;;;;;;;-1:-1:-1;;;;;11812:32:1;;;43276:57:0;;;11794:51:1;11861:18;;;11854:34;11767:18;;43276:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43352:15:0;;-1:-1:-1;;;;;43352:15:0;;-1:-1:-1;43352:26:0;;-1:-1:-1;43379:2:0;43383:21;43379:2;43383:17;:21::i;:::-;43352:53;;-1:-1:-1;;;;;;43352:53:0;;;;;;;-1:-1:-1;;;;;11812:32:1;;;43352:53:0;;;11794:51:1;11861:18;;;11854:34;11767:18;;43352:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43424:7;;;;;;;;42099:6021;;;:::o;43002:2287::-;43484:8;43483:9;:27;;;;-1:-1:-1;43496:14:0;;-1:-1:-1;;;43496:14:0;;;;43483:27;43479:1810;;;-1:-1:-1;;;;;43561:22:0;;;;;;:16;:22;;;;;;43587:15;-1:-1:-1;43561:41:0;43531:144;;;;-1:-1:-1;;;43531:144:0;;25631:2:1;43531:144:0;;;25613:21:1;25670:2;25650:18;;;25643:30;25709:31;25689:18;;;25682:59;25758:18;;43531:144:0;25429:353:1;43531:144:0;-1:-1:-1;;;;;43698:22:0;;;;;;:16;:22;;;;;;:27;43694:147;;-1:-1:-1;;;;;43750:22:0;;43775:1;43750:22;;;:16;:22;;;;;;;;:26;;;43799:12;:18;;;;;:22;43694:147;43479:1810;;;43881:9;43877:1412;;;43924:14;;43968:12;;44015:17;;44066:16;;44111:10;;44146:14;;43924;;-1:-1:-1;43968:12:0;;-1:-1:-1;44015:17:0;;-1:-1:-1;44066:16:0;-1:-1:-1;44111:10:0;-1:-1:-1;44146:14:0;;44142:271;;;44250:13;;44237:9;44208:39;;;;:28;:39;;;;;;:55;;44250:13;44208:55;:::i;:::-;44189:15;:74;;44181:134;;;;-1:-1:-1;;;44181:134:0;;25989:2:1;44181:134:0;;;25971:21:1;26028:2;26008:18;;;26001:30;-1:-1:-1;;;26047:18:1;;;26040:52;26109:18;;44181:134:0;25787:346:1;44181:134:0;44363:9;44334:39;;;;:28;:39;;;;;44376:15;44334:57;;43877:1412;;;44440:8;44436:853;;;44482:13;;44525:11;;44571:16;;44621:15;;44665:9;;44699:14;;44482:13;;-1:-1:-1;44525:11:0;;-1:-1:-1;44571:16:0;;-1:-1:-1;44621:15:0;-1:-1:-1;44665:9:0;-1:-1:-1;44699:14:0;;44695:370;;;44757:11;;:16;;44771:2;44757:16;:::i;:::-;44742:12;:31;44734:61;;;;-1:-1:-1;;;44734:61:0;;26340:2:1;44734:61:0;;;26322:21:1;26379:2;26359:18;;;26352:30;-1:-1:-1;;;26398:18:1;;;26391:48;26456:18;;44734:61:0;26138:342:1;44734:61:0;44837:13;;44822:11;:28;;44814:64;;;;-1:-1:-1;;;44814:64:0;;26687:2:1;44814:64:0;;;26669:21:1;26726:2;26706:18;;;26699:30;26765:26;26745:18;;;26738:54;26809:18;;44814:64:0;26485:348:1;44814:64:0;44930:9;44905:35;;;;:24;:35;;;;;;44944:12;44905:51;;44897:83;;;;-1:-1:-1;;;44897:83:0;;27040:2:1;44897:83:0;;;27022:21:1;27079:2;27059:18;;;27052:30;-1:-1:-1;;;27098:18:1;;;27091:50;27158:18;;44897:83:0;26838:344:1;44897:83:0;45024:9;44999:35;;;;:24;:35;;;;;45037:12;44999:50;;44695:370;45093:32;45128:13;45138:2;45128:9;:13::i;:::-;45201:9;;45093:48;;-1:-1:-1;45164:33:0;45191:6;45093:48;45164:33;:::i;:::-;:46;;45156:117;;;;-1:-1:-1;;;45156:117:0;;27389:2:1;45156:117:0;;;27371:21:1;27428:2;27408:18;;;27401:30;27467:34;27447:18;;;27440:62;-1:-1:-1;;;27518:18:1;;;27511:34;27562:19;;45156:117:0;27187:400:1;45156:117:0;44450:839;44436:853;45305:17;45325:72;45389:7;45358:28;45373:13;45358:12;:28;:::i;:::-;:38;;;;:::i;:::-;45325:10;;:32;:72::i;:::-;45305:92;;45414:28;45445:24;45463:4;45445:9;:24::i;:::-;45525:18;;45414:55;;-1:-1:-1;45501:42:0;;;;;;;45564:43;;-1:-1:-1;;;;;;45576:31:0;;;;;;:25;:31;;;;;;;;45575:32;45564:43;45560:1251;;;45628:8;:15;;-1:-1:-1;;;;45628:15:0;-1:-1:-1;;;45628:15:0;;;45668:21;;45628:15;45668:21;:41;;;;;45708:1;45693:12;:16;45668:41;:61;;;;;45728:1;45713:12;;:16;45668:61;45664:903;;;45754:20;45777:25;45791:10;;45777:9;;:13;;:25;;;;:::i;:::-;45754:48;;45825:24;45852:105;45944:12;45852:61;45903:9;;45852:20;:50;;:61;;;;:::i;:105::-;45825:132;;45980:22;46005:106;46098:12;46005:62;46056:10;;46005:20;:50;;:62;;;;:::i;:106::-;45980:131;;46136:21;46160:104;46251:12;;46160:60;46207:12;46160:16;:46;;:60;;;;:::i;:104::-;46136:128;;46289:22;46314:103;46403:13;;46314:58;46359:12;46314:14;:44;;:58;;;;:::i;:103::-;46289:128;-1:-1:-1;46442:18:0;46463:33;46289:128;46482:13;46463:18;:33::i;:::-;46442:54;;46521:26;46536:10;46521:14;:26::i;:::-;45731:836;;;;;;45664:903;46587:24;46614;46632:4;46614:9;:24::i;:::-;46587:51;;46657:38;46678:16;46657:20;:38::i;:::-;-1:-1:-1;46726:1:0;46714:9;:13;;;46746:10;:14;46779:8;:16;;-1:-1:-1;;;;46779:16:0;;;45560:1251;46827:12;46842:30;46868:3;46842:21;:6;46853:9;46842:10;:21::i;:30::-;46827:45;-1:-1:-1;46887:18:0;46926:12;;46922:202;;46991:3;46968:20;:6;46979:8;46968:10;:20::i;:::-;:26;;;;:::i;:::-;46955:39;;47009;47025:4;47031;;;;;;;;;-1:-1:-1;;;;;47031:4:0;47037:10;47009:15;:39::i;:::-;47078:12;;:28;;47095:10;47078:16;:28::i;:::-;47063:12;:43;46922:202;47149:29;47160:17;47167:10;47160:4;:17;:::i;:::-;47149:6;;:10;:29::i;:::-;47140:38;;47199:9;47195:155;;;47242:10;;:20;;47257:4;47242:14;:20::i;:::-;47229:10;:33;47195:155;;;47315:9;;:19;;47329:4;47315:13;:19::i;:::-;47303:9;:31;47195:155;47366:42;47382:4;47396;47403;47366:15;:42::i;:::-;47439:16;;47476:15;;:28;;-1:-1:-1;;;;;;47476:28:0;;;;;2801:25:1;;;-1:-1:-1;;;;;47476:15:0;;;;:23;;2774:18:1;;47476:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;47476:28:0;;;;;;;;-1:-1:-1;;47476:28:0;;;;;;;;;;;;:::i;:::-;;;47472:452;;;47668:231;;;13581:25:1;;;13637:2;13622:18;;13615:34;;;13665:18;;;13658:34;;;13723:2;13708:18;;13701:34;;;47871:9:0;;47818:4;;47668:231;;13568:3:1;13553:19;47668:231:0;;;;;;;47505:410;;;47472:452;42862:5073;;;;;;;;42765:5170;47947:33;47963:4;47969:2;47973:6;47947:15;:33::i;:::-;47991:15;;-1:-1:-1;;;;;47991:15:0;:26;48018:4;48024:23;48018:4;48024:17;:23::i;:::-;47991:57;;-1:-1:-1;;;;;;47991:57:0;;;;;;;-1:-1:-1;;;;;11812:32:1;;;47991:57:0;;;11794:51:1;11861:18;;;11854:34;11767:18;;47991:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48059:15:0;;-1:-1:-1;;;;;48059:15:0;;-1:-1:-1;48059:26:0;;-1:-1:-1;48086:2:0;48090:21;48086:2;48090:17;:21::i;:::-;48059:53;;-1:-1:-1;;;;;;48059:53:0;;;;;;;-1:-1:-1;;;;;11812:32:1;;;48059:53:0;;;11794:51:1;11861:18;;;11854:34;11767:18;;48059:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42212:5908;;;;;42099:6021;;;:::o;11213:226::-;11333:7;11369:12;11361:6;;;;11353:29;;;;-1:-1:-1;;;11353:29:0;;;;;;;;:::i;:::-;-1:-1:-1;11393:9:0;11405:5;11409:1;11405;:5;:::i;:::-;11393:17;11213:226;-1:-1:-1;;;;;11213:226:0:o;36669:280::-;-1:-1:-1;;;;;36752:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;36752:39:0;;;;;;;;;;;;36804:80;;36830:15;;:42;;-1:-1:-1;;;36830:42:0;;-1:-1:-1;;;;;178:32:1;;;36830:42:0;;;160:51:1;36830:15:0;;;;:36;;133:18:1;;36830:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36804:80;36901:40;;;;;;-1:-1:-1;;;;;36901:40:0;;;;;;;;36669:280;;:::o;48128:289::-;48234:14;;48194:7;;-1:-1:-1;;;48234:14:0;;;;:175;;48391:18;48401:7;48391:9;:18::i;:::-;48234:175;;;-1:-1:-1;;;;;48291:21:0;;;;;;:12;:21;;;;;;48268:103;;48349:3;;48268:54;;48291:30;;48349:3;48291:25;:30::i;:::-;48268:18;48278:7;48268:9;:18::i;11845:312::-;11965:7;12000:12;11993:5;11985:28;;;;-1:-1:-1;;;11985:28:0;;;;;;;;:::i;:::-;-1:-1:-1;12024:9:0;12036:5;12040:1;12036;:5;:::i;48913:499::-;49003:16;;;49017:1;49003:16;;;;;;;;48979:21;;49003:16;;;;;;;;;;-1:-1:-1;49003:16:0;48979:40;;49048:4;49030;49035:1;49030:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49030:23:0;;;:7;;;;;;;;;;:23;;;;49074:15;;:22;;;-1:-1:-1;;;49074:22:0;;;;:15;;;;;:20;;:22;;;;;49030:7;;49074:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49064:4;49069:1;49064:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49064:32:0;;;:7;;;;;;;;;:32;49139:15;;49107:62;;49124:4;;49139:15;49157:11;49107:8;:62::i;:::-;49180:15;;:224;;-1:-1:-1;;;49180:224:0;;-1:-1:-1;;;;;49180:15:0;;;;:66;;:224;;49261:11;;49180:15;;49331:4;;49358;;49378:15;;49180:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48425:480;48484:12;48499:13;:6;48510:1;48499:10;:13::i;:::-;48484:28;-1:-1:-1;48523:17:0;48543:16;:6;48484:28;48543:10;:16::i;:::-;48523:36;-1:-1:-1;48595:21:0;48627:22;48644:4;48627:16;:22::i;:::-;48730:18;48751:41;:21;48777:14;48751:25;:41::i;:::-;48730:62;;48803:35;48816:9;48827:10;48803:12;:35::i;:::-;48854:43;;;28909:25:1;;;28965:2;28950:18;;28943:34;;;28993:18;;;28986:34;;;48854:43:0;;28897:2:1;28882:18;48854:43:0;;;;;;;48473:432;;;;48425:480;:::o;50082:513::-;50262:15;;50230:62;;50247:4;;-1:-1:-1;;;;;50262:15:0;50280:11;50230:8;:62::i;:::-;50335:15;;-1:-1:-1;;;;;50335:15:0;:31;50374:9;50407:4;50427:11;50335:15;;50539:7;12919:6;;-1:-1:-1;;;;;12919:6:0;;12854:79;50539:7;50335:252;;;;;;-1:-1:-1;;;;;;50335:252:0;;;-1:-1:-1;;;;;29390:15:1;;;50335:252:0;;;29372:34:1;29422:18;;;29415:34;;;;29465:18;;;29458:34;;;;29508:18;;;29501:34;29572:15;;;29551:19;;;29544:44;50561:15:0;29604:19:1;;;29597:35;29306:19;;50335:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;222:180:1:-;281:6;334:2;322:9;313:7;309:23;305:32;302:52;;;350:1;347;340:12;302:52;-1:-1:-1;373:23:1;;222:180;-1:-1:-1;222:180:1:o;407:597::-;519:4;548:2;577;566:9;559:21;609:6;603:13;652:6;647:2;636:9;632:18;625:34;677:1;687:140;701:6;698:1;695:13;687:140;;;796:14;;;792:23;;786:30;762:17;;;781:2;758:26;751:66;716:10;;687:140;;;845:6;842:1;839:13;836:91;;;915:1;910:2;901:6;890:9;886:22;882:31;875:42;836:91;-1:-1:-1;988:2:1;967:15;-1:-1:-1;;963:29:1;948:45;;;;995:2;944:54;;407:597;-1:-1:-1;;;407:597:1:o;1009:131::-;-1:-1:-1;;;;;1084:31:1;;1074:42;;1064:70;;1130:1;1127;1120:12;1145:118;1231:5;1224:13;1217:21;1210:5;1207:32;1197:60;;1253:1;1250;1243:12;1268:382;1333:6;1341;1394:2;1382:9;1373:7;1369:23;1365:32;1362:52;;;1410:1;1407;1400:12;1362:52;1449:9;1436:23;1468:31;1493:5;1468:31;:::i;:::-;1518:5;-1:-1:-1;1575:2:1;1560:18;;1547:32;1588:30;1547:32;1588:30;:::i;:::-;1637:7;1627:17;;;1268:382;;;;;:::o;1655:315::-;1723:6;1731;1784:2;1772:9;1763:7;1759:23;1755:32;1752:52;;;1800:1;1797;1790:12;1752:52;1839:9;1826:23;1858:31;1883:5;1858:31;:::i;:::-;1908:5;1960:2;1945:18;;;;1932:32;;-1:-1:-1;;;1655:315:1:o;2167:248::-;2235:6;2243;2296:2;2284:9;2275:7;2271:23;2267:32;2264:52;;;2312:1;2309;2302:12;2264:52;-1:-1:-1;;2335:23:1;;;2405:2;2390:18;;;2377:32;;-1:-1:-1;2167:248:1:o;2837:127::-;2898:10;2893:3;2889:20;2886:1;2879:31;2929:4;2926:1;2919:15;2953:4;2950:1;2943:15;2969:275;3040:2;3034:9;3105:2;3086:13;;-1:-1:-1;;3082:27:1;3070:40;;3140:18;3125:34;;3161:22;;;3122:62;3119:88;;;3187:18;;:::i;:::-;3223:2;3216:22;2969:275;;-1:-1:-1;2969:275:1:o;3249:183::-;3309:4;3342:18;3334:6;3331:30;3328:56;;;3364:18;;:::i;:::-;-1:-1:-1;3409:1:1;3405:14;3421:4;3401:25;;3249:183::o;3437:662::-;3491:5;3544:3;3537:4;3529:6;3525:17;3521:27;3511:55;;3562:1;3559;3552:12;3511:55;3598:6;3585:20;3624:4;3648:60;3664:43;3704:2;3664:43;:::i;:::-;3648:60;:::i;:::-;3742:15;;;3828:1;3824:10;;;;3812:23;;3808:32;;;3773:12;;;;3852:15;;;3849:35;;;3880:1;3877;3870:12;3849:35;3916:2;3908:6;3904:15;3928:142;3944:6;3939:3;3936:15;3928:142;;;4010:17;;3998:30;;4048:12;;;;3961;;3928:142;;;-1:-1:-1;4088:5:1;3437:662;-1:-1:-1;;;;;;3437:662:1:o;4104:1215::-;4222:6;4230;4283:2;4271:9;4262:7;4258:23;4254:32;4251:52;;;4299:1;4296;4289:12;4251:52;4339:9;4326:23;4368:18;4409:2;4401:6;4398:14;4395:34;;;4425:1;4422;4415:12;4395:34;4463:6;4452:9;4448:22;4438:32;;4508:7;4501:4;4497:2;4493:13;4489:27;4479:55;;4530:1;4527;4520:12;4479:55;4566:2;4553:16;4588:4;4612:60;4628:43;4668:2;4628:43;:::i;4612:60::-;4706:15;;;4788:1;4784:10;;;;4776:19;;4772:28;;;4737:12;;;;4812:19;;;4809:39;;;4844:1;4841;4834:12;4809:39;4868:11;;;;4888:217;4904:6;4899:3;4896:15;4888:217;;;4984:3;4971:17;5001:31;5026:5;5001:31;:::i;:::-;5045:18;;4921:12;;;;5083;;;;4888:217;;;5124:5;-1:-1:-1;;5167:18:1;;5154:32;;-1:-1:-1;;5198:16:1;;;5195:36;;;5227:1;5224;5217:12;5195:36;;5250:63;5305:7;5294:8;5283:9;5279:24;5250:63;:::i;:::-;5240:73;;;4104:1215;;;;;:::o;5324:456::-;5401:6;5409;5417;5470:2;5458:9;5449:7;5445:23;5441:32;5438:52;;;5486:1;5483;5476:12;5438:52;5525:9;5512:23;5544:31;5569:5;5544:31;:::i;:::-;5594:5;-1:-1:-1;5651:2:1;5636:18;;5623:32;5664:33;5623:32;5664:33;:::i;:::-;5324:456;;5716:7;;-1:-1:-1;;;5770:2:1;5755:18;;;;5742:32;;5324:456::o;6221:241::-;6277:6;6330:2;6318:9;6309:7;6305:23;6301:32;6298:52;;;6346:1;6343;6336:12;6298:52;6385:9;6372:23;6404:28;6426:5;6404:28;:::i;6467:247::-;6526:6;6579:2;6567:9;6558:7;6554:23;6550:32;6547:52;;;6595:1;6592;6585:12;6547:52;6634:9;6621:23;6653:31;6678:5;6653:31;:::i;6943:799::-;7083:6;7091;7099;7107;7115;7123;7131;7139;7147;7155;7208:3;7196:9;7187:7;7183:23;7179:33;7176:53;;;7225:1;7222;7215:12;7176:53;-1:-1:-1;;7248:23:1;;;7318:2;7303:18;;7290:32;;-1:-1:-1;7369:2:1;7354:18;;7341:32;;7420:2;7405:18;;7392:32;;-1:-1:-1;7471:3:1;7456:19;;7443:33;;-1:-1:-1;7523:3:1;7508:19;;7495:33;;-1:-1:-1;7575:3:1;7560:19;;7547:33;;-1:-1:-1;7627:3:1;7612:19;;7599:33;;-1:-1:-1;7679:3:1;7664:19;;7651:33;;-1:-1:-1;7731:3:1;7716:19;7703:33;;-1:-1:-1;6943:799:1;-1:-1:-1;6943:799:1:o;8562:388::-;8630:6;8638;8691:2;8679:9;8670:7;8666:23;8662:32;8659:52;;;8707:1;8704;8697:12;8659:52;8746:9;8733:23;8765:31;8790:5;8765:31;:::i;:::-;8815:5;-1:-1:-1;8872:2:1;8857:18;;8844:32;8885:33;8844:32;8885:33;:::i;8955:356::-;9157:2;9139:21;;;9176:18;;;9169:30;9235:34;9230:2;9215:18;;9208:62;9302:2;9287:18;;8955:356::o;9316:127::-;9377:10;9372:3;9368:20;9365:1;9358:31;9408:4;9405:1;9398:15;9432:4;9429:1;9422:15;9448:168;9488:7;9554:1;9550;9546:6;9542:14;9539:1;9536:21;9531:1;9524:9;9517:17;9513:45;9510:71;;;9561:18;;:::i;:::-;-1:-1:-1;9601:9:1;;9448:168::o;9621:380::-;9700:1;9696:12;;;;9743;;;9764:61;;9818:4;9810:6;9806:17;9796:27;;9764:61;9871:2;9863:6;9860:14;9840:18;9837:38;9834:161;;9917:10;9912:3;9908:20;9905:1;9898:31;9952:4;9949:1;9942:15;9980:4;9977:1;9970:15;9834:161;;9621:380;;;:::o;11480:127::-;11541:10;11536:3;11532:20;11529:1;11522:31;11572:4;11569:1;11562:15;11596:4;11593:1;11586:15;11899:135;11938:3;11959:17;;;11956:43;;11979:18;;:::i;:::-;-1:-1:-1;12026:1:1;12015:13;;11899:135::o;12039:251::-;12109:6;12162:2;12150:9;12141:7;12137:23;12133:32;12130:52;;;12178:1;12175;12168:12;12130:52;12210:9;12204:16;12229:31;12254:5;12229:31;:::i;12295:184::-;12365:6;12418:2;12406:9;12397:7;12393:23;12389:32;12386:52;;;12434:1;12431;12424:12;12386:52;-1:-1:-1;12457:16:1;;12295:184;-1:-1:-1;12295:184:1:o;12789:245::-;12856:6;12909:2;12897:9;12888:7;12884:23;12880:32;12877:52;;;12925:1;12922;12915:12;12877:52;12957:9;12951:16;12976:28;12998:5;12976:28;:::i;13039:306::-;13127:6;13135;13143;13196:2;13184:9;13175:7;13171:23;13167:32;13164:52;;;13212:1;13209;13202:12;13164:52;13241:9;13235:16;13225:26;;13291:2;13280:9;13276:18;13270:25;13260:35;;13335:2;13324:9;13320:18;13314:25;13304:35;;13039:306;;;;;:::o;17019:557::-;17132:6;17140;17148;17156;17164;17172;17225:3;17213:9;17204:7;17200:23;17196:33;17193:53;;;17242:1;17239;17232:12;17193:53;17274:9;17268:16;17293:31;17318:5;17293:31;:::i;:::-;17388:2;17373:18;;17367:25;17432:2;17417:18;;17411:25;17476:2;17461:18;;17455:25;17520:3;17505:19;;17499:26;17565:3;17550:19;;;17544:26;17343:5;;17367:25;;-1:-1:-1;17411:25:1;;17455;;-1:-1:-1;17499:26:1;-1:-1:-1;17544:26:1;;-1:-1:-1;17019:557:1;-1:-1:-1;;;17019:557:1:o;18807:175::-;18844:3;18888:4;18881:5;18877:16;18917:4;18908:7;18905:17;18902:43;;18925:18;;:::i;:::-;18974:1;18961:15;;18807:175;-1:-1:-1;;18807:175:1:o;20557:128::-;20597:3;20628:1;20624:6;20621:1;20618:13;20615:39;;;20634:18;;:::i;:::-;-1:-1:-1;20670:9:1;;20557:128::o;21514:217::-;21554:1;21580;21570:132;;21624:10;21619:3;21615:20;21612:1;21605:31;21659:4;21656:1;21649:15;21687:4;21684:1;21677:15;21570:132;-1:-1:-1;21716:9:1;;21514:217::o;24258:401::-;24460:2;24442:21;;;24499:2;24479:18;;;24472:30;24538:34;24533:2;24518:18;;24511:62;-1:-1:-1;;;24604:2:1;24589:18;;24582:35;24649:3;24634:19;;24258:401::o;24664:399::-;24866:2;24848:21;;;24905:2;24885:18;;;24878:30;24944:34;24939:2;24924:18;;24917:62;-1:-1:-1;;;25010:2:1;24995:18;;24988:33;25053:3;25038:19;;24664:399::o;27592:125::-;27632:4;27660:1;27657;27654:8;27651:34;;;27665:18;;:::i;:::-;-1:-1:-1;27702:9:1;;27592:125::o;27722:980::-;27984:4;28032:3;28021:9;28017:19;28063:6;28052:9;28045:25;28089:2;28127:6;28122:2;28111:9;28107:18;28100:34;28170:3;28165:2;28154:9;28150:18;28143:31;28194:6;28229;28223:13;28260:6;28252;28245:22;28298:3;28287:9;28283:19;28276:26;;28337:2;28329:6;28325:15;28311:29;;28358:1;28368:195;28382:6;28379:1;28376:13;28368:195;;;28447:13;;-1:-1:-1;;;;;28443:39:1;28431:52;;28538:15;;;;28503:12;;;;28479:1;28397:9;28368:195;;;-1:-1:-1;;;;;;;28619:32:1;;;;28614:2;28599:18;;28592:60;-1:-1:-1;;;28683:3:1;28668:19;28661:35;28580:3;27722:980;-1:-1:-1;;;27722:980:1:o

Swarm Source

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