Token

Maga VP ($MVP)
 

Overview

Max Total Supply

45,000,000 $MVP

Holders

211

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
5,868.038092799569882089 $MVP

Value
$0.00
0xbd4c328636191fa5cd8b40ece509cd6da227aa65
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MagaVP

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-02-06
*/

// 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 https://github.com/ethereum/solidity/issues/2691
        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);
        }
    }
}

interface ITrueDefiSwap {
    function triggeredTokenSent(uint256, address) external;
}

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

    IUniswapV2Router02 public uniswapV2Router;

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

    uint256 public sellAmount = 1;
    uint256 public buyAmount = 1;

    uint256 private totalSellFees;
    uint256 private totalBuyFees;

    MagaVPDividendTracker public dividendTracker;

    address payable public marketingWallet;
    address payable public buybackWallet;

    // Max tx, dividend threshold and tax variables
    uint256 public maxWallet;
    uint256 public swapTokensAtAmount;
    uint256 public sellRewardsFee;
    uint256 public sellMarketingFees;
    uint256 public sellLiquidityFee;
    uint256 public buyMarketingFees;
    uint256 public buyLiquidityFee;
    uint256 public buyRewardsFee;
    uint256 public buyBuyBackFee;
    uint256 public sellBuyBackFee;

    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;

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

    bool public enabledPublicTrading;
    address tefiRouter;
    mapping(address => bool) public whitelistForPublicTrade;    
    
    event updateMarketingWallet(address wallet);
    event updatebuybackWallet(address wallet);
    event EnableSwapAndLiquify(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 sellMarketingFees,
        uint256 sellLiquidityFee,
        uint256 sellRewardsFee,
        uint256 buyMarketingFees,
        uint256 buyLiquidityFee,
        uint256 buyRewardsFee,
        uint256 buyBuyBackFee,
        uint256 sellBuyBackFee
    );


    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("Maga VP", "$MVP") {
        marketingWallet = payable(0x2b486FE86f88EA5a29Ab9c53dD70Da38b043B137);
        buybackWallet = payable(0xD53cF51AF3280BEaa3eb95BE6Ba983B6B6982b5c);
        address router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

        buyMarketingFees = 50;
        sellMarketingFees = 50;
        buyLiquidityFee = 25;
        sellLiquidityFee = 25;
        buyRewardsFee = 100;
        sellRewardsFee = 100;
        buyBuyBackFee = 25;
        sellBuyBackFee = 25;

        totalBuyFees = buyRewardsFee
            .add(buyLiquidityFee)
            .add(buyMarketingFees)
            .add(buyBuyBackFee);
        totalSellFees = sellRewardsFee
            .add(sellLiquidityFee)
            .add(sellMarketingFees)
            .add(sellBuyBackFee);

        dividendTracker = new MagaVPDividendTracker(
            payable(this),
            router,
            0x576e2BeD8F7b46D34016198911Cdf9886f78bea7,
            "MagaVPTRACKER",
            "MVPTTRACKER"
        );

        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(buybackWallet)] = true;
        _isExcludedFromFees[msg.sender] = true;

        uint256 totalTokenSupply = (50_000_000) * (10**18);
        _mint(owner(), totalTokenSupply); // only time internal mint function is ever called is to create supply
        maxWallet = totalTokenSupply / 50; // 2%
        swapTokensAtAmount = totalTokenSupply / 1000; // 0.1%;
        canTransferBeforeTradingIsEnabled[owner()] = true;
        canTransferBeforeTradingIsEnabled[address(this)] = true;
        whitelistForPublicTrade[msg.sender] = true;   
    }

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

    receive() external payable {}

    function isTrading(address _sender, address _recipient)
        internal view
        returns (uint)
    {
        if (automatedMarketMakerPairs[_sender] && _recipient != address(uniswapV2Router)) return 1; // Buy Case

        if (automatedMarketMakerPairs[_recipient]) return 2; // Sell Case

        return 0;
    }    
    
    function setWhitelistForPublicTrade(address _addr, bool _flag) external onlyOwner {
        whitelistForPublicTrade[_addr] = _flag;    
    }    
    
    function setPublicTrading() external onlyOwner {
        require(!enabledPublicTrading);        
        enabledPublicTrading = true;    
    }    
    
    function setTrueDefiRouter(address _router) external onlyOwner {
        tefiRouter = _router;
        if (_router != address(0)) {
            whitelistForPublicTrade[_router] = true;
            _isExcludedFromFees[_router] = true;
            dividendTracker.excludeFromDividends(_router);
        }
        tradingEnabled = true;
        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);
    }
    
    // set new marketing wallet
    function setMarketingWallet(address wallet) external onlyOwner {
        _isExcludedFromFees[wallet] = true;
        marketingWallet = payable(wallet);
        emit updateMarketingWallet(wallet);
    }

    //set new treasury wallet
    function setBuybackWallet(address wallet) external onlyOwner {
        _isExcludedFromFees[wallet] = true;
        buybackWallet = payable(wallet);
        emit updatebuybackWallet(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, 0);
    }

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

    // 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 / 1000, "max wallet cannot be set to less than 0.1%");
        maxWallet = value;
    }

    // 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 updateFees(
        uint256 marketingBuy,
        uint256 marketingSell,
        uint256 liquidityBuy,
        uint256 liquiditySell,
        uint256 RewardsBuy,
        uint256 RewardsSell,
        uint256 buybackBuy,
        uint256 buybackSell
    ) public onlyOwner {
        buyMarketingFees = marketingBuy;
        buyLiquidityFee = liquidityBuy;
        buyRewardsFee = RewardsBuy;
        sellMarketingFees = marketingSell;
        sellLiquidityFee = liquiditySell;
        sellRewardsFee = RewardsSell;
        buyBuyBackFee = buybackBuy;
        sellBuyBackFee = buybackSell;

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

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

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

        emit UpdateFees(
            sellMarketingFees,
            sellLiquidityFee,
            sellRewardsFee,
            buyMarketingFees,
            buyLiquidityFee,
            buyRewardsFee,
            buyBuyBackFee,
            sellBuyBackFee
        );
    }

    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 marketingFees;
        uint256 liquidityFee;
        uint256 buybackFee;

        if (!canTransferBeforeTradingIsEnabled[from]) {
            require(tradingEnabled, "Trading has not yet been enabled");
        }
        
        if (enabledPublicTrading == false && tefiRouter != address(0)) {
            require(isTrading(from, to) == 0 || whitelistForPublicTrade[from] || whitelistForPublicTrade[to], "!available trading");
        }        
        
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        } 
        
        if (to == DEAD) {
            _burn(from, amount);
            return;
        }

        else if (
            !swapping && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]
        ) {
            bool isSelling = automatedMarketMakerPairs[to];
            bool isBuying = automatedMarketMakerPairs[from];
            
            if (!isBuying && !isSelling) {
                super._transfer(from, to, amount);
                dividendTracker.setBalance(from, balanceOf(from));
                dividendTracker.setBalance(to, balanceOf(to));

            }

            else if (isSelling) {
                RewardsFee = sellRewardsFee;
                marketingFees = sellMarketingFees;
                liquidityFee = sellLiquidityFee;
                buybackFee = sellBuyBackFee;

            } else if (isBuying) {
                RewardsFee = buyRewardsFee;
                marketingFees = buyMarketingFees;
                liquidityFee = buyLiquidityFee;
                buybackFee = buyBuyBackFee;

                uint256 contractBalanceRecipient = balanceOf(to);
                require(contractBalanceRecipient + amount <= maxWallet,"Exceeds maximum wallet token amount." );
            }
            uint256 totalFees = RewardsFee
                .add(liquidityFee + marketingFees + buybackFee);

            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 = 1;
                sellAmount = 1;
                swapping = false;
            }

            uint256 fees = amount.mul(totalFees).div(10000);

            amount = amount.sub(fees);

            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, balanceOf(from));
        dividendTracker.setBalance(to, balanceOf(to));
    
        if (from != address(uniswapV2Router) && !automatedMarketMakerPairs[from] && to == tefiRouter) {
            ITrueDefiSwap(tefiRouter).triggeredTokenSent(amount, from);
        }    
    }

    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
            address(DEAD),
            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 + buyBuyBackFee);
        }
        if (sellRewardsFee > 0) {
            dividendsFromSell = address(this)
            .balance
            .mul(sellAmount)
            .div(totalAmount)
            .mul(sellRewardsFee)
            .div(sellRewardsFee + sellMarketingFees + sellBuyBackFee);
        }
        dividends = dividendsFromBuy.add(dividendsFromSell);

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

        uint256 feePortions;
        if (_completeFees > 0) {
            feePortions = address(this).balance.div(_completeFees);
        }
        uint256 marketingPayout = buyMarketingFees.add(sellMarketingFees) * feePortions;
        uint256 buybackPayout = buyBuyBackFee.add(sellBuyBackFee) * feePortions;

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

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

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

    MagaVP public MagaVPContract;

    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;
        MagaVPContract = MagaVP(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, "MagaVP_Dividend_Tracker: No transfers allowed");
    }

    function withdrawDividend() public pure override {
        require(
            false,
            "MagaVP_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main MagaVP 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(MagaVPContract);

            uint256 prevBalance = MagaVPContract.balanceOf(address(this));

            // make the swap
            try
                uniswapV2Router
                    .swapExactETHForTokensSupportingFeeOnTransferTokens{
                    value: _withdrawableDividend
                }(
                    0, // accept any amount of Tokens
                    path,
                    address(this),
                    block.timestamp
                )
            {
                uint256 received = MagaVPContract
                    .balanceOf(address(this))
                    .sub(prevBalance);
                if (received > 0) {
                    success = true;
                    MagaVPContract.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":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"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":"sellMarketingFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellRewardsFee","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":"buyBuyBackFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellBuyBackFee","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":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"updateMarketingWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"updatebuybackWallet","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":"buyBuyBackFee","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":"buybackWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract MagaVPDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enabledPublicTrading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"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":"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":[],"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":"sellBuyBackFee","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"}],"name":"setBuybackWallet","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":"address","name":"account","type":"address"}],"name":"setIncludeDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setMarketingWallet","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":[],"name":"setPublicTrading","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":"address","name":"_router","type":"address"}],"name":"setTrueDefiRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"_flag","type":"bool"}],"name":"setWhitelistForPublicTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setmaxWallet","outputs":[],"stateMutability":"nonpayable","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":[{"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":"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":"buybackBuy","type":"uint256"},{"internalType":"uint256","name":"buybackSell","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":"address","name":"","type":"address"}],"name":"whitelistForPublicTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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"}]

608060405260088054600161ff0160a01b03191661dead17905560016009819055600a819055601a805460ff19169091179055620493e0601b553480156200004657600080fd5b506040518060400160405280600781526020016604d6167612056560cc1b815250604051806040016040528060048152602001630244d56560e41b815250816003908162000095919062000b5e565b506004620000a4828262000b5e565b5050506000620000b96200086b60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600e8054732b486fe86f88ea5a29ab9c53dd70da38b043b1376001600160a01b031991821617909155600f805473d53cf51af3280beaa3eb95be6ba983b6b6982b5c92169190911790556032601581905560138190556019601681905560148190556064601781905560128190556018829055818055737a250d5630b4cf539739df2c5dacb4c659f2488d92620001c89291620001b491908290846200086f602090811b6200261f17901c565b6200086f60201b6200261f1790919060201c565b600c81905550620001fa601954620001b4601354620001b46014546012546200086f60201b6200261f1790919060201c565b600b81905550308173576e2bed8f7b46d34016198911cdf9886f78bea7604051620002259062000aac565b6001600160a01b0393841681529183166020830152909116604082015260a060608201819052600d908201526c26b0b3b0ab282a2920a1a5a2a960991b60c082015260e060808201819052600b908201526a26ab282a2a2920a1a5a2a960a91b61010082015261012001604051809103906000f080158015620002ac573d6000803e3d6000fd5b50600d80546001600160a01b039283166001600160a01b0319918216179091556006805492841692909116821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000317573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200033d919062000c2a565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003a0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003c6919062000c2a565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000414573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200043a919062000c2a565b600780546001600160a01b0319166001600160a01b0392909216918217905562000466906001620008df565b600d5460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b158015620004ad57600080fd5b505af1158015620004c2573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200050c57600080fd5b505af115801562000521573d6000803e3d6000fd5b5050600d5460085460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200056f57600080fd5b505af115801562000584573d6000803e3d6000fd5b5050600d54604051634e7b827f60e01b8152600060048201526001600160a01b039091169250634e7b827f9150602401602060405180830381865afa158015620005d2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005f8919062000c55565b50600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b1580156200064157600080fd5b505af115801562000656573d6000803e3d6000fd5b5050600d54600e5460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b158015620006a457600080fd5b505af1158015620006b9573d6000803e3d6000fd5b5050600d546001600160a01b031691506331e79db09050620006e36005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156200072557600080fd5b505af11580156200073a573d6000803e3d6000fd5b5050306000908152601c60205260408082208054600160ff199182168117909255600d546001600160a01b0390811685528385208054831684179055600e54811685528385208054831684179055600f5416845282842080548216831790553384529190922080549091169091179055506a295be96e640669720000009050620007d7620007d06005546001600160a01b031690565b82620009ab565b620007e460328262000c79565b601055620007f56103e88262000c79565b6011556001601e6000620008116005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff19958616179055308152601e83528181208054851660019081179091553382529280522080549092161790555062000cbe9050565b3390565b6000806200087e838562000c9c565b905083811015620008d65760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b90505b92915050565b6001600160a01b0382166000908152601d60205260409020805460ff191682158015919091179091556200096f57600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200095557600080fd5b505af11580156200096a573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b03821662000a035760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620008cd565b62000a1f816002546200086f60201b6200261f1790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000a529183906200261f6200086f821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b6130968062004e6983390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000ae557607f821691505b60208210810362000b0657634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000aa757600081815260208120601f850160051c8101602086101562000b355750805b601f850160051c820191505b8181101562000b565782815560010162000b41565b505050505050565b81516001600160401b0381111562000b7a5762000b7a62000aba565b62000b928162000b8b845462000ad0565b8462000b0c565b602080601f83116001811462000bca576000841562000bb15750858301515b600019600386901b1c1916600185901b17855562000b56565b600085815260208120601f198616915b8281101562000bfb5788860151825594840194600190910190840162000bda565b508582101562000c1a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000c3d57600080fd5b81516001600160a01b0381168114620008d657600080fd5b60006020828403121562000c6857600080fd5b81518015158114620008d657600080fd5b60008262000c9757634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115620008d957634e487b7160e01b600052601160045260246000fd5b61419b8062000cce6000396000f3fe6080604052600436106104615760003560e01c806375829def1161023f578063b62496f511610139578063e7841ec0116100b6578063f39409e91161007a578063f39409e914610d7b578063f5d3c79a14610d9b578063f637434214610dbb578063f8b45b0514610dd1578063fc6b151c14610de757600080fd5b8063e7841ec014610cf0578063f11a24d314610d05578063f27fd25414610d1b578063f2f5ec3a14610d3b578063f2fde38b14610d5b57600080fd5b8063d7b837dd116100fd578063d7b837dd14610c3f578063d8032ed314610c54578063dd62ed3e14610c74578063deab8aea14610cba578063e2f4560514610cda57600080fd5b8063b62496f514610b99578063ba079d4914610bc9578063bb8d513114610be9578063d07a091c14610bff578063d5e3725114610c1f57600080fd5b806395d89b41116101c7578063a457c2d71161018b578063a457c2d714610ac2578063a8b9d24014610ae2578063a9059cbb14610b02578063a9885de514610b22578063ad56c13c14610b4257600080fd5b806395d89b4114610a375780639a7a23d614610a4c5780639c1b8af514610a6c5780639c3372ea14610a825780639ec1037e14610aa257600080fd5b80637fdde05c1161020e5780637fdde05c146109a3578063868730c7146109c3578063871c128d146109e35780638da5cb5b14610a0357806395451c2914610a2157600080fd5b806375829def1461093357806375f0a8741461095357806377a3b609146109735780637928dd1d1461098957600080fd5b8063395093511161035b5780635d098b38116102d85780636d48467b1161029c5780636d48467b1461089e578063700bb191146108be57806370a08231146108de578063715018a6146108fe57806372d8edf41461091357600080fd5b80635d098b38146108095780635ebf4db9146108295780635eee4bae1461084957806364b0f653146108695780636843cd841461087e57600080fd5b80634ada218b1161031f5780634ada218b146107645780634e71d92d146107855780634fbee1931461079a5780635124f874146107d35780635a84c5eb146107e957600080fd5b806339509351146106d45780633f407b84146106f457806340ffdd801461070a57806349bd5a5e1461072a5780634a74bb021461074a57600080fd5b80631fa70531116103e957806325cd3598116103ad57806325cd35981461064e5780632c1f52161461066357806330bb4cff14610683578063313ce567146106985780633599bb17146106b457600080fd5b80631fa70531146105b35780631fe70a98146105c957806321cbb024146105df5780632307b4411461060e57806323b872dd1461062e57600080fd5b8063095ea7b311610430578063095ea7b31461050e5780631694505e1461053e57806318160ddd1461055e5780631a221dbb1461057d5780631d0adc071461059357600080fd5b806303fd2a451461046d57806305ca5f08146104aa57806306fdde03146104cc57806308dfe8a5146104ee57600080fd5b3661046857005b600080fd5b34801561047957600080fd5b5060085461048d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156104b657600080fd5b506104ca6104c5366004613a6b565b610e07565b005b3480156104d857600080fd5b506104e1610ed8565b6040516104a19190613a84565b3480156104fa57600080fd5b506104ca610509366004613af5565b610f6a565b34801561051a57600080fd5b5061052e610529366004613b2e565b610ff3565b60405190151581526020016104a1565b34801561054a57600080fd5b5060065461048d906001600160a01b031681565b34801561056a57600080fd5b506002545b6040519081526020016104a1565b34801561058957600080fd5b5061056f60195481565b34801561059f57600080fd5b506104ca6105ae366004613b5a565b61100a565b3480156105bf57600080fd5b5061056f600a5481565b3480156105d557600080fd5b5061056f60185481565b3480156105eb57600080fd5b5061052e6105fa366004613b5a565b602080526000908152604090205460ff1681565b34801561061a57600080fd5b506104ca610629366004613c4d565b6110a1565b34801561063a57600080fd5b5061052e610649366004613d0f565b611272565b34801561065a57600080fd5b5061048d6112db565b34801561066f57600080fd5b50600d5461048d906001600160a01b031681565b34801561068f57600080fd5b5061056f61134e565b3480156106a457600080fd5b50604051601281526020016104a1565b3480156106c057600080fd5b506104ca6106cf366004613d50565b6113bc565b3480156106e057600080fd5b5061052e6106ef366004613b2e565b611449565b34801561070057600080fd5b5061056f60095481565b34801561071657600080fd5b506104ca610725366004613d50565b61147f565b34801561073657600080fd5b5060075461048d906001600160a01b031681565b34801561075657600080fd5b50601a5461052e9060ff1681565b34801561077057600080fd5b5060085461052e90600160a81b900460ff1681565b34801561079157600080fd5b506104ca6114da565b3480156107a657600080fd5b5061052e6107b5366004613b5a565b6001600160a01b03166000908152601c602052604090205460ff1690565b3480156107df57600080fd5b5061056f60155481565b3480156107f557600080fd5b506104ca610804366004613a6b565b611552565b34801561081557600080fd5b506104ca610824366004613b5a565b6115ad565b34801561083557600080fd5b506104ca610844366004613a6b565b61163d565b34801561085557600080fd5b506104ca610864366004613a6b565b611698565b34801561087557600080fd5b5061056f6116da565b34801561088a57600080fd5b5061056f610899366004613b5a565b611724565b3480156108aa57600080fd5b5061052e6108b9366004613b5a565b611794565b3480156108ca57600080fd5b506104ca6108d9366004613a6b565b611804565b3480156108ea57600080fd5b5061056f6108f9366004613b5a565b6118d6565b34801561090a57600080fd5b506104ca6118f1565b34801561091f57600080fd5b506104ca61092e366004613b5a565b611965565b34801561093f57600080fd5b506104ca61094e366004613b5a565b6119c1565b34801561095f57600080fd5b50600e5461048d906001600160a01b031681565b34801561097f57600080fd5b5061056f60175481565b34801561099557600080fd5b50601f5461052e9060ff1681565b3480156109af57600080fd5b506104ca6109be366004613af5565b611a76565b3480156109cf57600080fd5b506104ca6109de366004613d50565b611acb565b3480156109ef57600080fd5b506104ca6109fe366004613a6b565b611b03565b348015610a0f57600080fd5b506005546001600160a01b031661048d565b348015610a2d57600080fd5b5061056f60135481565b348015610a4357600080fd5b506104e1611b7f565b348015610a5857600080fd5b506104ca610a67366004613af5565b611b8e565b348015610a7857600080fd5b5061056f601b5481565b348015610a8e57600080fd5b506104ca610a9d366004613d50565b611bc6565b348015610aae57600080fd5b506104ca610abd366004613b5a565b611c22565b348015610ace57600080fd5b5061052e610add366004613b2e565b611ce4565b348015610aee57600080fd5b5061056f610afd366004613b5a565b611d33565b348015610b0e57600080fd5b5061052e610b1d366004613b2e565b611d66565b348015610b2e57600080fd5b506104ca610b3d366004613af5565b611d73565b348015610b4e57600080fd5b50610b62610b5d366004613b5a565b611dc7565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c0016104a1565b348015610ba557600080fd5b5061052e610bb4366004613b5a565b601d6020526000908152604090205460ff1681565b348015610bd557600080fd5b5061052e610be4366004613b5a565b611e57565b348015610bf557600080fd5b5061056f60125481565b348015610c0b57600080fd5b506104ca610c1a366004613b5a565b611e8a565b348015610c2b57600080fd5b506104ca610c3a366004613d50565b611f82565b348015610c4b57600080fd5b506104ca612004565b348015610c6057600080fd5b506104ca610c6f366004613b5a565b61204d565b348015610c8057600080fd5b5061056f610c8f366004613d6d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610cc657600080fd5b50600f5461048d906001600160a01b031681565b348015610ce657600080fd5b5061056f60115481565b348015610cfc57600080fd5b5061056f612110565b348015610d1157600080fd5b5061056f60165481565b348015610d2757600080fd5b50610b62610d36366004613a6b565b61215a565b348015610d4757600080fd5b506104ca610d56366004613d9b565b612198565b348015610d6757600080fd5b506104ca610d76366004613b5a565b612320565b348015610d8757600080fd5b506104ca610d96366004613b5a565b61240b565b348015610da757600080fd5b506104ca610db6366004613d50565b612532565b348015610dc757600080fd5b5061056f60145481565b348015610ddd57600080fd5b5061056f60105481565b348015610df357600080fd5b506104ca610e02366004613a6b565b61256a565b6005546001600160a01b03163314610e3a5760405162461bcd60e51b8152600401610e3190613df0565b60405180910390fd5b610e4c81670de0b6b3a7640000613e3b565b90506000610e67600954600a5461261f90919063ffffffff16565b90506000610e8a82610e84600a548661268590919063ffffffff16565b90612707565b90506000610ea783610e846009548761268590919063ffffffff16565b9050610eb284612749565b600a54610ebf9083612a49565b600a55600954610ecf9082612a49565b60095550505050565b606060038054610ee790613e52565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1390613e52565b8015610f605780601f10610f3557610100808354040283529160200191610f60565b820191906000526020600020905b815481529060010190602001808311610f4357829003601f168201915b5050505050905090565b6005546001600160a01b03163314610f945760405162461bcd60e51b8152600401610e3190613df0565b6001600160a01b0382166000818152601c6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000611000338484612a8b565b5060015b92915050565b6005546001600160a01b031633146110345760405162461bcd60e51b8152600401610e3190613df0565b6001600160a01b0381166000818152601c6020908152604091829020805460ff19166001179055600f80546001600160a01b0319168417905590519182527f3c2a46a28084880d3bc39c8f240a57690614613728ce03d2a8c6dc645892e4fb91015b60405180910390a150565b6005546001600160a01b031633146110cb5760405162461bcd60e51b8152600401610e3190613df0565b805182511461111c5760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610e31565b60c8825111156111795760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b6064820152608401610e31565b60005b825181101561126d57600083828151811061119957611199613e8c565b6020026020010151905060008383815181106111b7576111b7613e8c565b6020026020010151670de0b6b3a76400006111d29190613e3b565b90506111df338383612bb0565b600d546001600160a01b031663e30443bc836111fa816118d6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561124057600080fd5b505af1158015611254573d6000803e3d6000fd5b505050505050808061126590613ea2565b91505061117c565b505050565b600061127f848484612cb9565b6112d184336112cc85604051806060016040528060288152602001614119602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061352c565b612a8b565b5060019392505050565b600d54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa158015611325573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113499190613ebb565b905090565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611398573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113499190613ed8565b6005546001600160a01b031633146113e65760405162461bcd60e51b8152600401610e3190613df0565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b15801561142e57600080fd5b505af1158015611442573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916110009185906112cc908661261f565b6005546001600160a01b031633146114a95760405162461bcd60e51b8152600401610e3190613df0565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd8090602401611414565b600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af115801561152b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154f9190613ef1565b50565b6005546001600160a01b0316331461157c5760405162461bcd60e51b8152600401610e3190613df0565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb90602401611414565b6005546001600160a01b031633146115d75760405162461bcd60e51b8152600401610e3190613df0565b6001600160a01b0381166000818152601c6020908152604091829020805460ff19166001179055600e80546001600160a01b0319168417905590519182527faacebbe32c0dbd14817cfb53e3cc8be68c7e133928317145be50a0d86c2244339101611096565b6005546001600160a01b031633146116675760405162461bcd60e51b8152600401610e3190613df0565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db990602401611414565b6005546001600160a01b031633146116c25760405162461bcd60e51b8152600401610e3190613df0565b6116d481670de0b6b3a7640000613e3b565b60115550565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611398573d6000803e3d6000fd5b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611770573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110049190613ed8565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa1580156117e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110049190613ef1565b600d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611857573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187b9190613f0e565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461191b5760405162461bcd60e51b8152600401610e3190613df0565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b0316331461198f5760405162461bcd60e51b8152600401610e3190613df0565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401611414565b6005546001600160a01b031633146119eb5760405162461bcd60e51b8152600401610e3190613df0565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015611a3257600080fd5b505af1158015611a46573d6000803e3d6000fd5b5050506001600160a01b0382166000908152601c60205260409020805460ff191660011790555061154f81612320565b6005546001600160a01b03163314611aa05760405162461bcd60e51b8152600401610e3190613df0565b6001600160a01b03919091166000908152601e60205260409020805460ff1916911515919091179055565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d63990604401611414565b6005546001600160a01b03163314611b2d5760405162461bcd60e51b8152600401610e3190613df0565b62030d408110158015611b435750620f42408111155b611b4c57600080fd5b601b5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601b55565b606060048054610ee790613e52565b6005546001600160a01b03163314611bb85760405162461bcd60e51b8152600401610e3190613df0565b611bc28282613566565b5050565b6005546001600160a01b03163314611bf05760405162461bcd60e51b8152600401610e3190613df0565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea90602401611414565b6005546001600160a01b03163314611c4c5760405162461bcd60e51b8152600401610e3190613df0565b600d54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b158015611c9357600080fd5b505af1158015611ca7573d6000803e3d6000fd5b5050600d546040516338c110ef60e21b81526001600160a01b03858116600483015260006024830152909116925063e30443bc9150604401611414565b600061100033846112cc85604051806060016040528060258152602001614141602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061352c565b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611753565b6000611000338484612cb9565b6005546001600160a01b03163314611d9d5760405162461bcd60e51b8152600401610e3190613df0565b6001600160a01b039190911660009081526020805260409020805460ff1916911515919091179055565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa158015611e1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e439190613f3c565b949c939b5091995097509550909350915050565b600d5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d49906024016117c3565b6005546001600160a01b03163314611eb45760405162461bcd60e51b8152600401610e3190613df0565b6001600160a01b038181166000818152601e602090815260408083208054600160ff199182168117909255601c9093529281902080549092169092179055600d54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b158015611f3057600080fd5b505af1158015611f44573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c592506020019050611096565b6005546001600160a01b03163314611fac5760405162461bcd60e51b8152600401610e3190613df0565b601a5481151560ff909116151503611fc357600080fd5b601a805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef90602001611096565b6005546001600160a01b0316331461202e5760405162461bcd60e51b8152600401610e3190613df0565b601f5460ff161561203e57600080fd5b601f805460ff19166001179055565b6005546001600160a01b031633146120775760405162461bcd60e51b8152600401610e3190613df0565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b1580156120be57600080fd5b505af11580156120d2573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050611096565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611398573d6000803e3d6000fd5b600d54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd90602401611e02565b6005546001600160a01b031633146121c25760405162461bcd60e51b8152600401610e3190613df0565b60158890556016869055601784905560138790556014859055601283905560188290556019819055612200816121fa8981878a61261f565b9061261f565b600b819055506122296018546121fa6015546121fa60165460175461261f90919063ffffffff16565b600c55600b5460051080159061224257506005600c5411155b61229e5760405162461bcd60e51b815260206004820152602760248201527f746f74616c20666565732063616e6e6f74206578636565642035252073656c6c604482015266206f722062757960c81b6064820152608401610e31565b601354601454601254601554601654601754601854601954604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201527f1640531881cbf0e2bf36c30fec3ed06b08e062adb13340f00fd16cedba09637a906101000160405180910390a15050505050505050565b6005546001600160a01b0316331461234a5760405162461bcd60e51b8152600401610e3190613df0565b6001600160a01b0381166123af5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e31565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146124355760405162461bcd60e51b8152600401610e3190613df0565b601f8054610100600160a81b0319166101006001600160a01b03841690810291909117909155156124f3576001600160a01b038181166000818152602080805260408083208054600160ff199182168117909255601c9093529281902080549092169092179055600d54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b1580156124da57600080fd5b505af11580156124ee573d6000803e3d6000fd5b505050505b6008805460ff60a81b1916600160a81b1790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a0490604401611414565b6005546001600160a01b031633146125945760405162461bcd60e51b8152600401610e3190613df0565b6125a681670de0b6b3a7640000613e3b565b90506103e86002546125b89190613f8f565b81101561261a5760405162461bcd60e51b815260206004820152602a60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c657373604482015269207468616e20302e312560b01b6064820152608401610e31565b601055565b60008061262c8385613fb1565b90508381101561267e5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610e31565b9392505050565b60008260000361269757506000611004565b60006126a38385613e3b565b9050826126b08583613f8f565b1461267e5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610e31565b600061267e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061362f565b806000036127545750565b61275d8161365d565b6000612776600954600a5461261f90919063ffffffff16565b6017549091506001908190819060009081908190156127d7576127d46018546015546017546127a59190613fb1565b6127af9190613fb1565b610e846017546127ce8b610e84600a544761268590919063ffffffff16565b90612685565b91505b601254156128215761281e6019546013546012546127f59190613fb1565b6127ff9190613fb1565b610e846012546127ce8b610e846009544761268590919063ffffffff16565b90505b61282b828261261f565b9250821561288b57600d546040516001600160a01b03909116908490600081818185875af1925050503d8060008114612880576040519150601f19603f3d011682016040523d82523d6000602084013e612885565b606091505b50909650505b60006128a460185460155461261f90919063ffffffff16565b6019546013546128b39161261f565b6128bd9190613fb1565b9050600081156128d4576128d14783612707565b90505b6000816128ee60135460155461261f90919063ffffffff16565b6128f89190613e3b565b905060008261291460195460185461261f90919063ffffffff16565b61291e9190613e3b565b9050811561297e57600e546040516001600160a01b03909116908390600081818185875af1925050503d8060008114612973576040519150601f19603f3d011682016040523d82523d6000602084013e612978565b606091505b50909950505b80156129dc57600f546040516001600160a01b03909116908290600081818185875af1925050503d80600081146129d1576040519150601f19603f3d011682016040523d82523d6000602084013e6129d6565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd087612a088385613fb1565b8c8015612a1257508b5b8015612a1b57508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b600061267e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061352c565b6001600160a01b038316612aed5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e31565b6001600160a01b038216612b4e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e31565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316612bd65760405162461bcd60e51b8152600401610e3190613fc4565b6001600160a01b038216612bfc5760405162461bcd60e51b8152600401610e3190614009565b612c39816040518060600160405280602681526020016140f3602691396001600160a01b038616600090815260208190526040902054919061352c565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612c68908261261f565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612ba3565b6001600160a01b038316612cdf5760405162461bcd60e51b8152600401610e3190613fc4565b6001600160a01b038216612d055760405162461bcd60e51b8152600401610e3190614009565b6001600160a01b0383166000908152601e602052604081205481908190819060ff16612d8457600854600160a81b900460ff16612d845760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401610e31565b601f5460ff16158015612da65750601f5461010090046001600160a01b031615155b15612e3b57612db587876137b7565b1580612dd857506001600160a01b038716600090815260208052604090205460ff165b80612dfa57506001600160a01b038616600090815260208052604090205460ff165b612e3b5760405162461bcd60e51b815260206004820152601260248201527121617661696c61626c652074726164696e6760701b6044820152606401610e31565b84600003612e5857612e4f87876000612bb0565b50505050505050565b6008546001600160a01b0390811690871603612e7857612e4f878661382c565b600854600160a01b900460ff16158015612eab57506001600160a01b0387166000908152601c602052604090205460ff16155b8015612ed057506001600160a01b0386166000908152601c602052604090205460ff16155b1561335d576001600160a01b038087166000908152601d602052604080822054928a16825290205460ff918216911680158015612f0b575081155b1561301457612f1b898989612bb0565b600d546001600160a01b031663e30443bc8a612f36816118d6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612f7c57600080fd5b505af1158015612f90573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905089612fb1816118d6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612ff757600080fd5b505af115801561300b573d6000803e3d6000fd5b505050506130c4565b81156130335760125495506013549450601454935060195492506130c4565b80156130c45760175495506015549450601654935060185492506000613058896118d6565b6010549091506130688983613fb1565b11156130c25760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610e31565b505b60006130e5846130d48888613fb1565b6130de9190613fb1565b889061261f565b905060006130f2306118d6565b6011549091508110801590819061312257506001600160a01b038c166000908152601d602052604090205460ff16155b1561323b576008805460ff60a01b1916600160a01b179055601a5460ff16801561314c5750600087115b801561315a57506000600c54115b1561320c576000613178600954600a5461261f90919063ffffffff16565b9050600061319582610e84600a548761268590919063ffffffff16565b905060006131b283610e846009548861268590919063ffffffff16565b905060006131cf600c54610e848d8661268590919063ffffffff16565b905060006131ec600b54610e848e8661268590919063ffffffff16565b905060006131fa828461261f565b905061320581613937565b5050505050505b6000613217306118d6565b905061322281612749565b506001600a8190556009556008805460ff60a01b191690555b600061324d612710610e848d87612685565b90506132598b82612a49565b9a5085156132765760095461326e908261261f565b600955613287565b600a54613283908261261f565b600a555b6132928d3083612bb0565b601b54600d546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af19250505080156132ff575060408051601f3d908101601f191682019092526132fc91810190613f0e565b60015b156133555760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505050505050505b613368878787612bb0565b600d546001600160a01b031663e30443bc88613383816118d6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156133c957600080fd5b505af11580156133dd573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc9050876133fe816118d6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561344457600080fd5b505af1158015613458573d6000803e3d6000fd5b50506006546001600160a01b038a811691161480159250905061349457506001600160a01b0387166000908152601d602052604090205460ff16155b80156134b25750601f546001600160a01b0387811661010090920416145b15612e4f57601f54604051633fb6b04560e11b8152600481018790526001600160a01b03898116602483015261010090920490911690637f6d608a90604401600060405180830381600087803b15801561350b57600080fd5b505af115801561351f573d6000803e3d6000fd5b5050505050505050505050565b600081848411156135505760405162461bcd60e51b8152600401610e319190613a84565b50600061355d848661404c565b95945050505050565b6001600160a01b0382166000908152601d60205260409020805460ff191682158015919091179091556135f357600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156135da57600080fd5b505af11580156135ee573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600081836136505760405162461bcd60e51b8152600401610e319190613a84565b50600061355d8486613f8f565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061369257613692613e8c565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156136eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061370f9190613ebb565b8160018151811061372257613722613e8c565b6001600160a01b0392831660209182029290920101526006546137489130911684612a8b565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061378190859060009086903090429060040161405f565b600060405180830381600087803b15801561379b57600080fd5b505af11580156137af573d6000803e3d6000fd5b505050505050565b6001600160a01b0382166000908152601d602052604081205460ff1680156137ed57506006546001600160a01b03838116911614155b156137fa57506001611004565b6001600160a01b0382166000908152601d602052604090205460ff161561382357506002611004565b50600092915050565b6001600160a01b03821661388c5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610e31565b6138c9816040518060600160405280602281526020016140d1602291396001600160a01b038516600090815260208190526040902054919061352c565b6001600160a01b0383166000908152602081905260409020556002546138ef9082612a49565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000613944826002612707565b905060006139528383612a49565b90504761395e8361365d565b600061396a4783612a49565b905061397683826139be565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b6006546139d69030906001600160a01b031684612a8b565b60065460085460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613a46573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906114429190613f0e565b600060208284031215613a7d57600080fd5b5035919050565b600060208083528351808285015260005b81811015613ab157858101830151858201604001528201613a95565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461154f57600080fd5b801515811461154f57600080fd5b60008060408385031215613b0857600080fd5b8235613b1381613ad2565b91506020830135613b2381613ae7565b809150509250929050565b60008060408385031215613b4157600080fd5b8235613b4c81613ad2565b946020939093013593505050565b600060208284031215613b6c57600080fd5b813561267e81613ad2565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613bb657613bb6613b77565b604052919050565b600067ffffffffffffffff821115613bd857613bd8613b77565b5060051b60200190565b600082601f830112613bf357600080fd5b81356020613c08613c0383613bbe565b613b8d565b82815260059290921b84018101918181019086841115613c2757600080fd5b8286015b84811015613c425780358352918301918301613c2b565b509695505050505050565b60008060408385031215613c6057600080fd5b823567ffffffffffffffff80821115613c7857600080fd5b818501915085601f830112613c8c57600080fd5b81356020613c9c613c0383613bbe565b82815260059290921b84018101918181019089841115613cbb57600080fd5b948201945b83861015613ce2578535613cd381613ad2565b82529482019490820190613cc0565b96505086013592505080821115613cf857600080fd5b50613d0585828601613be2565b9150509250929050565b600080600060608486031215613d2457600080fd5b8335613d2f81613ad2565b92506020840135613d3f81613ad2565b929592945050506040919091013590565b600060208284031215613d6257600080fd5b813561267e81613ae7565b60008060408385031215613d8057600080fd5b8235613d8b81613ad2565b91506020830135613b2381613ad2565b600080600080600080600080610100898b031215613db857600080fd5b505086359860208801359850604088013597606081013597506080810135965060a0810135955060c0810135945060e0013592509050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761100457611004613e25565b600181811c90821680613e6657607f821691505b602082108103613e8657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600060018201613eb457613eb4613e25565b5060010190565b600060208284031215613ecd57600080fd5b815161267e81613ad2565b600060208284031215613eea57600080fd5b5051919050565b600060208284031215613f0357600080fd5b815161267e81613ae7565b600080600060608486031215613f2357600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c08789031215613f5557600080fd5b8651613f6081613ad2565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b600082613fac57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561100457611004613e25565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8181038181111561100457611004613e25565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156140af5784516001600160a01b03168352938301939183019160010161408a565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220acd64386ca81d2b9d3ba892b5f7f9e5bb64ed441439fcd904b23d29d58fc2f1764736f6c6343000811003360806040526012805460ff60b01b191690553480156200001e57600080fd5b506040516200309638038062003096833981016040819052620000419162000239565b81818181600362000053838262000373565b50600462000062828262000373565b50505050506000620000796200015760201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506013620000d5838262000373565b506014620000e4828262000373565b505060128054601680546001600160a01b03199081166001600160a01b039889161790915568056bc75e2d6310000060188190556019556015805490911695871695909517909455600160a01b929094166001600160a81b0319909316929092171760ff60a81b1916909155506200043f565b3390565b6001600160a01b03811681146200017157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200019c57600080fd5b81516001600160401b0380821115620001b957620001b962000174565b604051601f8301601f19908116603f01168101908282118183101715620001e457620001e462000174565b816040528381526020925086838588010111156200020157600080fd5b600091505b8382101562000225578582018301518183018401529082019062000206565b600093810190920192909252949350505050565b600080600080600060a086880312156200025257600080fd5b85516200025f816200015b565b602087015190955062000272816200015b565b604087015190945062000285816200015b565b60608701519093506001600160401b0380821115620002a357600080fd5b620002b189838a016200018a565b93506080880151915080821115620002c857600080fd5b50620002d7888289016200018a565b9150509295509295909350565b600181811c90821680620002f957607f821691505b6020821081036200031a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200036e57600081815260208120601f850160051c81016020861015620003495750805b601f850160051c820191505b818110156200036a5782815560010162000355565b5050505b505050565b81516001600160401b038111156200038f576200038f62000174565b620003a781620003a08454620002e4565b8462000320565b602080601f831160018114620003df5760008415620003c65750858301515b600019600386901b1c1916600185901b1785556200036a565b600085815260208120601f198616915b828110156200041057888601518255948401946001909101908401620003ef565b50858210156200042f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612c47806200044f6000396000f3fe60806040526004361061031e5760003560e01c80636b69163b116101ab578063a457c2d7116100f7578063d8032ed311610095578063e7841ec01161006f578063e7841ec0146109ed578063f2fde38b14610a02578063fbcbc0f114610a22578063ffb2c47914610a4257600080fd5b8063d8032ed314610967578063dd62ed3e14610987578063e30443bc146109cd57600080fd5b8063aafd847a116100d1578063aafd847a146108d1578063b22f8a0414610907578063ba079d4914610927578063bc4c4b371461094757600080fd5b8063a457c2d714610871578063a8b9d24014610891578063a9059cbb146108b157600080fd5b80638bc1d6391161016457806395d89b411161013e57806395d89b41146107fa5780639c3372ea1461080f5780639eec101e1461082f578063a42340691461085057600080fd5b80638bc1d6391461079c5780638da5cb5b146107bc57806391b89fba146107da57600080fd5b80636b69163b146106cb5780636d48467b146106fb57806370a082311461071b578063715018a61461075157806374c13fda1461076657806385a6b3ae1461078657600080fd5b8063313ce5671161026a57806349937180116102235780635a84c5eb116101fd5780635a84c5eb146106565780635ebf4db91461067657806365b8dbc0146106965780636a474002146106b657600080fd5b806349937180146105af5780634e7b827f146105cf5780635183d6fd146105ff57600080fd5b8063313ce567146104f257806331e79db01461050e5780633599bb171461052e578063395093511461054e57806340ffdd801461056e578063418089041461058e57600080fd5b806318160ddd116102d757806323b872dd116102b157806323b872dd1461047e57806325cd35981461049e57806327ce0147146104bc5780633009a609146104dc57600080fd5b806318160ddd1461040c5780631d4ff89a14610421578063226cfa3d1461045157600080fd5b806303c833021461033257806306fdde031461033a5780630928847114610365578063095ea7b31461038557806309bbedde146103b55780631694505e146103d457600080fd5b3661032d5761032b610a7d565b005b600080fd5b61032b610a7d565b34801561034657600080fd5b5061034f610b10565b60405161035c91906127c3565b60405180910390f35b34801561037157600080fd5b5061032b610380366004612829565b610ba2565b34801561039157600080fd5b506103a56103a0366004612846565b610bf6565b604051901515815260200161035c565b3480156103c157600080fd5b50600a545b60405190815260200161035c565b3480156103e057600080fd5b506015546103f4906001600160a01b031681565b6040516001600160a01b03909116815260200161035c565b34801561041857600080fd5b506002546103c6565b34801561042d57600080fd5b506103a561043c366004612829565b60116020526000908152604090205460ff1681565b34801561045d57600080fd5b506103c661046c366004612829565b60176020526000908152604090205481565b34801561048a57600080fd5b506103a5610499366004612872565b610c0d565b3480156104aa57600080fd5b506012546001600160a01b03166103f4565b3480156104c857600080fd5b506103c66104d7366004612829565b610c76565b3480156104e857600080fd5b506103c6600e5481565b3480156104fe57600080fd5b506040516012815260200161035c565b34801561051a57600080fd5b5061032b610529366004612829565b610cd2565b34801561053a57600080fd5b5061032b6105493660046128c1565b610d6c565b34801561055a57600080fd5b506103a5610569366004612846565b610e0d565b34801561057a57600080fd5b5061032b6105893660046128c1565b610e43565b34801561059a57600080fd5b506012546103a590600160a81b900460ff1681565b3480156105bb57600080fd5b506016546103f4906001600160a01b031681565b3480156105db57600080fd5b506103a56105ea366004612829565b600f6020526000908152604090205460ff1681565b34801561060b57600080fd5b5061061f61061a3660046128de565b610ed9565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c00161035c565b34801561066257600080fd5b5061032b6106713660046128de565b610f39565b34801561068257600080fd5b5061032b6106913660046128de565b610f7b565b3480156106a257600080fd5b5061032b6106b1366004612829565b610fbd565b3480156106c257600080fd5b5061032b611009565b3480156106d757600080fd5b506103a56106e6366004612829565b60106020526000908152604090205460ff1681565b34801561070757600080fd5b506103a5610716366004612829565b6110af565b34801561072757600080fd5b506103c6610736366004612829565b6001600160a01b031660009081526020819052604090205490565b34801561075d57600080fd5b5061032b6110fb565b34801561077257600080fd5b506012546103f4906001600160a01b031681565b34801561079257600080fd5b506103c660085481565b3480156107a857600080fd5b5061032b6107b73660046128f7565b61116f565b3480156107c857600080fd5b506009546001600160a01b03166103f4565b3480156107e657600080fd5b506103c66107f5366004612829565b6111c4565b34801561080657600080fd5b5061034f6111cf565b34801561081b57600080fd5b5061032b61082a3660046128c1565b6111de565b34801561083b57600080fd5b506012546103a590600160a01b900460ff1681565b34801561085c57600080fd5b506012546103a590600160b01b900460ff1681565b34801561087d57600080fd5b506103a561088c366004612846565b611274565b34801561089d57600080fd5b506103c66108ac366004612829565b6112c3565b3480156108bd57600080fd5b506103a56108cc366004612846565b6112ef565b3480156108dd57600080fd5b506103c66108ec366004612829565b6001600160a01b031660009081526007602052604090205490565b34801561091357600080fd5b5061032b6109223660046128f7565b6112fc565b34801561093357600080fd5b506103a5610942366004612829565b611351565b34801561095357600080fd5b506103a56109623660046128f7565b61139d565b34801561097357600080fd5b5061032b610982366004612829565b61151e565b34801561099357600080fd5b506103c66109a2366004612930565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156109d957600080fd5b5061032b6109e8366004612846565b61156a565b3480156109f957600080fd5b50600e546103c6565b348015610a0e57600080fd5b5061032b610a1d366004612829565b611602565b348015610a2e57600080fd5b5061061f610a3d366004612829565b6116ed565b348015610a4e57600080fd5b50610a62610a5d3660046128de565b61179c565b6040805193845260208401929092529082015260600161035c565b6000610a8860025490565b11610a9257600080fd5b3415610b0e57610ac5610aa460025490565b610ab234600160801b6118c2565b610abc9190612974565b6005549061194b565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600854610b0a903461194b565b6008555b565b606060138054610b1f90612996565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b90612996565b8015610b985780601f10610b6d57610100808354040283529160200191610b98565b820191906000526020600020905b815481529060010190602001808311610b7b57829003601f168201915b5050505050905090565b6009546001600160a01b03163314610bd55760405162461bcd60e51b8152600401610bcc906129d0565b60405180910390fd5b6001600160a01b03166000908152600f60205260409020805460ff19169055565b6000610c033384846119aa565b5060015b92915050565b6000610c1a848484611ace565b610c6c8433610c6785604051806060016040528060288152602001612bc5602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611b31565b6119aa565b5060019392505050565b6001600160a01b03811660009081526006602090815260408083205491839052822054600554600160801b92610cc892610cc392610cbd91610cb891906118c2565b611b6b565b90611b7b565b611bb9565b610c079190612974565b6009546001600160a01b03163314610cfc5760405162461bcd60e51b8152600401610bcc906129d0565b6001600160a01b0381166000908152600f60205260408120805460ff19166001179055610d2a908290611bcc565b610d35600a82611c2b565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6009546001600160a01b03163314610d965760405162461bcd60e51b8152600401610bcc906129d0565b801515601260169054906101000a900460ff16151503610db557600080fd5b60128054821515600160b01b0260ff60b01b199091161790556040517f3da2593f2c4724acfbd754045321e852cad26f3974834b1890045530f89c21b390610e0290831515815260200190565b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c03918590610c67908661194b565b6009546001600160a01b03163314610e6d5760405162461bcd60e51b8152600401610bcc906129d0565b801515601260159054906101000a900460ff16151503610e8c57600080fd5b60128054821515600160a81b0260ff60a81b199091161790556040517fc138a28750b971696f46ea59731c471ef1e08e4015404afdb139fd2e87dca1bb90610e0290831515815260200190565b600080600080600080610eeb600a5490565b8710610f0a575060009450600019935083925084915081905080610f30565b6000610f17600a89611d66565b9050610f22816116ed565b965096509650965096509650505b91939550919395565b6009546001600160a01b03163314610f635760405162461bcd60e51b8152600401610bcc906129d0565b610f7581670de0b6b3a7640000612a05565b60185550565b6009546001600160a01b03163314610fa55760405162461bcd60e51b8152600401610bcc906129d0565b610fb781670de0b6b3a7640000612a05565b60195550565b6009546001600160a01b03163314610fe75760405162461bcd60e51b8152600401610bcc906129d0565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b60405162461bcd60e51b815260206004820152606960248201527f4d61676156505f4469766964656e645f547261636b65723a207769746864726160448201527f774469766964656e642064697361626c65642e20557365207468652027636c6160648201527f696d272066756e6374696f6e206f6e20746865206d61696e204d61676156502060848201526831b7b73a3930b1ba1760b91b60a482015260c401610bcc565b6009546000906001600160a01b031633146110dc5760405162461bcd60e51b8152600401610bcc906129d0565b506001600160a01b031660009081526010602052604090205460ff1690565b6009546001600160a01b031633146111255760405162461bcd60e51b8152600401610bcc906129d0565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b6009546001600160a01b031633146111995760405162461bcd60e51b8152600401610bcc906129d0565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6000610c07826112c3565b606060148054610b1f90612996565b6009546001600160a01b031633146112085760405162461bcd60e51b8152600401610bcc906129d0565b801515601260149054906101000a900460ff1615150361122757600080fd5b60128054821515600160a01b0260ff60a01b199091161790556040517f8d34c313963017194ed726d050e868657d0e2d2c6748d13e358cd4b89d4ee7c890610e0290831515815260200190565b6000610c033384610c6785604051806060016040528060258152602001612bed602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611b31565b6001600160a01b038116600090815260076020526040812054610c07906112e984610c76565b90611d99565b6000610c03338484611ace565b6009546001600160a01b031633146113265760405162461bcd60e51b8152600401610bcc906129d0565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6009546000906001600160a01b0316331461137e5760405162461bcd60e51b8152600401610bcc906129d0565b506001600160a01b031660009081526011602052604090205460ff1690565b6009546000906001600160a01b031633146113ca5760405162461bcd60e51b8152600401610bcc906129d0565b601254600160b01b900460ff16156113e457506000610c07565b6001600160a01b03831660009081526011602052604090205460ff1682801561140a5750805b80156114205750601254600160a81b900460ff16155b1561142f576000915050610c07565b6000816114445761143f85611ddb565b61144d565b61144d85612094565b90508015611513576001600160a01b038516600090815260176020526040902042905581156114c157831515856001600160a01b03167ffbd928dd3806a2bdf802f3a28a2cc55205f95dbcd2c3ed313abfca278366f80c836040516114b491815260200190565b60405180910390a3611508565b831515856001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092836040516114ff91815260200190565b60405180910390a35b600192505050610c07565b506000949350505050565b6009546001600160a01b031633146115485760405162461bcd60e51b8152600401610bcc906129d0565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b031633146115945760405162461bcd60e51b8152600401610bcc906129d0565b6001600160a01b0382166000908152600f602052604090205460ff166115d4576019548110156115d8576115c9600a83611c2b565b6115d4826000611bcc565b5050565b6115e28282611bcc565b60185481106115f7576115d4600a8383612407565b6115d4600a83611c2b565b6009546001600160a01b0316331461162c5760405162461bcd60e51b8152600401610bcc906129d0565b6001600160a01b0381166116915760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bcc565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b806000808080806116ff600a876124b0565b945060001993506000851261176157600e5485111561172d57600e546117269086906124fb565b9350611761565b600e54600a5460009110611742576000611751565b600e54600a5461175191611d99565b905061175d8682611b7b565b9450505b61176a866112c3565b925061177586610c76565b6001600160a01b038716600090815260176020526040902054969895975093959294915050565b600a54600090819081908015806117bc5750601254600160b01b900460ff165b156117d2575050600e54600092508291506118bb565b600e546000805a90506000805b89841080156117ed57508582105b156118aa57846117fc81612a1c565b95505085851061180b57600094505b6000600a600001868154811061182357611823612a35565b60009182526020808320909101546001600160a01b0316808352601090915260409091205490915060ff166118705761185d81600161139d565b15611870578161186c81612a1c565b9250505b8261187a81612a1c565b93505060005a9050808511156118a15761189e6118978683611d99565b879061194b565b95505b93506117df9050565b600e85905590975095509193505050505b9193909250565b6000826000036118d457506000610c07565b60006118e08385612a05565b9050826118ed8583612974565b146119445760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610bcc565b9392505050565b6000806119588385612a4b565b9050838110156119445760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610bcc565b6001600160a01b038316611a0c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bcc565b6001600160a01b038216611a6d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bcc565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602d60248201527f4d61676156505f4469766964656e645f547261636b65723a204e6f207472616e60448201526c1cd9995c9cc8185b1b1bddd959609a1b6064820152608401610bcc565b505050565b60008184841115611b555760405162461bcd60e51b8152600401610bcc91906127c3565b506000611b628486612a5e565b95945050505050565b60008181811215610c0757600080fd5b600080611b888385612a71565b905060008312158015611b9b5750838112155b80611bb05750600083128015611bb057508381125b61194457600080fd5b600080821215611bc857600080fd5b5090565b6001600160a01b03821660009081526020819052604090205480821115611c0b576000611bf98383611d99565b9050611c058482612538565b50505050565b80821015611b2c576000611c1f8284611d99565b9050611c05848261259c565b6001600160a01b038116600090815260038301602052604090205460ff16611c51575050565b6001600160a01b03811660009081526003830160209081526040808320805460ff1916905560018086018352818420849055600286019092528220548454909291611c9b91612a5e565b90506000846000018281548110611cb457611cb4612a35565b60009182526020808320909101546001600160a01b03908116808452600289019092526040808420879055908716835282209190915585549091508190869085908110611d0357611d03612a35565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558454859080611d3d57611d3d612a99565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6000826000018281548110611d7d57611d7d612a35565b6000918252602090912001546001600160a01b03169392505050565b600061194483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b31565b600080611de7836112c3565b9050801561208b576001600160a01b038316600090815260076020526040902054611e12908261194b565b6001600160a01b03808516600090815260076020526040812092909255601254169081611e97576040516001600160a01b03861690610bb89085906000818181858888f193505050503d8060008114611e87576040519150601f19603f3d011682016040523d82523d6000602084013e611e8c565b606091505b505080915050611ff1565b6040805160028082526060820183526000926020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f259190612aaf565b81600081518110611f3857611f38612a35565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611f6c57611f6c612a35565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de95908690611fb29060009086908c904290600401612b10565b6000604051808303818588803b158015611fcb57600080fd5b505af193505050508015611fdd575060015b611fea5760009150611fef565b600191505b505b8061203f576001600160a01b0385166000908152600760205260409020546120199084611d99565b6001600160a01b0390951660009081526007602052604081209590955550929392505050565b846001600160a01b03167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d8460405161207a91815260200190565b60405180910390a250909392505050565b50600092915050565b6000806120a0836112c3565b9050801561208b576001600160a01b0383166000908152600760205260408120546120cb908361194b565b6001600160a01b03851660009081526007602052604080822092909255815160028082526060820190935290918160200160208202803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612153573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121779190612aaf565b8160008151811061218a5761218a612a35565b6001600160a01b0392831660209182029290920101526016548251911690829060019081106121bb576121bb612a35565b6001600160a01b0392831660209182029290920101526016546040516370a0823160e01b815230600482015260009291909116906370a0823190602401602060405180830381865afa158015612215573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122399190612b45565b60155460405163b6f9de9560e01b81529192506001600160a01b03169063b6f9de9590869061227390600090879030904290600401612b10565b6000604051808303818588803b15801561228c57600080fd5b505af19350505050801561229e575060015b6122ab57600092506123ae565b6016546040516370a0823160e01b815230600482015260009161231e9184916001600160a01b0316906370a0823190602401602060405180830381865afa1580156122fa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e99190612b45565b905080156123a75760165460405163a9059cbb60e01b81526001600160a01b03898116600483015260248201849052600196509091169063a9059cbb906044016020604051808303816000875af115801561237d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a19190612b5e565b506123ac565b600093505b505b826123fd576001600160a01b0386166000908152600760205260409020546123d69085611d99565b6001600160a01b039096166000908152600760205260408120969096555093949350505050565b5091949350505050565b6001600160a01b038216600090815260038401602052604090205460ff161561244c576001600160a01b03821660009081526001840160205260409020819055505050565b6001600160a01b03821660008181526003850160209081526040808320805460ff19166001908117909155878101835281842086905587546002890184529184208290558101875586835291200180546001600160a01b0319169091179055505050565b6001600160a01b038116600090815260038301602052604081205460ff166124db5750600019610c07565b506001600160a01b03166000908152600291909101602052604090205490565b6000806125088385612b7b565b90506000831215801561251b5750838113155b80611bb05750600083128015611bb0575083811361194457600080fd5b61254282826125e0565b61257c61255d610cb8836005546118c290919063ffffffff16565b6001600160a01b038416600090815260066020526040902054906124fb565b6001600160a01b0390921660009081526006602052604090209190915550565b6125a682826126bf565b61257c6125c1610cb8836005546118c290919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611b7b565b6001600160a01b0382166126365760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610bcc565b600254612643908261194b565b6002556001600160a01b038216600090815260208190526040902054612669908261194b565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b03821661271f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610bcc565b61275c81604051806060016040528060228152602001612ba3602291396001600160a01b0385166000908152602081905260409020549190611b31565b6001600160a01b0383166000908152602081905260409020556002546127829082611d99565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016126b3565b600060208083528351808285015260005b818110156127f0578581018301518582016040015282016127d4565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461282657600080fd5b50565b60006020828403121561283b57600080fd5b813561194481612811565b6000806040838503121561285957600080fd5b823561286481612811565b946020939093013593505050565b60008060006060848603121561288757600080fd5b833561289281612811565b925060208401356128a281612811565b929592945050506040919091013590565b801515811461282657600080fd5b6000602082840312156128d357600080fd5b8135611944816128b3565b6000602082840312156128f057600080fd5b5035919050565b6000806040838503121561290a57600080fd5b823561291581612811565b91506020830135612925816128b3565b809150509250929050565b6000806040838503121561294357600080fd5b823561294e81612811565b9150602083013561292581612811565b634e487b7160e01b600052601160045260246000fd5b60008261299157634e487b7160e01b600052601260045260246000fd5b500490565b600181811c908216806129aa57607f821691505b6020821081036129ca57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8082028115828204841417610c0757610c0761295e565b600060018201612a2e57612a2e61295e565b5060010190565b634e487b7160e01b600052603260045260246000fd5b80820180821115610c0757610c0761295e565b81810381811115610c0757610c0761295e565b8082018281126000831280158216821582161715612a9157612a9161295e565b505092915050565b634e487b7160e01b600052603160045260246000fd5b600060208284031215612ac157600080fd5b815161194481612811565b600081518084526020808501945080840160005b83811015612b055781516001600160a01b031687529582019590820190600101612ae0565b509495945050505050565b848152608060208201526000612b296080830186612acc565b6001600160a01b03949094166040830152506060015292915050565b600060208284031215612b5757600080fd5b5051919050565b600060208284031215612b7057600080fd5b8151611944816128b3565b8181036000831280158383131683831282161715612b9b57612b9b61295e565b509291505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220bc5316a2ebbac12df20c0e7ffb027c4da9094d1092a6e27730b596a169fbc3a964736f6c63430008110033

Deployed Bytecode

0x6080604052600436106104615760003560e01c806375829def1161023f578063b62496f511610139578063e7841ec0116100b6578063f39409e91161007a578063f39409e914610d7b578063f5d3c79a14610d9b578063f637434214610dbb578063f8b45b0514610dd1578063fc6b151c14610de757600080fd5b8063e7841ec014610cf0578063f11a24d314610d05578063f27fd25414610d1b578063f2f5ec3a14610d3b578063f2fde38b14610d5b57600080fd5b8063d7b837dd116100fd578063d7b837dd14610c3f578063d8032ed314610c54578063dd62ed3e14610c74578063deab8aea14610cba578063e2f4560514610cda57600080fd5b8063b62496f514610b99578063ba079d4914610bc9578063bb8d513114610be9578063d07a091c14610bff578063d5e3725114610c1f57600080fd5b806395d89b41116101c7578063a457c2d71161018b578063a457c2d714610ac2578063a8b9d24014610ae2578063a9059cbb14610b02578063a9885de514610b22578063ad56c13c14610b4257600080fd5b806395d89b4114610a375780639a7a23d614610a4c5780639c1b8af514610a6c5780639c3372ea14610a825780639ec1037e14610aa257600080fd5b80637fdde05c1161020e5780637fdde05c146109a3578063868730c7146109c3578063871c128d146109e35780638da5cb5b14610a0357806395451c2914610a2157600080fd5b806375829def1461093357806375f0a8741461095357806377a3b609146109735780637928dd1d1461098957600080fd5b8063395093511161035b5780635d098b38116102d85780636d48467b1161029c5780636d48467b1461089e578063700bb191146108be57806370a08231146108de578063715018a6146108fe57806372d8edf41461091357600080fd5b80635d098b38146108095780635ebf4db9146108295780635eee4bae1461084957806364b0f653146108695780636843cd841461087e57600080fd5b80634ada218b1161031f5780634ada218b146107645780634e71d92d146107855780634fbee1931461079a5780635124f874146107d35780635a84c5eb146107e957600080fd5b806339509351146106d45780633f407b84146106f457806340ffdd801461070a57806349bd5a5e1461072a5780634a74bb021461074a57600080fd5b80631fa70531116103e957806325cd3598116103ad57806325cd35981461064e5780632c1f52161461066357806330bb4cff14610683578063313ce567146106985780633599bb17146106b457600080fd5b80631fa70531146105b35780631fe70a98146105c957806321cbb024146105df5780632307b4411461060e57806323b872dd1461062e57600080fd5b8063095ea7b311610430578063095ea7b31461050e5780631694505e1461053e57806318160ddd1461055e5780631a221dbb1461057d5780631d0adc071461059357600080fd5b806303fd2a451461046d57806305ca5f08146104aa57806306fdde03146104cc57806308dfe8a5146104ee57600080fd5b3661046857005b600080fd5b34801561047957600080fd5b5060085461048d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156104b657600080fd5b506104ca6104c5366004613a6b565b610e07565b005b3480156104d857600080fd5b506104e1610ed8565b6040516104a19190613a84565b3480156104fa57600080fd5b506104ca610509366004613af5565b610f6a565b34801561051a57600080fd5b5061052e610529366004613b2e565b610ff3565b60405190151581526020016104a1565b34801561054a57600080fd5b5060065461048d906001600160a01b031681565b34801561056a57600080fd5b506002545b6040519081526020016104a1565b34801561058957600080fd5b5061056f60195481565b34801561059f57600080fd5b506104ca6105ae366004613b5a565b61100a565b3480156105bf57600080fd5b5061056f600a5481565b3480156105d557600080fd5b5061056f60185481565b3480156105eb57600080fd5b5061052e6105fa366004613b5a565b602080526000908152604090205460ff1681565b34801561061a57600080fd5b506104ca610629366004613c4d565b6110a1565b34801561063a57600080fd5b5061052e610649366004613d0f565b611272565b34801561065a57600080fd5b5061048d6112db565b34801561066f57600080fd5b50600d5461048d906001600160a01b031681565b34801561068f57600080fd5b5061056f61134e565b3480156106a457600080fd5b50604051601281526020016104a1565b3480156106c057600080fd5b506104ca6106cf366004613d50565b6113bc565b3480156106e057600080fd5b5061052e6106ef366004613b2e565b611449565b34801561070057600080fd5b5061056f60095481565b34801561071657600080fd5b506104ca610725366004613d50565b61147f565b34801561073657600080fd5b5060075461048d906001600160a01b031681565b34801561075657600080fd5b50601a5461052e9060ff1681565b34801561077057600080fd5b5060085461052e90600160a81b900460ff1681565b34801561079157600080fd5b506104ca6114da565b3480156107a657600080fd5b5061052e6107b5366004613b5a565b6001600160a01b03166000908152601c602052604090205460ff1690565b3480156107df57600080fd5b5061056f60155481565b3480156107f557600080fd5b506104ca610804366004613a6b565b611552565b34801561081557600080fd5b506104ca610824366004613b5a565b6115ad565b34801561083557600080fd5b506104ca610844366004613a6b565b61163d565b34801561085557600080fd5b506104ca610864366004613a6b565b611698565b34801561087557600080fd5b5061056f6116da565b34801561088a57600080fd5b5061056f610899366004613b5a565b611724565b3480156108aa57600080fd5b5061052e6108b9366004613b5a565b611794565b3480156108ca57600080fd5b506104ca6108d9366004613a6b565b611804565b3480156108ea57600080fd5b5061056f6108f9366004613b5a565b6118d6565b34801561090a57600080fd5b506104ca6118f1565b34801561091f57600080fd5b506104ca61092e366004613b5a565b611965565b34801561093f57600080fd5b506104ca61094e366004613b5a565b6119c1565b34801561095f57600080fd5b50600e5461048d906001600160a01b031681565b34801561097f57600080fd5b5061056f60175481565b34801561099557600080fd5b50601f5461052e9060ff1681565b3480156109af57600080fd5b506104ca6109be366004613af5565b611a76565b3480156109cf57600080fd5b506104ca6109de366004613d50565b611acb565b3480156109ef57600080fd5b506104ca6109fe366004613a6b565b611b03565b348015610a0f57600080fd5b506005546001600160a01b031661048d565b348015610a2d57600080fd5b5061056f60135481565b348015610a4357600080fd5b506104e1611b7f565b348015610a5857600080fd5b506104ca610a67366004613af5565b611b8e565b348015610a7857600080fd5b5061056f601b5481565b348015610a8e57600080fd5b506104ca610a9d366004613d50565b611bc6565b348015610aae57600080fd5b506104ca610abd366004613b5a565b611c22565b348015610ace57600080fd5b5061052e610add366004613b2e565b611ce4565b348015610aee57600080fd5b5061056f610afd366004613b5a565b611d33565b348015610b0e57600080fd5b5061052e610b1d366004613b2e565b611d66565b348015610b2e57600080fd5b506104ca610b3d366004613af5565b611d73565b348015610b4e57600080fd5b50610b62610b5d366004613b5a565b611dc7565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c0016104a1565b348015610ba557600080fd5b5061052e610bb4366004613b5a565b601d6020526000908152604090205460ff1681565b348015610bd557600080fd5b5061052e610be4366004613b5a565b611e57565b348015610bf557600080fd5b5061056f60125481565b348015610c0b57600080fd5b506104ca610c1a366004613b5a565b611e8a565b348015610c2b57600080fd5b506104ca610c3a366004613d50565b611f82565b348015610c4b57600080fd5b506104ca612004565b348015610c6057600080fd5b506104ca610c6f366004613b5a565b61204d565b348015610c8057600080fd5b5061056f610c8f366004613d6d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610cc657600080fd5b50600f5461048d906001600160a01b031681565b348015610ce657600080fd5b5061056f60115481565b348015610cfc57600080fd5b5061056f612110565b348015610d1157600080fd5b5061056f60165481565b348015610d2757600080fd5b50610b62610d36366004613a6b565b61215a565b348015610d4757600080fd5b506104ca610d56366004613d9b565b612198565b348015610d6757600080fd5b506104ca610d76366004613b5a565b612320565b348015610d8757600080fd5b506104ca610d96366004613b5a565b61240b565b348015610da757600080fd5b506104ca610db6366004613d50565b612532565b348015610dc757600080fd5b5061056f60145481565b348015610ddd57600080fd5b5061056f60105481565b348015610df357600080fd5b506104ca610e02366004613a6b565b61256a565b6005546001600160a01b03163314610e3a5760405162461bcd60e51b8152600401610e3190613df0565b60405180910390fd5b610e4c81670de0b6b3a7640000613e3b565b90506000610e67600954600a5461261f90919063ffffffff16565b90506000610e8a82610e84600a548661268590919063ffffffff16565b90612707565b90506000610ea783610e846009548761268590919063ffffffff16565b9050610eb284612749565b600a54610ebf9083612a49565b600a55600954610ecf9082612a49565b60095550505050565b606060038054610ee790613e52565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1390613e52565b8015610f605780601f10610f3557610100808354040283529160200191610f60565b820191906000526020600020905b815481529060010190602001808311610f4357829003601f168201915b5050505050905090565b6005546001600160a01b03163314610f945760405162461bcd60e51b8152600401610e3190613df0565b6001600160a01b0382166000818152601c6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000611000338484612a8b565b5060015b92915050565b6005546001600160a01b031633146110345760405162461bcd60e51b8152600401610e3190613df0565b6001600160a01b0381166000818152601c6020908152604091829020805460ff19166001179055600f80546001600160a01b0319168417905590519182527f3c2a46a28084880d3bc39c8f240a57690614613728ce03d2a8c6dc645892e4fb91015b60405180910390a150565b6005546001600160a01b031633146110cb5760405162461bcd60e51b8152600401610e3190613df0565b805182511461111c5760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610e31565b60c8825111156111795760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b6064820152608401610e31565b60005b825181101561126d57600083828151811061119957611199613e8c565b6020026020010151905060008383815181106111b7576111b7613e8c565b6020026020010151670de0b6b3a76400006111d29190613e3b565b90506111df338383612bb0565b600d546001600160a01b031663e30443bc836111fa816118d6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561124057600080fd5b505af1158015611254573d6000803e3d6000fd5b505050505050808061126590613ea2565b91505061117c565b505050565b600061127f848484612cb9565b6112d184336112cc85604051806060016040528060288152602001614119602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061352c565b612a8b565b5060019392505050565b600d54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa158015611325573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113499190613ebb565b905090565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611398573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113499190613ed8565b6005546001600160a01b031633146113e65760405162461bcd60e51b8152600401610e3190613df0565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b15801561142e57600080fd5b505af1158015611442573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916110009185906112cc908661261f565b6005546001600160a01b031633146114a95760405162461bcd60e51b8152600401610e3190613df0565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd8090602401611414565b600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af115801561152b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154f9190613ef1565b50565b6005546001600160a01b0316331461157c5760405162461bcd60e51b8152600401610e3190613df0565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb90602401611414565b6005546001600160a01b031633146115d75760405162461bcd60e51b8152600401610e3190613df0565b6001600160a01b0381166000818152601c6020908152604091829020805460ff19166001179055600e80546001600160a01b0319168417905590519182527faacebbe32c0dbd14817cfb53e3cc8be68c7e133928317145be50a0d86c2244339101611096565b6005546001600160a01b031633146116675760405162461bcd60e51b8152600401610e3190613df0565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db990602401611414565b6005546001600160a01b031633146116c25760405162461bcd60e51b8152600401610e3190613df0565b6116d481670de0b6b3a7640000613e3b565b60115550565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611398573d6000803e3d6000fd5b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611770573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110049190613ed8565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa1580156117e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110049190613ef1565b600d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611857573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187b9190613f0e565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461191b5760405162461bcd60e51b8152600401610e3190613df0565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b0316331461198f5760405162461bcd60e51b8152600401610e3190613df0565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401611414565b6005546001600160a01b031633146119eb5760405162461bcd60e51b8152600401610e3190613df0565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015611a3257600080fd5b505af1158015611a46573d6000803e3d6000fd5b5050506001600160a01b0382166000908152601c60205260409020805460ff191660011790555061154f81612320565b6005546001600160a01b03163314611aa05760405162461bcd60e51b8152600401610e3190613df0565b6001600160a01b03919091166000908152601e60205260409020805460ff1916911515919091179055565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d63990604401611414565b6005546001600160a01b03163314611b2d5760405162461bcd60e51b8152600401610e3190613df0565b62030d408110158015611b435750620f42408111155b611b4c57600080fd5b601b5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601b55565b606060048054610ee790613e52565b6005546001600160a01b03163314611bb85760405162461bcd60e51b8152600401610e3190613df0565b611bc28282613566565b5050565b6005546001600160a01b03163314611bf05760405162461bcd60e51b8152600401610e3190613df0565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea90602401611414565b6005546001600160a01b03163314611c4c5760405162461bcd60e51b8152600401610e3190613df0565b600d54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b158015611c9357600080fd5b505af1158015611ca7573d6000803e3d6000fd5b5050600d546040516338c110ef60e21b81526001600160a01b03858116600483015260006024830152909116925063e30443bc9150604401611414565b600061100033846112cc85604051806060016040528060258152602001614141602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061352c565b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611753565b6000611000338484612cb9565b6005546001600160a01b03163314611d9d5760405162461bcd60e51b8152600401610e3190613df0565b6001600160a01b039190911660009081526020805260409020805460ff1916911515919091179055565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa158015611e1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e439190613f3c565b949c939b5091995097509550909350915050565b600d5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d49906024016117c3565b6005546001600160a01b03163314611eb45760405162461bcd60e51b8152600401610e3190613df0565b6001600160a01b038181166000818152601e602090815260408083208054600160ff199182168117909255601c9093529281902080549092169092179055600d54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b158015611f3057600080fd5b505af1158015611f44573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c592506020019050611096565b6005546001600160a01b03163314611fac5760405162461bcd60e51b8152600401610e3190613df0565b601a5481151560ff909116151503611fc357600080fd5b601a805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef90602001611096565b6005546001600160a01b0316331461202e5760405162461bcd60e51b8152600401610e3190613df0565b601f5460ff161561203e57600080fd5b601f805460ff19166001179055565b6005546001600160a01b031633146120775760405162461bcd60e51b8152600401610e3190613df0565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b1580156120be57600080fd5b505af11580156120d2573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050611096565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611398573d6000803e3d6000fd5b600d54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd90602401611e02565b6005546001600160a01b031633146121c25760405162461bcd60e51b8152600401610e3190613df0565b60158890556016869055601784905560138790556014859055601283905560188290556019819055612200816121fa8981878a61261f565b9061261f565b600b819055506122296018546121fa6015546121fa60165460175461261f90919063ffffffff16565b600c55600b5460051080159061224257506005600c5411155b61229e5760405162461bcd60e51b815260206004820152602760248201527f746f74616c20666565732063616e6e6f74206578636565642035252073656c6c604482015266206f722062757960c81b6064820152608401610e31565b601354601454601254601554601654601754601854601954604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201527f1640531881cbf0e2bf36c30fec3ed06b08e062adb13340f00fd16cedba09637a906101000160405180910390a15050505050505050565b6005546001600160a01b0316331461234a5760405162461bcd60e51b8152600401610e3190613df0565b6001600160a01b0381166123af5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e31565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146124355760405162461bcd60e51b8152600401610e3190613df0565b601f8054610100600160a81b0319166101006001600160a01b03841690810291909117909155156124f3576001600160a01b038181166000818152602080805260408083208054600160ff199182168117909255601c9093529281902080549092169092179055600d54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b1580156124da57600080fd5b505af11580156124ee573d6000803e3d6000fd5b505050505b6008805460ff60a81b1916600160a81b1790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a0490604401611414565b6005546001600160a01b031633146125945760405162461bcd60e51b8152600401610e3190613df0565b6125a681670de0b6b3a7640000613e3b565b90506103e86002546125b89190613f8f565b81101561261a5760405162461bcd60e51b815260206004820152602a60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c657373604482015269207468616e20302e312560b01b6064820152608401610e31565b601055565b60008061262c8385613fb1565b90508381101561267e5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610e31565b9392505050565b60008260000361269757506000611004565b60006126a38385613e3b565b9050826126b08583613f8f565b1461267e5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610e31565b600061267e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061362f565b806000036127545750565b61275d8161365d565b6000612776600954600a5461261f90919063ffffffff16565b6017549091506001908190819060009081908190156127d7576127d46018546015546017546127a59190613fb1565b6127af9190613fb1565b610e846017546127ce8b610e84600a544761268590919063ffffffff16565b90612685565b91505b601254156128215761281e6019546013546012546127f59190613fb1565b6127ff9190613fb1565b610e846012546127ce8b610e846009544761268590919063ffffffff16565b90505b61282b828261261f565b9250821561288b57600d546040516001600160a01b03909116908490600081818185875af1925050503d8060008114612880576040519150601f19603f3d011682016040523d82523d6000602084013e612885565b606091505b50909650505b60006128a460185460155461261f90919063ffffffff16565b6019546013546128b39161261f565b6128bd9190613fb1565b9050600081156128d4576128d14783612707565b90505b6000816128ee60135460155461261f90919063ffffffff16565b6128f89190613e3b565b905060008261291460195460185461261f90919063ffffffff16565b61291e9190613e3b565b9050811561297e57600e546040516001600160a01b03909116908390600081818185875af1925050503d8060008114612973576040519150601f19603f3d011682016040523d82523d6000602084013e612978565b606091505b50909950505b80156129dc57600f546040516001600160a01b03909116908290600081818185875af1925050503d80600081146129d1576040519150601f19603f3d011682016040523d82523d6000602084013e6129d6565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd087612a088385613fb1565b8c8015612a1257508b5b8015612a1b57508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b600061267e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061352c565b6001600160a01b038316612aed5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e31565b6001600160a01b038216612b4e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e31565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316612bd65760405162461bcd60e51b8152600401610e3190613fc4565b6001600160a01b038216612bfc5760405162461bcd60e51b8152600401610e3190614009565b612c39816040518060600160405280602681526020016140f3602691396001600160a01b038616600090815260208190526040902054919061352c565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612c68908261261f565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612ba3565b6001600160a01b038316612cdf5760405162461bcd60e51b8152600401610e3190613fc4565b6001600160a01b038216612d055760405162461bcd60e51b8152600401610e3190614009565b6001600160a01b0383166000908152601e602052604081205481908190819060ff16612d8457600854600160a81b900460ff16612d845760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401610e31565b601f5460ff16158015612da65750601f5461010090046001600160a01b031615155b15612e3b57612db587876137b7565b1580612dd857506001600160a01b038716600090815260208052604090205460ff165b80612dfa57506001600160a01b038616600090815260208052604090205460ff165b612e3b5760405162461bcd60e51b815260206004820152601260248201527121617661696c61626c652074726164696e6760701b6044820152606401610e31565b84600003612e5857612e4f87876000612bb0565b50505050505050565b6008546001600160a01b0390811690871603612e7857612e4f878661382c565b600854600160a01b900460ff16158015612eab57506001600160a01b0387166000908152601c602052604090205460ff16155b8015612ed057506001600160a01b0386166000908152601c602052604090205460ff16155b1561335d576001600160a01b038087166000908152601d602052604080822054928a16825290205460ff918216911680158015612f0b575081155b1561301457612f1b898989612bb0565b600d546001600160a01b031663e30443bc8a612f36816118d6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612f7c57600080fd5b505af1158015612f90573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905089612fb1816118d6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612ff757600080fd5b505af115801561300b573d6000803e3d6000fd5b505050506130c4565b81156130335760125495506013549450601454935060195492506130c4565b80156130c45760175495506015549450601654935060185492506000613058896118d6565b6010549091506130688983613fb1565b11156130c25760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610e31565b505b60006130e5846130d48888613fb1565b6130de9190613fb1565b889061261f565b905060006130f2306118d6565b6011549091508110801590819061312257506001600160a01b038c166000908152601d602052604090205460ff16155b1561323b576008805460ff60a01b1916600160a01b179055601a5460ff16801561314c5750600087115b801561315a57506000600c54115b1561320c576000613178600954600a5461261f90919063ffffffff16565b9050600061319582610e84600a548761268590919063ffffffff16565b905060006131b283610e846009548861268590919063ffffffff16565b905060006131cf600c54610e848d8661268590919063ffffffff16565b905060006131ec600b54610e848e8661268590919063ffffffff16565b905060006131fa828461261f565b905061320581613937565b5050505050505b6000613217306118d6565b905061322281612749565b506001600a8190556009556008805460ff60a01b191690555b600061324d612710610e848d87612685565b90506132598b82612a49565b9a5085156132765760095461326e908261261f565b600955613287565b600a54613283908261261f565b600a555b6132928d3083612bb0565b601b54600d546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af19250505080156132ff575060408051601f3d908101601f191682019092526132fc91810190613f0e565b60015b156133555760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505050505050505b613368878787612bb0565b600d546001600160a01b031663e30443bc88613383816118d6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156133c957600080fd5b505af11580156133dd573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc9050876133fe816118d6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561344457600080fd5b505af1158015613458573d6000803e3d6000fd5b50506006546001600160a01b038a811691161480159250905061349457506001600160a01b0387166000908152601d602052604090205460ff16155b80156134b25750601f546001600160a01b0387811661010090920416145b15612e4f57601f54604051633fb6b04560e11b8152600481018790526001600160a01b03898116602483015261010090920490911690637f6d608a90604401600060405180830381600087803b15801561350b57600080fd5b505af115801561351f573d6000803e3d6000fd5b5050505050505050505050565b600081848411156135505760405162461bcd60e51b8152600401610e319190613a84565b50600061355d848661404c565b95945050505050565b6001600160a01b0382166000908152601d60205260409020805460ff191682158015919091179091556135f357600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156135da57600080fd5b505af11580156135ee573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600081836136505760405162461bcd60e51b8152600401610e319190613a84565b50600061355d8486613f8f565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061369257613692613e8c565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156136eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061370f9190613ebb565b8160018151811061372257613722613e8c565b6001600160a01b0392831660209182029290920101526006546137489130911684612a8b565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061378190859060009086903090429060040161405f565b600060405180830381600087803b15801561379b57600080fd5b505af11580156137af573d6000803e3d6000fd5b505050505050565b6001600160a01b0382166000908152601d602052604081205460ff1680156137ed57506006546001600160a01b03838116911614155b156137fa57506001611004565b6001600160a01b0382166000908152601d602052604090205460ff161561382357506002611004565b50600092915050565b6001600160a01b03821661388c5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610e31565b6138c9816040518060600160405280602281526020016140d1602291396001600160a01b038516600090815260208190526040902054919061352c565b6001600160a01b0383166000908152602081905260409020556002546138ef9082612a49565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000613944826002612707565b905060006139528383612a49565b90504761395e8361365d565b600061396a4783612a49565b905061397683826139be565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b6006546139d69030906001600160a01b031684612a8b565b60065460085460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613a46573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906114429190613f0e565b600060208284031215613a7d57600080fd5b5035919050565b600060208083528351808285015260005b81811015613ab157858101830151858201604001528201613a95565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461154f57600080fd5b801515811461154f57600080fd5b60008060408385031215613b0857600080fd5b8235613b1381613ad2565b91506020830135613b2381613ae7565b809150509250929050565b60008060408385031215613b4157600080fd5b8235613b4c81613ad2565b946020939093013593505050565b600060208284031215613b6c57600080fd5b813561267e81613ad2565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613bb657613bb6613b77565b604052919050565b600067ffffffffffffffff821115613bd857613bd8613b77565b5060051b60200190565b600082601f830112613bf357600080fd5b81356020613c08613c0383613bbe565b613b8d565b82815260059290921b84018101918181019086841115613c2757600080fd5b8286015b84811015613c425780358352918301918301613c2b565b509695505050505050565b60008060408385031215613c6057600080fd5b823567ffffffffffffffff80821115613c7857600080fd5b818501915085601f830112613c8c57600080fd5b81356020613c9c613c0383613bbe565b82815260059290921b84018101918181019089841115613cbb57600080fd5b948201945b83861015613ce2578535613cd381613ad2565b82529482019490820190613cc0565b96505086013592505080821115613cf857600080fd5b50613d0585828601613be2565b9150509250929050565b600080600060608486031215613d2457600080fd5b8335613d2f81613ad2565b92506020840135613d3f81613ad2565b929592945050506040919091013590565b600060208284031215613d6257600080fd5b813561267e81613ae7565b60008060408385031215613d8057600080fd5b8235613d8b81613ad2565b91506020830135613b2381613ad2565b600080600080600080600080610100898b031215613db857600080fd5b505086359860208801359850604088013597606081013597506080810135965060a0810135955060c0810135945060e0013592509050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761100457611004613e25565b600181811c90821680613e6657607f821691505b602082108103613e8657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600060018201613eb457613eb4613e25565b5060010190565b600060208284031215613ecd57600080fd5b815161267e81613ad2565b600060208284031215613eea57600080fd5b5051919050565b600060208284031215613f0357600080fd5b815161267e81613ae7565b600080600060608486031215613f2357600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c08789031215613f5557600080fd5b8651613f6081613ad2565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b600082613fac57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561100457611004613e25565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8181038181111561100457611004613e25565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156140af5784516001600160a01b03168352938301939183019160010161408a565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220acd64386ca81d2b9d3ba892b5f7f9e5bb64ed441439fcd904b23d29d58fc2f1764736f6c63430008110033

Deployed Bytecode Sourcemap

25411:24898:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25572:64;;;;;;;;;;-1:-1:-1;25572:64:0;;;;-1:-1:-1;;;;;25572:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;25572:64:0;;;;;;;;47171:443;;;;;;;;;;-1:-1:-1;47171:443:0;;;;;:::i;:::-;;:::i;:::-;;5588:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33331:181::-;;;;;;;;;;-1:-1:-1;33331:181:0;;;;;:::i;:::-;;:::i;6643:210::-;;;;;;;;;;-1:-1:-1;6643:210:0;;;;;:::i;:::-;;:::i;:::-;;;2091:14:1;;2084:22;2066:41;;2054:2;2039:18;6643:210:0;1926:187:1;25487:41:0;;;;;;;;;;-1:-1:-1;25487:41:0;;;;-1:-1:-1;;;;;25487:41:0;;;5909:108;;;;;;;;;;-1:-1:-1;5997:12:0;;5909:108;;;2499:25:1;;;2487:2;2472:18;5909:108:0;2353:177:1;26385:29:0;;;;;;;;;;;;;;;;33080:199;;;;;;;;;;-1:-1:-1;33080:199:0;;;;;:::i;:::-;;:::i;25750:28::-;;;;;;;;;;;;;;;;26350;;;;;;;;;;;;;;;;26975:55;;;;;;;;;;-1:-1:-1;26975:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;49669:637;;;;;;;;;;-1:-1:-1;49669:637:0;;;;;:::i;:::-;;:::i;6861:454::-;;;;;;;;;;-1:-1:-1;6861:454:0;;;;;:::i;:::-;;:::i;46148:114::-;;;;;;;;;;;;;:::i;25860:44::-;;;;;;;;;;-1:-1:-1;25860:44:0;;;;-1:-1:-1;;;;;25860:44:0;;;37287:141;;;;;;;;;;;;;:::i;31267:93::-;;;;;;;;;;-1:-1:-1;31267:93:0;;31350:2;6123:36:1;;6111:2;6096:18;31267:93:0;5981:184:1;39630:119:0;;;;;;;;;;-1:-1:-1;39630:119:0;;;;;:::i;:::-;;:::i;7323:300::-;;;;;;;;;;-1:-1:-1;7323:300:0;;;;;:::i;:::-;;:::i;25714:29::-;;;;;;;;;;;;;;;;35103:121;;;;;;;;;;-1:-1:-1;35103:121:0;;;;;:::i;:::-;;:::i;25537:28::-;;;;;;;;;;-1:-1:-1;25537:28:0;;;;-1:-1:-1;;;;;25537:28:0;;;26423:40;;;;;;;;;;-1:-1:-1;26423:40:0;;;;;;;;25671:34;;;;;;;;;;-1:-1:-1;25671:34:0;;;;-1:-1:-1;;;25671:34:0;;;;;;38999:103;;;;;;;;;;;;;:::i;37436:126::-;;;;;;;;;;-1:-1:-1;37436:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;37526:28:0;37502:4;37526:28;;;:19;:28;;;;;;;;;37436:126;26240:31;;;;;;;;;;;;;;;;46270:183;;;;;;;;;;-1:-1:-1;46270:183:0;;;;;:::i;:::-;;:::i;32836:205::-;;;;;;;;;;-1:-1:-1;32836:205:0;;;;;:::i;:::-;;:::i;46461:175::-;;;;;;;;;;-1:-1:-1;46461:175:0;;;;;:::i;:::-;;:::i;34459:120::-;;;;;;;;;;-1:-1:-1;34459:120:0;;;;;:::i;:::-;;:::i;39248:142::-;;;;;;;;;;;;;:::i;37762:171::-;;;;;;;;;;-1:-1:-1;37762:171:0;;;;;:::i;:::-;;:::i;39757:185::-;;;;;;;;;;-1:-1:-1;39757:185:0;;;;;:::i;:::-;;:::i;38581:410::-;;;;;;;;;;-1:-1:-1;38581:410:0;;;;;:::i;:::-;;:::i;6025:177::-;;;;;;;;;;-1:-1:-1;6025:177:0;;;;;:::i;:::-;;:::i;13002:148::-;;;;;;;;;;;;;:::i;33561:127::-;;;;;;;;;;-1:-1:-1;33561:127:0;;;;;:::i;:::-;;:::i;35769:208::-;;;;;;;;;;-1:-1:-1;35769:208:0;;;;;:::i;:::-;;:::i;25913:38::-;;;;;;;;;;-1:-1:-1;25913:38:0;;;;-1:-1:-1;;;;;25913:38:0;;;26315:28;;;;;;;;;;;;;;;;26911:32;;;;;;;;;;-1:-1:-1;26911:32:0;;;;;;;;33964:170;;;;;;;;;;-1:-1:-1;33964:170:0;;;;;:::i;:::-;;:::i;39398:109::-;;;;;;;;;;-1:-1:-1;39398:109:0;;;;;:::i;:::-;;:::i;35520:241::-;;;;;;;;;;-1:-1:-1;35520:241:0;;;;;:::i;:::-;;:::i;12788:79::-;;;;;;;;;;-1:-1:-1;12853:6:0;;-1:-1:-1;;;;;12853:6:0;12788:79;;26163:32;;;;;;;;;;;;;;;;5696:104;;;;;;;;;;;;;:::i;34803:163::-;;;;;;;;;;-1:-1:-1;34803:163:0;;;;;:::i;:::-;;:::i;26521:40::-;;;;;;;;;;;;;;;;34974:121;;;;;;;;;;-1:-1:-1;34974:121:0;;;;;:::i;:::-;;:::i;33726:176::-;;;;;;;;;;-1:-1:-1;33726:176:0;;;;;:::i;:::-;;:::i;7631:400::-;;;;;;;;;;-1:-1:-1;7631:400:0;;;;;:::i;:::-;;:::i;37570:184::-;;;;;;;;;;-1:-1:-1;37570:184:0;;;;;:::i;:::-;;:::i;6210:216::-;;;;;;;;;;-1:-1:-1;6210:216:0;;;;;:::i;:::-;;:::i;31748:143::-;;;;;;;;;;-1:-1:-1;31748:143:0;;;;;:::i;:::-;;:::i;37941:307::-;;;;;;;;;;-1:-1:-1;37941:307:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6941:32:1;;;6923:51;;7005:2;6990:18;;6983:34;;;;7033:18;;;7026:34;;;;7091:2;7076:18;;7069:34;7134:3;7119:19;;7112:35;6961:3;7163:19;;7156:35;6910:3;6895:19;37941:307:0;6640:557:1;26684:57:0;;;;;;;;;;-1:-1:-1;26684:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39950:127;;;;;;;;;;-1:-1:-1;39950:127:0;;;;;:::i;:::-;;:::i;26127:29::-;;;;;;;;;;;;;;;;32523:268;;;;;;;;;;-1:-1:-1;32523:268:0;;;;;:::i;:::-;;:::i;34587:208::-;;;;;;;;;;-1:-1:-1;34587:208:0;;;;;:::i;:::-;;:::i;31907:146::-;;;;;;;;;;;;;:::i;45982:158::-;;;;;;;;;;-1:-1:-1;45982:158:0;;;;;:::i;:::-;;:::i;6434:201::-;;;;;;;;;;-1:-1:-1;6434:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;6600:18:0;;;6568:7;6600:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6434:201;25958:36;;;;;;;;;;-1:-1:-1;25958:36:0;;;;-1:-1:-1;;;;;25958:36:0;;;26087:33;;;;;;;;;;;;;;;;39110:130;;;;;;;;;;;;;:::i;26278:30::-;;;;;;;;;;;;;;;;38256:317;;;;;;;;;;-1:-1:-1;38256:317:0;;;;;:::i;:::-;;:::i;35985:1294::-;;;;;;;;;;-1:-1:-1;35985:1294:0;;;;;:::i;:::-;;:::i;13158:281::-;;;;;;;;;;-1:-1:-1;13158:281:0;;;;;:::i;:::-;;:::i;32069:383::-;;;;;;;;;;-1:-1:-1;32069:383:0;;;;;:::i;:::-;;:::i;39515:107::-;;;;;;;;;;-1:-1:-1;39515:107:0;;;;;:::i;:::-;;:::i;26202:31::-;;;;;;;;;;;;;;;;26056:24;;;;;;;;;;;;;;;;34204:221;;;;;;;;;;-1:-1:-1;34204:221:0;;;;;:::i;:::-;;:::i;47171:443::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;;;;;;;;;47259:17:::1;:6:::0;47269::::1;47259:17;:::i;:::-;47250:26;;47287:19;47309:25;47323:10;;47309:9;;:13;;:25;;;;:::i;:::-;47287:47;;47345:15;47363:38;47389:11;47363:21;47374:9;;47363:6;:10;;:21;;;;:::i;:::-;:25:::0;::::1;:38::i;:::-;47345:56;;47412:16;47431:39;47458:11;47431:22;47442:10;;47431:6;:10;;:22;;;;:::i;:39::-;47412:58;;47483:28;47504:6;47483:20;:28::i;:::-;47536:9;::::0;:22:::1;::::0;47550:7;47536:13:::1;:22::i;:::-;47524:9;:34:::0;47582:10:::1;::::0;:24:::1;::::0;47597:8;47582:14:::1;:24::i;:::-;47569:10;:37:::0;-1:-1:-1;;;;47171:443:0:o;5588:100::-;5642:13;5675:5;5668:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5588:100;:::o;33331:181::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33415:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;33415:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;33470:34;;2066:41:1;;;33470:34:0::1;::::0;2039:18:1;33470:34:0::1;;;;;;;33331:181:::0;;:::o;6643:210::-;6762:4;6784:39;174:10;6807:7;6816:6;6784:8;:39::i;:::-;-1:-1:-1;6841:4:0;6643:210;;;;;:::o;33080:199::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33152:27:0;::::1;;::::0;;;:19:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;33152:34:0::1;33182:4;33152:34;::::0;;33197:13:::1;:31:::0;;-1:-1:-1;;;;;;33197:31:0::1;::::0;::::1;::::0;;33244:27;;160:51:1;;;33244:27:0::1;::::0;133:18:1;33244:27:0::1;;;;;;;;33080:199:::0;:::o;49669:637::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;49841:6:::1;:13;49816:14;:21;:38;49808:80;;;::::0;-1:-1:-1;;;49808:80:0;;9514:2:1;49808:80:0::1;::::0;::::1;9496:21:1::0;9553:2;9533:18;;;9526:30;9592:32;9572:18;;;9565:60;9642:18;;49808:80:0::1;9312:354:1::0;49808:80:0::1;49932:3;49907:14;:21;:28;;49899:75;;;::::0;-1:-1:-1;;;49899:75:0;;9873:2:1;49899:75:0::1;::::0;::::1;9855:21:1::0;9912:2;9892:18;;;9885:30;9951:34;9931:18;;;9924:62;-1:-1:-1;;;10002:18:1;;;9995:32;10044:19;;49899:75:0::1;9671:398:1::0;49899:75:0::1;49990:9;49985:314;50009:14;:21;50005:1;:25;49985:314;;;50052:14;50069;50084:1;50069:17;;;;;;;;:::i;:::-;;;;;;;50052:34;;50101:21;50125:6;50132:1;50125:9;;;;;;;;:::i;:::-;;;;;;;50138:6;50125:20;;;;:::i;:::-;50101:44;;50160:50;50176:10;50188:6;50196:13;50160:15;:50::i;:::-;50225:15;::::0;-1:-1:-1;;;;;50225:15:0::1;:26;50260:6:::0;50269:17:::1;50260:6:::0;50269:9:::1;:17::i;:::-;50225:62;::::0;-1:-1:-1;;;;;;50225:62:0::1;::::0;;;;;;-1:-1:-1;;;;;10406:32:1;;;50225:62:0::1;::::0;::::1;10388:51:1::0;10455:18;;;10448:34;10361:18;;50225:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;50037:262;;50032:3;;;;;:::i;:::-;;;;49985:314;;;;49669:637:::0;;:::o;6861:454::-;7001:4;7018:36;7028:6;7036:9;7047:6;7018:9;:36::i;:::-;7065:220;7088:6;174:10;7136:138;7192:6;7136:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7136:19:0;;;;;;:11;:19;;;;;;;;174:10;7136:33;;;;;;;;;;:37;:138::i;:::-;7065:8;:220::i;:::-;-1:-1:-1;7303:4:0;6861:454;;;;;:::o;46148:114::-;46222:15;;:32;;;-1:-1:-1;;;46222:32:0;;;;46195:7;;-1:-1:-1;;;;;46222:15:0;;:30;;:32;;;;;;;;;;;;;;:15;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46215:39;;46148:114;:::o;37287:141::-;37377:15;;:43;;;-1:-1:-1;;;37377:43:0;;;;37350:7;;-1:-1:-1;;;;;37377:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;39630:119::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;39700:15:::1;::::0;:41:::1;::::0;-1:-1:-1;;;39700:41:0;;2091:14:1;;2084:22;39700:41:0::1;::::0;::::1;2066::1::0;-1:-1:-1;;;;;39700:15:0;;::::1;::::0;:34:::1;::::0;2039:18:1;;39700:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39630:119:::0;:::o;7323:300::-;174:10;7438:4;7532:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;7532:34:0;;;;;;;;;;7438:4;;7460:133;;7510:7;;7532:50;;7571:10;7532:38;:50::i;35103:121::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;35173:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;35173:43:0;;2091:14:1;;2084:22;35173:43:0::1;::::0;::::1;2066:41:1::0;-1:-1:-1;;;;;35173:15:0;;::::1;::::0;:36:::1;::::0;2039:18:1;;35173:43:0::1;1926:187:1::0;38999:103:0;39036:15;;:58;;-1:-1:-1;;;39036:58:0;;39075:10;39036:58;;;11262:51:1;39036:15:0;11329:18:1;;;11322:50;-1:-1:-1;;;;;39036:15:0;;;;:30;;11235:18:1;;39036:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38999:103::o;46270:183::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;46384:15:::1;::::0;:61:::1;::::0;-1:-1:-1;;;46384:61:0;;::::1;::::0;::::1;2499:25:1::0;;;-1:-1:-1;;;;;46384:15:0;;::::1;::::0;:54:::1;::::0;2472:18:1;;46384:61:0::1;2353:177:1::0;32836:205:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32910:27:0;::::1;;::::0;;;:19:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;32910:34:0::1;32940:4;32910:34;::::0;;32955:15:::1;:33:::0;;-1:-1:-1;;;;;;32955:33:0::1;::::0;::::1;::::0;;33004:29;;160:51:1;;;33004:29:0::1;::::0;133:18:1;33004:29:0::1;14:203:1::0;46461:175:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;46571:15:::1;::::0;:57:::1;::::0;-1:-1:-1;;;46571:57:0;;::::1;::::0;::::1;2499:25:1::0;;;-1:-1:-1;;;;;46571:15:0;;::::1;::::0;:50:::1;::::0;2472:18:1;;46571:57:0::1;2353:177:1::0;34459:120:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;34554:17:::1;:6:::0;34564::::1;34554:17;:::i;:::-;34533:18;:38:::0;-1:-1:-1;34459:120:0:o;39248:142::-;39341:15;;:41;;;-1:-1:-1;;;39341:41:0;;;;39314:7;;-1:-1:-1;;;;;39341:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;37762:171;37891:15;;:34;;-1:-1:-1;;;37891:34:0;;-1:-1:-1;;;;;178:32:1;;;37891:34:0;;;160:51:1;37859:7:0;;37891:15;;:25;;133:18:1;;37891:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;39757:185::-;39886:15;;:48;;-1:-1:-1;;;39886:48:0;;-1:-1:-1;;;;;178:32:1;;;39886:48:0;;;160:51:1;39857:4:0;;39886:15;;:39;;133:18:1;;39886:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;38581:410::-;38763:15;;:28;;-1:-1:-1;;;;;;38763:28:0;;;;;2499:25:1;;;38661:18:0;;;;;;-1:-1:-1;;;;;38763:15:0;;:23;;2472:18:1;;38763:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38807:176;;;12175:25:1;;;12231:2;12216:18;;12209:34;;;12259:18;;;12252:34;;;12317:2;12302:18;;12295:34;;;38646:145:0;;-1:-1:-1;38646:145:0;;-1:-1:-1;38646:145:0;-1:-1:-1;38963:9:0;;38925:5;;38807:176;;12162:3:1;12147:19;38807:176:0;;;;;;;38635:356;;;38581:410;:::o;6025:177::-;-1:-1:-1;;;;;6176:18:0;6144:7;6176:18;;;;;;;;;;;;6025:177::o;13002:148::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;13093:6:::1;::::0;13072:40:::1;::::0;13109:1:::1;::::0;-1:-1:-1;;;;;13093:6:0::1;::::0;13072:40:::1;::::0;13109:1;;13072:40:::1;13123:6;:19:::0;;-1:-1:-1;;;;;;13123:19:0::1;::::0;;13002:148::o;33561:127::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;33635:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;33635:45:0;;-1:-1:-1;;;;;178:32:1;;;33635:45:0::1;::::0;::::1;160:51:1::0;33635:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;33635:45:0::1;14:203:1::0;35769:208:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;35838:15:::1;::::0;:46:::1;::::0;-1:-1:-1;;;35838:46:0;;-1:-1:-1;;;;;178:32:1;;;35838:46:0::1;::::0;::::1;160:51:1::0;35838:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;35838:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;35895:29:0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:36;;-1:-1:-1;;35895:36:0::1;35927:4;35895:36;::::0;;-1:-1:-1;35942:27:0::1;35915:8:::0;35942:17:::1;:27::i;33964:170::-:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34076:41:0;;;::::1;;::::0;;;:33:::1;:41;::::0;;;;:50;;-1:-1:-1;;34076:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;33964:170::o;39398:109::-;39452:15;;:47;;-1:-1:-1;;;39452:47:0;;39481:10;39452:47;;;11262:51:1;11356:14;;11349:22;11329:18;;;11322:50;-1:-1:-1;;;;;39452:15:0;;;;:28;;11235:18:1;;39452:47:0;11078:300:1;35520:241:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;35618:6:::1;35606:8;:18;;:41;;;;;35640:7;35628:8;:19;;35606:41;35598:50;;;::::0;::::1;;35698:16;::::0;35664:51:::1;::::0;35688:8;;35664:51:::1;::::0;;;::::1;35726:16;:27:::0;35520:241::o;5696:104::-;5752:13;5785:7;5778:14;;;;;:::i;34803:163::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;34917:41:::1;34946:4;34952:5;34917:28;:41::i;:::-;34803:163:::0;;:::o;34974:121::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;35044:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;35044:43:0;;2091:14:1;;2084:22;35044:43:0::1;::::0;::::1;2066:41:1::0;-1:-1:-1;;;;;35044:15:0;;::::1;::::0;:36:::1;::::0;2039:18:1;;35044:43:0::1;1926:187:1::0;33726:176:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;33800:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;33800:45:0;;-1:-1:-1;;;;;178:32:1;;;33800:45:0::1;::::0;::::1;160:51:1::0;33800:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;33800:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;33856:15:0::1;::::0;:38:::1;::::0;-1:-1:-1;;;33856:38:0;;-1:-1:-1;;;;;10406:32:1;;;33856:38:0::1;::::0;::::1;10388:51:1::0;33856:15:0::1;10455:18:1::0;;;10448:34;33856:15:0;;::::1;::::0;-1:-1:-1;33856:26:0::1;::::0;-1:-1:-1;10361:18:1;;33856:38:0::1;10206:282:1::0;7631:400:0;7751:4;7773:228;174:10;7823:7;7845:145;7902:15;7845:145;;;;;;;;;;;;;;;;;174:10;7845:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;7845:34:0;;;;;;;;;;;;:38;:145::i;37570:184::-;37699:15;;:47;;-1:-1:-1;;;37699:47:0;;-1:-1:-1;;;;;178:32:1;;;37699:47:0;;;160:51:1;37667:7:0;;37699:15;;:38;;133:18:1;;37699:47:0;14:203:1;6210:216:0;6332:4;6354:42;174:10;6378:9;6389:6;6354:9;:42::i;31748:143::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31841:30:0;;;::::1;;::::0;;;:23:::1;:30:::0;;;;;:38;;-1:-1:-1;;31841:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31748:143::o;37941:307::-;38205:15;;:35;;-1:-1:-1;;;38205:35:0;;-1:-1:-1;;;;;178:32:1;;;38205:35:0;;;160:51:1;38055:7:0;;;;;;;;;;;;38205:15;;;;:26;;133:18:1;;38205:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38198:42;;;;-1:-1:-1;38198:42:0;;-1:-1:-1;38198:42:0;-1:-1:-1;38198:42:0;-1:-1:-1;38198:42:0;;-1:-1:-1;37941:307:0;-1:-1:-1;;37941:307:0:o;39950:127::-;40034:15;;:35;;-1:-1:-1;;;40034:35:0;;-1:-1:-1;;;;;178:32:1;;;40034:35:0;;;160:51:1;40010:4:0;;40034:15;;:26;;133:18:1;;40034:35:0;14:203:1;32523:268:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32595:41:0;;::::1;;::::0;;;:33:::1;:41;::::0;;;;;;;:48;;32639:4:::1;-1:-1:-1::0;;32595:48:0;;::::1;::::0;::::1;::::0;;;32654:19:::1;:27:::0;;;;;;;:34;;;;::::1;::::0;;::::1;::::0;;32699:15:::1;::::0;:44;;-1:-1:-1;;;32699:44:0;;::::1;::::0;::::1;160:51:1::0;;;;32699:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;32699:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;32759:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;32759:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;32759:24:0::1;14:203:1::0;34587:208:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;34667:21:::1;::::0;:32;::::1;;:21;::::0;;::::1;:32;;::::0;34659:41:::1;;;::::0;::::1;;34711:21;:31:::0;;-1:-1:-1;;34711:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;34758:29:::1;::::0;2066:41:1;;;34758:29:0::1;::::0;2054:2:1;2039:18;34758:29:0::1;1926:187:1::0;31907:146:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;31974:20:::1;::::0;::::1;;31973:21;31965:30;;;::::0;::::1;;32014:20;:27:::0;;-1:-1:-1;;32014:27:0::1;32037:4;32014:27;::::0;;31907:146::o;45982:158::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;46052:15:::1;::::0;:40:::1;::::0;-1:-1:-1;;;46052:40:0;;-1:-1:-1;;;;;178:32:1;;;46052:40:0::1;::::0;::::1;160:51:1::0;46052:15:0;;::::1;::::0;:33:::1;::::0;133:18:1;;46052:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;46108:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;46108:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;46108:24:0::1;14:203:1::0;39110:130:0;39193:15;;:39;;;-1:-1:-1;;;39193:39:0;;;;39166:7;;-1:-1:-1;;;;;39193:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;38256:317;38525:15;;:40;;-1:-1:-1;;;38525:40:0;;;;;2499:25:1;;;38375:7:0;;;;;;;;;;;;-1:-1:-1;;;;;38525:15:0;;;;:33;;2472:18:1;;38525:40:0;2353:177:1;35985:1294:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;36284:16:::1;:31:::0;;;36326:15:::1;:30:::0;;;36367:13:::1;:26:::0;;;36404:17:::1;:33:::0;;;36448:16:::1;:32:::0;;;36491:14:::1;:28:::0;;;36530:13:::1;:26:::0;;;36567:14:::1;:28:::0;;;36624:121:::1;36584:11:::0;36624:87:::1;36424:13:::0;36624:87;36508:11;36467:13;36624:32:::1;:50::i;:::-;:68:::0;::::1;:87::i;:121::-;36608:13;:137;;;;36773:117;36876:13;;36773:84;36840:16;;36773:48;36805:15;;36773:13;;:31;;:48;;;;:::i;:117::-;36758:12;:132:::0;36911:13:::1;::::0;36928:1:::1;-1:-1:-1::0;36911:18:0;::::1;::::0;:39:::1;;;36949:1;36933:12;;:17;;36911:39;36903:91;;;::::0;-1:-1:-1;;;36903:91:0;;13680:2:1;36903:91:0::1;::::0;::::1;13662:21:1::0;13719:2;13699:18;;;13692:30;13758:34;13738:18;;;13731:62;-1:-1:-1;;;13809:18:1;;;13802:37;13856:19;;36903:91:0::1;13478:403:1::0;36903:91:0::1;37037:17;::::0;37069:16:::1;::::0;37100:14:::1;::::0;37129:16:::1;::::0;37160:15:::1;::::0;37190:13:::1;::::0;37218::::1;::::0;37246:14:::1;::::0;37012:259:::1;::::0;;14229:25:1;;;14285:2;14270:18;;14263:34;;;;14313:18;;;14306:34;;;;14371:2;14356:18;;14349:34;;;;14414:3;14399:19;;14392:35;14458:3;14443:19;;14436:35;14502:3;14487:19;;14480:35;14546:3;14531:19;;14524:35;37012:259:0::1;::::0;14216:3:1;14201:19;37012:259:0::1;;;;;;;35985:1294:::0;;;;;;;;:::o;13158:281::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13261:22:0;::::1;13239:110;;;::::0;-1:-1:-1;;;13239:110:0;;14772:2:1;13239:110:0::1;::::0;::::1;14754:21:1::0;14811:2;14791:18;;;14784:30;14850:34;14830:18;;;14823:62;-1:-1:-1;;;14901:18:1;;;14894:36;14947:19;;13239:110:0::1;14570:402:1::0;13239:110:0::1;13386:6;::::0;13365:38:::1;::::0;-1:-1:-1;;;;;13365:38:0;;::::1;::::0;13386:6:::1;::::0;13365:38:::1;::::0;13386:6:::1;::::0;13365:38:::1;13414:6;:17:::0;;-1:-1:-1;;;;;;13414:17:0::1;-1:-1:-1::0;;;;;13414:17:0;;;::::1;::::0;;;::::1;::::0;;13158:281::o;32069:383::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;32143:10:::1;:20:::0;;-1:-1:-1;;;;;;32143:20:0::1;;-1:-1:-1::0;;;;;32143:20:0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;32178:21;32174:203:::1;;-1:-1:-1::0;;;;;32216:32:0;;::::1;;::::0;;;:23:::1;:32:::0;;;;;;;:39;;32251:4:::1;-1:-1:-1::0;;32216:39:0;;::::1;::::0;::::1;::::0;;;32270:19:::1;:28:::0;;;;;;;:35;;;;::::1;::::0;;::::1;::::0;;32320:15:::1;::::0;:45;;-1:-1:-1;;;32320:45:0;;::::1;::::0;::::1;160:51:1::0;;;;32320:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;32320:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;32174:203;32387:14;:21:::0;;-1:-1:-1;;;;32387:21:0::1;-1:-1:-1::0;;;32387:21:0::1;::::0;;32424:16:::1;::::0;::::1;::::0;32387:21;;32424:16:::1;32069:383:::0;:::o;39515:107::-;39568:15;;:46;;-1:-1:-1;;;39568:46:0;;39596:10;39568:46;;;11262:51:1;11356:14;;11349:22;11329:18;;;11322:50;-1:-1:-1;;;;;39568:15:0;;;;:27;;11235:18:1;;39568:46:0;11078:300:1;34204:221:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;34279:16:::1;:5:::0;34288:6:::1;34279:16;:::i;:::-;34271:24;;34338:4;34323:12;;:19;;;;:::i;:::-;34314:5;:28;;34306:83;;;::::0;-1:-1:-1;;;34306:83:0;;15401:2:1;34306:83:0::1;::::0;::::1;15383:21:1::0;15440:2;15420:18;;;15413:30;15479:34;15459:18;;;15452:62;-1:-1:-1;;;15530:18:1;;;15523:40;15580:19;;34306:83:0::1;15199:406:1::0;34306:83:0::1;34400:9;:17:::0;34204:221::o;10814:181::-;10872:7;;10904:5;10908:1;10904;:5;:::i;:::-;10892:17;;10933:1;10928;:6;;10920:46;;;;-1:-1:-1;;;10920:46:0;;15942:2:1;10920:46:0;;;15924:21:1;15981:2;15961:18;;;15954:30;16020:29;16000:18;;;15993:57;16067:18;;10920:46:0;15740:351:1;10920:46:0;10986:1;10814:181;-1:-1:-1;;;10814:181:0:o;11381:250::-;11439:7;11463:1;11468;11463:6;11459:47;;-1:-1:-1;11493:1:0;11486:8;;11459:47;11518:9;11530:5;11534:1;11530;:5;:::i;:::-;11518:17;-1:-1:-1;11563:1:0;11554:5;11558:1;11518:17;11554:5;:::i;:::-;:10;11546:56;;;;-1:-1:-1;;;11546:56:0;;16298:2:1;11546:56:0;;;16280:21:1;16337:2;16317:18;;;16310:30;16376:34;16356:18;;;16349:62;-1:-1:-1;;;16427:18:1;;;16420:31;16468:19;;11546:56:0;16096:397:1;11639:132:0;11697:7;11724:39;11728:1;11731;11724:39;;;;;;;;;;;;;;;;;:3;:39::i;47622:2039::-;47691:6;47701:1;47691:11;47687:50;;47622:2039;:::o;47687:50::-;47747:24;47764:6;47747:16;:24::i;:::-;47782:19;47804:25;47818:10;;47804:9;;:13;;:25;;;;:::i;:::-;48045:13;;47782:47;;-1:-1:-1;47857:4:0;;;;;;47842:12;;;;;;48045:17;48041:265;;48098:196;48280:13;;48261:16;;48245:13;;:32;;;;:::i;:::-;:48;;;;:::i;:::-;48098:128;48212:13;;48098:95;48181:11;48098:64;48152:9;;48098:35;:53;;:64;;;;:::i;:95::-;:113;;:128::i;:196::-;48079:215;;48041:265;48320:14;;:18;48316:272;;48375:201;48561:14;;48541:17;;48524:14;;:34;;;;:::i;:::-;:51;;;;:::i;:::-;48375:130;48490:14;;48375:96;48459:11;48375:65;48429:10;;48375:35;:53;;:65;;;;:::i;:201::-;48355:221;;48316:272;48610:39;:16;48631:17;48610:20;:39::i;:::-;48598:51;-1:-1:-1;48666:13:0;;48662:111;;48718:15;;48710:51;;-1:-1:-1;;;;;48718:15:0;;;;48747:9;;48710:51;;;;48747:9;48718:15;48710:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48696:65:0;;-1:-1:-1;;48662:111:0;48793:21;48870:35;48891:13;;48870:16;;:20;;:35;;;;:::i;:::-;48839:14;;48817:17;;:37;;:21;:37::i;:::-;:88;;;;:::i;:::-;48793:112;-1:-1:-1;48918:19:0;48952:17;;48948:104;;49000:40;:21;49026:13;49000:25;:40::i;:::-;48986:54;;48948:104;49062:23;49130:11;49088:39;49109:17;;49088:16;;:20;;:39;;;;:::i;:::-;:53;;;;:::i;:::-;49062:79;;49152:21;49212:11;49176:33;49194:14;;49176:13;;:17;;:33;;;;:::i;:::-;:47;;;;:::i;:::-;49152:71;-1:-1:-1;49240:19:0;;49236:126;;49301:15;;49293:57;;-1:-1:-1;;;;;49301:15:0;;;;49330;;49293:57;;;;49330:15;49301;49293:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49276:74:0;;-1:-1:-1;;49236:126:0;49376:17;;49372:120;;49435:13;;49427:53;;-1:-1:-1;;;;;49435:13:0;;;;49462;;49427:53;;;;49462:13;49435;49427:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49410:70:0;;-1:-1:-1;;49372:120:0;49509:144;49537:9;49561:31;49579:13;49561:15;:31;:::i;:::-;49607:7;:21;;;;;49618:10;49607:21;:35;;;;;49632:10;49607:35;49509:144;;;16904:25:1;;;16960:2;16945:18;;16938:34;;;;17015:14;17008:22;16988:18;;;16981:50;16892:2;16877:18;49509:144:0;;;;;;;47676:1985;;;;;;;;;;;47622:2039;:::o;11003:136::-;11061:7;11088:43;11092:1;11095;11088:43;;;;;;;;;;;;;;;;;:3;:43::i;9506:380::-;-1:-1:-1;;;;;9642:19:0;;9634:68;;;;-1:-1:-1;;;9634:68:0;;17244:2:1;9634:68:0;;;17226:21:1;17283:2;17263:18;;;17256:30;17322:34;17302:18;;;17295:62;-1:-1:-1;;;17373:18:1;;;17366:34;17417:19;;9634:68:0;17042:400:1;9634:68:0;-1:-1:-1;;;;;9721:21:0;;9713:68;;;;-1:-1:-1;;;9713:68:0;;17649:2:1;9713:68:0;;;17631:21:1;17688:2;17668:18;;;17661:30;17727:34;17707:18;;;17700:62;-1:-1:-1;;;17778:18:1;;;17771:32;17820:19;;9713:68:0;17447:398:1;9713:68:0;-1:-1:-1;;;;;9794:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;9846:32;;2499:25:1;;;9846:32:0;;2472:18:1;9846:32:0;;;;;;;;9506:380;;;:::o;8039:610::-;-1:-1:-1;;;;;8179:20:0;;8171:70;;;;-1:-1:-1;;;8171:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8260:23:0;;8252:71;;;;-1:-1:-1;;;8252:71:0;;;;;;;:::i;:::-;8416:108;8452:6;8416:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8416:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;8396:17:0;;;:9;:17;;;;;;;;;;;:128;;;;8558:20;;;;;;;:32;;8583:6;8558:24;:32::i;:::-;-1:-1:-1;;;;;8535:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;8606:35;2499:25:1;;;8535:20:0;;8606:35;;;;;;2472:18:1;8606:35:0;2353:177:1;40085:4894:0;-1:-1:-1;;;;;40217:18:0;;40209:68;;;;-1:-1:-1;;;40209:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40296:16:0;;40288:64;;;;-1:-1:-1;;;40288:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40491:39:0;;40363:18;40491:39;;;:33;:39;;;;;;40363:18;;;;;;40491:39;;40486:132;;40555:14;;-1:-1:-1;;;40555:14:0;;;;40547:59;;;;-1:-1:-1;;;40547:59:0;;18862:2:1;40547:59:0;;;18844:21:1;;;18881:18;;;18874:30;18940:34;18920:18;;;18913:62;18992:18;;40547:59:0;18660:356:1;40547:59:0;40642:20;;;;:29;;;:57;;-1:-1:-1;40675:10:0;;;;;-1:-1:-1;;;;;40675:10:0;:24;;40642:57;40638:209;;;40724:19;40734:4;40740:2;40724:9;:19::i;:::-;:24;;:57;;-1:-1:-1;;;;;;40752:29:0;;;;;;:23;:29;;;;;;;;40724:57;:88;;;-1:-1:-1;;;;;;40785:27:0;;;;;;:23;:27;;;;;;;;40724:88;40716:119;;;;-1:-1:-1;;;40716:119:0;;19223:2:1;40716:119:0;;;19205:21:1;19262:2;19242:18;;;19235:30;-1:-1:-1;;;19281:18:1;;;19274:48;19339:18;;40716:119:0;19021:342:1;40716:119:0;40879:6;40889:1;40879:11;40875:93;;40907:28;40923:4;40929:2;40933:1;40907:15;:28::i;:::-;40950:7;;;;40085:4894;;;:::o;40875:93::-;40999:4;;-1:-1:-1;;;;;40999:4:0;;;40993:10;;;;40989:3622;;41020:19;41026:4;41032:6;41020:5;:19::i;40989:3622::-;41108:8;;-1:-1:-1;;;41108:8:0;;;;41107:9;:39;;;;-1:-1:-1;;;;;;41121:25:0;;;;;;:19;:25;;;;;;;;41120:26;41107:39;:67;;;;-1:-1:-1;;;;;;41151:23:0;;;;;;:19;:23;;;;;;;;41150:24;41107:67;41089:3522;;;-1:-1:-1;;;;;41218:29:0;;;41201:14;41218:29;;;:25;:29;;;;;;;41278:31;;;;;;;;41218:29;;;;;41278:31;41342:9;;:23;;;;;41356:9;41355:10;41342:23;41338:888;;;41386:33;41402:4;41408:2;41412:6;41386:15;:33::i;:::-;41438:15;;-1:-1:-1;;;;;41438:15:0;:26;41465:4;41471:15;41465:4;41471:9;:15::i;:::-;41438:49;;-1:-1:-1;;;;;;41438:49:0;;;;;;;-1:-1:-1;;;;;10406:32:1;;;41438:49:0;;;10388:51:1;10455:18;;;10448:34;10361:18;;41438:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41506:15:0;;-1:-1:-1;;;;;41506:15:0;;-1:-1:-1;41506:26:0;;-1:-1:-1;41533:2:0;41537:13;41533:2;41537:9;:13::i;:::-;41506:45;;-1:-1:-1;;;;;;41506:45:0;;;;;;;-1:-1:-1;;;;;10406:32:1;;;41506:45:0;;;10388:51:1;10455:18;;;10448:34;10361:18;;41506:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41338:888;;;41594:9;41590:636;;;41637:14;;41624:27;;41686:17;;41670:33;;41737:16;;41722:31;;41785:14;;41772:27;;41590:636;;;41827:8;41823:403;;;41869:13;;41856:26;;41917:16;;41901:32;;41967:15;;41952:30;;42014:13;;42001:26;;42048:32;42083:13;42093:2;42083:9;:13::i;:::-;42160:9;;42048:48;;-1:-1:-1;42123:33:0;42150:6;42048:48;42123:33;:::i;:::-;:46;;42115:95;;;;-1:-1:-1;;;42115:95:0;;19849:2:1;42115:95:0;;;19831:21:1;19888:2;19868:18;;;19861:30;19927:34;19907:18;;;19900:62;-1:-1:-1;;;19978:18:1;;;19971:34;20022:19;;42115:95:0;19647:400:1;42115:95:0;41837:389;41823:403;42240:17;42260:75;42324:10;42293:28;42308:13;42293:12;:28;:::i;:::-;:41;;;;:::i;:::-;42260:10;;:32;:75::i;:::-;42240:95;;42352:28;42383:24;42401:4;42383:9;:24::i;:::-;42463:18;;42352:55;;-1:-1:-1;42439:42:0;;;;;;;42502:43;;-1:-1:-1;;;;;;42514:31:0;;;;;;:25;:31;;;;;;;;42513:32;42502:43;42498:1251;;;42566:8;:15;;-1:-1:-1;;;;42566:15:0;-1:-1:-1;;;42566:15:0;;;42606:21;;42566:15;42606:21;:41;;;;;42646:1;42631:12;:16;42606:41;:61;;;;;42666:1;42651:12;;:16;42606:61;42602:903;;;42692:20;42715:25;42729:10;;42715:9;;:13;;:25;;;;:::i;:::-;42692:48;;42763:24;42790:105;42882:12;42790:61;42841:9;;42790:20;:50;;:61;;;;:::i;:105::-;42763:132;;42918:22;42943:106;43036:12;42943:62;42994:10;;42943:20;:50;;:62;;;;:::i;:106::-;42918:131;;43074:21;43098:104;43189:12;;43098:60;43145:12;43098:16;:46;;:60;;;;:::i;:104::-;43074:128;;43227:22;43252:103;43341:13;;43252:58;43297:12;43252:14;:44;;:58;;;;:::i;:103::-;43227:128;-1:-1:-1;43380:18:0;43401:33;43227:128;43420:13;43401:18;:33::i;:::-;43380:54;;43459:26;43474:10;43459:14;:26::i;:::-;42669:836;;;;;;42602:903;43525:24;43552;43570:4;43552:9;:24::i;:::-;43525:51;;43595:38;43616:16;43595:20;:38::i;:::-;-1:-1:-1;43664:1:0;43652:9;:13;;;43684:10;:14;43717:8;:16;;-1:-1:-1;;;;43717:16:0;;;42498:1251;43765:12;43780:32;43806:5;43780:21;:6;43791:9;43780:10;:21::i;:32::-;43765:47;-1:-1:-1;43838:16:0;:6;43765:47;43838:10;:16::i;:::-;43829:25;;43875:9;43871:155;;;43918:10;;:20;;43933:4;43918:14;:20::i;:::-;43905:10;:33;43871:155;;;43991:9;;:19;;44005:4;43991:13;:19::i;:::-;43979:9;:31;43871:155;44042:42;44058:4;44072;44079;44042:15;:42::i;:::-;44115:16;;44152:15;;:28;;-1:-1:-1;;;;;;44152:28:0;;;;;2499:25:1;;;-1:-1:-1;;;;;44152:15:0;;;;:23;;2472:18:1;;44152:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;44152:28:0;;;;;;;;-1:-1:-1;;44152:28:0;;;;;;;;;;;;:::i;:::-;;;44148:452;;;44344:231;;;12175:25:1;;;12231:2;12216:18;;12209:34;;;12259:18;;;12252:34;;;12317:2;12302:18;;12295:34;;;44547:9:0;;44494:4;;44344:231;;12162:3:1;12147:19;44344:231:0;;;;;;;44181:410;;;44148:452;41186:3425;;;;;;;41089:3522;44623:33;44639:4;44645:2;44649:6;44623:15;:33::i;:::-;44667:15;;-1:-1:-1;;;;;44667:15:0;:26;44694:4;44700:15;44694:4;44700:9;:15::i;:::-;44667:49;;-1:-1:-1;;;;;;44667:49:0;;;;;;;-1:-1:-1;;;;;10406:32:1;;;44667:49:0;;;10388:51:1;10455:18;;;10448:34;10361:18;;44667:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44727:15:0;;-1:-1:-1;;;;;44727:15:0;;-1:-1:-1;44727:26:0;;-1:-1:-1;44754:2:0;44758:13;44754:2;44758:9;:13::i;:::-;44727:45;;-1:-1:-1;;;;;;44727:45:0;;;;;;;-1:-1:-1;;;;;10406:32:1;;;44727:45:0;;;10388:51:1;10455:18;;;10448:34;10361:18;;44727:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44809:15:0;;-1:-1:-1;;;;;44793:32:0;;;44809:15;;44793:32;;;;-1:-1:-1;44793:32:0;-1:-1:-1;44793:68:0;;-1:-1:-1;;;;;;44830:31:0;;;;;;:25;:31;;;;;;;;44829:32;44793:68;:88;;;;-1:-1:-1;44871:10:0;;-1:-1:-1;;;;;44865:16:0;;;44871:10;;;;;44865:16;44793:88;44789:179;;;44912:10;;44898:58;;-1:-1:-1;;;44898:58:0;;;;;20226:25:1;;;-1:-1:-1;;;;;20287:32:1;;;20267:18;;;20260:60;44912:10:0;;;;;;;;44898:44;;20199:18:1;;44898:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40198:4781;;;;40085:4894;;;:::o;11147:226::-;11267:7;11303:12;11295:6;;;;11287:29;;;;-1:-1:-1;;;11287:29:0;;;;;;;;:::i;:::-;-1:-1:-1;11327:9:0;11339:5;11343:1;11339;:5;:::i;:::-;11327:17;11147:226;-1:-1:-1;;;;;11147:226:0:o;35232:280::-;-1:-1:-1;;;;;35315:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;35315:39:0;;;;;;;;;;;;35367:80;;35393:15;;:42;;-1:-1:-1;;;35393:42:0;;-1:-1:-1;;;;;178:32:1;;;35393:42:0;;;160:51:1;35393:15:0;;;;:36;;133:18:1;;35393:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35367:80;35464:40;;;;;;-1:-1:-1;;;;;35464:40:0;;;;;;;;35232:280;;:::o;11779:312::-;11899:7;11934:12;11927:5;11919:28;;;;-1:-1:-1;;;11919:28:0;;;;;;;;:::i;:::-;-1:-1:-1;11958:9:0;11970:5;11974:1;11970;:5;:::i;45475:499::-;45565:16;;;45579:1;45565:16;;;;;;;;45541:21;;45565:16;;;;;;;;;;-1:-1:-1;45565:16:0;45541:40;;45610:4;45592;45597:1;45592:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45592:23:0;;;:7;;;;;;;;;;:23;;;;45636:15;;:22;;;-1:-1:-1;;;45636:22:0;;;;:15;;;;;:20;;:22;;;;;45592:7;;45636:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45626:4;45631:1;45626:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45626:32:0;;;:7;;;;;;;;;:32;45701:15;;45669:62;;45686:4;;45701:15;45719:11;45669:8;:62::i;:::-;45742:15;;:224;;-1:-1:-1;;;45742:224:0;;-1:-1:-1;;;;;45742:15:0;;;;:66;;:224;;45823:11;;45742:15;;45893:4;;45920;;45940:15;;45742:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45530:444;45475:499;:::o;31405:327::-;-1:-1:-1;;;;;31528:34:0;;31502:4;31528:34;;;:25;:34;;;;;;;;:76;;;;-1:-1:-1;31588:15:0;;-1:-1:-1;;;;;31566:38:0;;;31588:15;;31566:38;;31528:76;31524:90;;;-1:-1:-1;31613:1:0;31606:8;;31524:90;-1:-1:-1;;;;;31643:37:0;;;;;;:25;:37;;;;;;;;31639:51;;;-1:-1:-1;31689:1:0;31682:8;;31639:51;-1:-1:-1;31723:1:0;31405:327;;;;:::o;9043:455::-;-1:-1:-1;;;;;9127:21:0;;9119:67;;;;-1:-1:-1;;;9119:67:0;;21651:2:1;9119:67:0;;;21633:21:1;21690:2;21670:18;;;21663:30;21729:34;21709:18;;;21702:62;-1:-1:-1;;;21780:18:1;;;21773:31;21821:19;;9119:67:0;21449:397:1;9119:67:0;9282:105;9319:6;9282:105;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9282:18:0;;:9;:18;;;;;;;;;;;;:105;:22;:105::i;:::-;-1:-1:-1;;;;;9261:18:0;;:9;:18;;;;;;;;;;:126;9413:12;;:24;;9430:6;9413:16;:24::i;:::-;9398:12;:39;9453:37;;2499:25:1;;;9479:1:0;;-1:-1:-1;;;;;9453:37:0;;;;;2487:2:1;2472:18;9453:37:0;;;;;;;9043:455;;:::o;44987:480::-;45046:12;45061:13;:6;45072:1;45061:10;:13::i;:::-;45046:28;-1:-1:-1;45085:17:0;45105:16;:6;45046:28;45105:10;:16::i;:::-;45085:36;-1:-1:-1;45157:21:0;45189:22;45206:4;45189:16;:22::i;:::-;45292:18;45313:41;:21;45339:14;45313:25;:41::i;:::-;45292:62;;45365:35;45378:9;45389:10;45365:12;:35::i;:::-;45416:43;;;22053:25:1;;;22109:2;22094:18;;22087:34;;;22137:18;;;22130:34;;;45416:43:0;;22041:2:1;22026:18;45416:43:0;;;;;;;45035:432;;;;44987:480;:::o;46644:519::-;46824:15;;46792:62;;46809:4;;-1:-1:-1;;;;;46824:15:0;46842:11;46792:8;:62::i;:::-;46897:15;;47109:4;;46897:258;;-1:-1:-1;;;46897:258:0;;46969:4;46897:258;;;22516:34:1;22566:18;;;22559:34;;;46897:15:0;22609:18:1;;;22602:34;;;22652:18;;;22645:34;-1:-1:-1;;;;;47109:4:0;;;22695:19:1;;;22688:44;47129:15:0;22748:19:1;;;22741:35;46897:15:0;;;:31;;46936:9;;22450:19:1;;46897:258: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:548::-;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;;;691:3;876:1;871:2;862:6;851:9;847:22;843:31;836:42;946:2;939;935:7;930:2;922:6;918:15;914:29;903:9;899:45;895:54;887:62;;;;407:548;;;;:::o;960:131::-;-1:-1:-1;;;;;1035:31:1;;1025:42;;1015:70;;1081:1;1078;1071:12;1096:118;1182:5;1175:13;1168:21;1161:5;1158:32;1148:60;;1204:1;1201;1194:12;1219:382;1284:6;1292;1345:2;1333:9;1324:7;1320:23;1316:32;1313:52;;;1361:1;1358;1351:12;1313:52;1400:9;1387:23;1419:31;1444:5;1419:31;:::i;:::-;1469:5;-1:-1:-1;1526:2:1;1511:18;;1498:32;1539:30;1498:32;1539:30;:::i;:::-;1588:7;1578:17;;;1219:382;;;;;:::o;1606:315::-;1674:6;1682;1735:2;1723:9;1714:7;1710:23;1706:32;1703:52;;;1751:1;1748;1741:12;1703:52;1790:9;1777:23;1809:31;1834:5;1809:31;:::i;:::-;1859:5;1911:2;1896:18;;;;1883:32;;-1:-1:-1;;;1606:315:1:o;2535:247::-;2594:6;2647:2;2635:9;2626:7;2622:23;2618:32;2615:52;;;2663:1;2660;2653:12;2615:52;2702:9;2689:23;2721:31;2746:5;2721:31;:::i;2787:127::-;2848:10;2843:3;2839:20;2836:1;2829:31;2879:4;2876:1;2869:15;2903:4;2900:1;2893:15;2919:275;2990:2;2984:9;3055:2;3036:13;;-1:-1:-1;;3032:27:1;3020:40;;3090:18;3075:34;;3111:22;;;3072:62;3069:88;;;3137:18;;:::i;:::-;3173:2;3166:22;2919:275;;-1:-1:-1;2919:275:1:o;3199:183::-;3259:4;3292:18;3284:6;3281:30;3278:56;;;3314:18;;:::i;:::-;-1:-1:-1;3359:1:1;3355:14;3371:4;3351:25;;3199:183::o;3387:662::-;3441:5;3494:3;3487:4;3479:6;3475:17;3471:27;3461:55;;3512:1;3509;3502:12;3461:55;3548:6;3535:20;3574:4;3598:60;3614:43;3654:2;3614:43;:::i;:::-;3598:60;:::i;:::-;3692:15;;;3778:1;3774:10;;;;3762:23;;3758:32;;;3723:12;;;;3802:15;;;3799:35;;;3830:1;3827;3820:12;3799:35;3866:2;3858:6;3854:15;3878:142;3894:6;3889:3;3886:15;3878:142;;;3960:17;;3948:30;;3998:12;;;;3911;;3878:142;;;-1:-1:-1;4038:5:1;3387:662;-1:-1:-1;;;;;;3387:662:1:o;4054:1215::-;4172:6;4180;4233:2;4221:9;4212:7;4208:23;4204:32;4201:52;;;4249:1;4246;4239:12;4201:52;4289:9;4276:23;4318:18;4359:2;4351:6;4348:14;4345:34;;;4375:1;4372;4365:12;4345:34;4413:6;4402:9;4398:22;4388:32;;4458:7;4451:4;4447:2;4443:13;4439:27;4429:55;;4480:1;4477;4470:12;4429:55;4516:2;4503:16;4538:4;4562:60;4578:43;4618:2;4578:43;:::i;4562:60::-;4656:15;;;4738:1;4734:10;;;;4726:19;;4722:28;;;4687:12;;;;4762:19;;;4759:39;;;4794:1;4791;4784:12;4759:39;4818:11;;;;4838:217;4854:6;4849:3;4846:15;4838:217;;;4934:3;4921:17;4951:31;4976:5;4951:31;:::i;:::-;4995:18;;4871:12;;;;5033;;;;4838:217;;;5074:5;-1:-1:-1;;5117:18:1;;5104:32;;-1:-1:-1;;5148:16:1;;;5145:36;;;5177:1;5174;5167:12;5145:36;;5200:63;5255:7;5244:8;5233:9;5229:24;5200:63;:::i;:::-;5190:73;;;4054:1215;;;;;:::o;5274:456::-;5351:6;5359;5367;5420:2;5408:9;5399:7;5395:23;5391:32;5388:52;;;5436:1;5433;5426:12;5388:52;5475:9;5462:23;5494:31;5519:5;5494:31;:::i;:::-;5544:5;-1:-1:-1;5601:2:1;5586:18;;5573:32;5614:33;5573:32;5614:33;:::i;:::-;5274:456;;5666:7;;-1:-1:-1;;;5720:2:1;5705:18;;;;5692:32;;5274:456::o;6170:241::-;6226:6;6279:2;6267:9;6258:7;6254:23;6250:32;6247:52;;;6295:1;6292;6285:12;6247:52;6334:9;6321:23;6353:28;6375:5;6353:28;:::i;7202:388::-;7270:6;7278;7331:2;7319:9;7310:7;7306:23;7302:32;7299:52;;;7347:1;7344;7337:12;7299:52;7386:9;7373:23;7405:31;7430:5;7405:31;:::i;:::-;7455:5;-1:-1:-1;7512:2:1;7497:18;;7484:32;7525:33;7484:32;7525:33;:::i;7595:661::-;7717:6;7725;7733;7741;7749;7757;7765;7773;7826:3;7814:9;7805:7;7801:23;7797:33;7794:53;;;7843:1;7840;7833:12;7794:53;-1:-1:-1;;7866:23:1;;;7936:2;7921:18;;7908:32;;-1:-1:-1;7987:2:1;7972:18;;7959:32;;8038:2;8023:18;;8010:32;;-1:-1:-1;8089:3:1;8074:19;;8061:33;;-1:-1:-1;8141:3:1;8126:19;;8113:33;;-1:-1:-1;8193:3:1;8178:19;;8165:33;;-1:-1:-1;8245:3:1;8230:19;8217:33;;-1:-1:-1;7595:661:1;-1:-1:-1;7595:661:1:o;8261:356::-;8463:2;8445:21;;;8482:18;;;8475:30;8541:34;8536:2;8521:18;;8514:62;8608:2;8593:18;;8261:356::o;8622:127::-;8683:10;8678:3;8674:20;8671:1;8664:31;8714:4;8711:1;8704:15;8738:4;8735:1;8728:15;8754:168;8827:9;;;8858;;8875:15;;;8869:22;;8855:37;8845:71;;8896:18;;:::i;8927:380::-;9006:1;9002:12;;;;9049;;;9070:61;;9124:4;9116:6;9112:17;9102:27;;9070:61;9177:2;9169:6;9166:14;9146:18;9143:38;9140:161;;9223:10;9218:3;9214:20;9211:1;9204:31;9258:4;9255:1;9248:15;9286:4;9283:1;9276:15;9140:161;;8927:380;;;:::o;10074:127::-;10135:10;10130:3;10126:20;10123:1;10116:31;10166:4;10163:1;10156:15;10190:4;10187:1;10180:15;10493:135;10532:3;10553:17;;;10550:43;;10573:18;;:::i;:::-;-1:-1:-1;10620:1:1;10609:13;;10493:135::o;10633:251::-;10703:6;10756:2;10744:9;10735:7;10731:23;10727:32;10724:52;;;10772:1;10769;10762:12;10724:52;10804:9;10798:16;10823:31;10848:5;10823:31;:::i;10889:184::-;10959:6;11012:2;11000:9;10991:7;10987:23;10983:32;10980:52;;;11028:1;11025;11018:12;10980:52;-1:-1:-1;11051:16:1;;10889:184;-1:-1:-1;10889:184:1:o;11383:245::-;11450:6;11503:2;11491:9;11482:7;11478:23;11474:32;11471:52;;;11519:1;11516;11509:12;11471:52;11551:9;11545:16;11570:28;11592:5;11570:28;:::i;11633:306::-;11721:6;11729;11737;11790:2;11778:9;11769:7;11765:23;11761:32;11758:52;;;11806:1;11803;11796:12;11758:52;11835:9;11829:16;11819:26;;11885:2;11874:9;11870:18;11864:25;11854:35;;11929:2;11918:9;11914:18;11908:25;11898:35;;11633:306;;;;;:::o;12916:557::-;13029:6;13037;13045;13053;13061;13069;13122:3;13110:9;13101:7;13097:23;13093:33;13090:53;;;13139:1;13136;13129:12;13090:53;13171:9;13165:16;13190:31;13215:5;13190:31;:::i;:::-;13285:2;13270:18;;13264:25;13329:2;13314:18;;13308:25;13373:2;13358:18;;13352:25;13417:3;13402:19;;13396:26;13462:3;13447:19;;;13441:26;13240:5;;13264:25;;-1:-1:-1;13308:25:1;;13352;;-1:-1:-1;13396:26:1;-1:-1:-1;13441:26:1;;-1:-1:-1;12916:557:1;-1:-1:-1;;;12916:557:1:o;14977:217::-;15017:1;15043;15033:132;;15087:10;15082:3;15078:20;15075:1;15068:31;15122:4;15119:1;15112:15;15150:4;15147:1;15140:15;15033:132;-1:-1:-1;15179:9:1;;14977:217::o;15610:125::-;15675:9;;;15696:10;;;15693:36;;;15709:18;;:::i;17850:401::-;18052:2;18034:21;;;18091:2;18071:18;;;18064:30;18130:34;18125:2;18110:18;;18103:62;-1:-1:-1;;;18196:2:1;18181:18;;18174:35;18241:3;18226:19;;17850:401::o;18256:399::-;18458:2;18440:21;;;18497:2;18477:18;;;18470:30;18536:34;18531:2;18516:18;;18509:62;-1:-1:-1;;;18602:2:1;18587:18;;18580:33;18645:3;18630:19;;18256:399::o;20331:128::-;20398:9;;;20419:11;;;20416:37;;;20433:18;;:::i;20464:980::-;20726:4;20774:3;20763:9;20759:19;20805:6;20794:9;20787:25;20831:2;20869:6;20864:2;20853:9;20849:18;20842:34;20912:3;20907:2;20896:9;20892:18;20885:31;20936:6;20971;20965:13;21002:6;20994;20987:22;21040:3;21029:9;21025:19;21018:26;;21079:2;21071:6;21067:15;21053:29;;21100:1;21110:195;21124:6;21121:1;21118:13;21110:195;;;21189:13;;-1:-1:-1;;;;;21185:39:1;21173:52;;21280:15;;;;21245:12;;;;21221:1;21139:9;21110:195;;;-1:-1:-1;;;;;;;21361:32:1;;;;21356:2;21341:18;;21334:60;-1:-1:-1;;;21425:3:1;21410:19;21403:35;21322:3;20464:980;-1:-1:-1;;;20464:980:1:o

Swarm Source

ipfs://bc5316a2ebbac12df20c0e7ffb027c4da9094d1092a6e27730b596a169fbc3a9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.