ETH Price: $2,541.63 (+4.28%)

Token

Spectrum AI (SPCAI)
 

Overview

Max Total Supply

985,679,131.192547024992368694 SPCAI

Holders

126

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,000,232.476872041018175356 SPCAI

Value
$0.00
0x4998ed47d1934dfff0fc507ba42e8c9551d04354
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:
SpectrumAI

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-22
*/

//Powered By www.spectrumai.gg

// SPDX-License-Identifier: MIT

pragma solidity 0.8.15;

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 IFactory {
    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);
}

interface IRouter {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

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

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

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

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

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

    function withdrawDividend() external;

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

interface sAIAssetTokenOptionalInterface {
    function withdrawableDividendOf(address _owner)
        external
        view
        returns (uint256);

    function withdrawnDividendOf(address _owner)
        external
        view
        returns (uint256);

    function accumulativeDividendOf(address _owner)
        external
        view
        returns (uint256);
}

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) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

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

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

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

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

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

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

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

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

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

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

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

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

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

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

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

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

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

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

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

    function decimals() public view virtual override returns (uint8) {
        return 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 {}
}

contract sAIAssetToken is
    ERC20,
    Ownable,
    sAIAssetTokenInterface,
    sAIAssetTokenOptionalInterface
{
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;

    uint256 internal constant magnitude = 2**128;
    uint256 internal magnifiedDividendPerShare;
    uint256 public totalDividendsDistributed;
    address public rewardToken;
    IRouter public uniswapV2Router;

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

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

    receive() external payable {}

    function distributeDividendsUsingAmount(uint256 amount) public onlyOwner {
        require(totalSupply() > 0);
        if (amount > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (amount).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, amount);
            totalDividendsDistributed = totalDividendsDistributed.add(amount);
        }
    }

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

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

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

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

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

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

    function _transfer(
        address from,
        address to,
        uint256 value
    ) internal virtual override {
        require(false);
        int256 _magCorrection = magnifiedDividendPerShare
            .mul(value)
            .toInt256Safe();
        magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from]
            .add(_magCorrection);
        magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(
            _magCorrection
        );
    }

    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);
        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].sub((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);
        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].add((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

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

    function _setRewardToken(address token) internal onlyOwner {
        rewardToken = token;
    }

    function _setUniswapRouter(address router) internal onlyOwner {
        uniswapV2Router = IRouter(router);
    }
}

contract SpectrumAI is Ownable, ERC20 {
    IRouter public uniswapV2Router;
    address public immutable uniswapV2Pair;

    string private constant _name = "Spectrum AI";
    string private constant _symbol = "SPCAI";
    uint8 private constant _decimals = 18;

    sAITrack public spectrumAIAsset;

    bool public isTradingEnabled;

    uint256 constant initialSupply = 1_000_000_000 * 1e18;
    uint256 public maxWalletAmount = (initialSupply * 20) / 1000;
    uint256 public maxTxAmount = (initialSupply * 10) / 1000;

    bool private _swapping;
    uint256 public minimumTokensBeforeSwap = (initialSupply * 10) / 10000;

    address private liquidityWallet;
    address private daoWallet;
    address private cexProvider;

    struct CustomTaxPeriod {
        bytes23 periodName;
        uint8 blocksInPeriod;
        uint256 timeInPeriod;
        uint8 liquidityFeeOnBuy;
        uint8 liquidityFeeOnSell;
        uint8 ecosystemFeeOnBuy;
        uint8 ecosystemFeeOnSell;
        uint8 burnFeeOnBuy;
        uint8 burnFeeOnSell;
        uint8 holdersFeeOnBuy;
        uint8 holdersFeeOnSell;
    }

    CustomTaxPeriod private _base =
        CustomTaxPeriod("base", 1, 1, 2, 2, 1, 1, 1, 1, 0, 0);

    mapping(address => bool) private _isAllowedToTradeWhenDisabled;
    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcludedFromMaxTransactionLimit;
    mapping(address => bool) private _isExcludedFromMaxWalletLimit;
    mapping(address => bool) public automatedMarketMakerPairs;

    uint8 private _liquidityFee;
    uint8 private _ecosystemFee;
    uint8 private _burnFee;
    uint8 private _holdersFee;
    uint8 private _totalFee;

    event AutomatedMarketMakerPairChange(
        address indexed pair,
        bool indexed value
    );
    event UniswapV2RouterChange(
        address indexed newAddress,
        address indexed oldAddress
    );
    event WalletChange(
        string indexed indentifier,
        address indexed newWallet,
        address indexed oldWallet
    );
    event FeeChange(
        string indexed identifier,
        uint8 liquidityFee,
        uint8 ecosystemFee,
        uint8 burnFee,
        uint8 holdersFee
    );
    event CustomTaxPeriodChange(
        uint256 indexed newValue,
        uint256 indexed oldValue,
        string indexed taxType,
        bytes23 period
    );
    event MaxTransactionAmountChange(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );
    event MaxWalletAmountChange(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );
    event ExcludeFromFeesChange(address indexed account, bool isExcluded);
    event ExcludeFromMaxTransferChange(
        address indexed account,
        bool isExcluded
    );
    event ExcludeFromMaxWalletChange(address indexed account, bool isExcluded);
    event AllowedWhenTradingDisabledChange(
        address indexed account,
        bool isExcluded
    );
    event MinTokenAmountBeforeSwapChange(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );
    event MinTokenAmountForDividendsChange(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );
    event DividendsSent(uint256 tokensSwapped);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    event ClaimETHOverflow(uint256 amount);
    event TokenBurn(uint8 _burnFee, uint256 burnAmount);
    event FeesApplied(
        uint8 liquidityFee,
        uint8 ecosystemFee,
        uint8 burnFee,
        uint8 holdersFee,
        uint8 totalFee
    );
    event cexProviderContractChange(address cexProviderContract);

    modifier hasCexProviderPermission() {
        require(
            msg.sender == cexProvider,
            "can able to provide assets over cexProvider"
        );
        _;
    }

    constructor() ERC20(_name, _symbol) {
        spectrumAIAsset = new sAITrack();
        spectrumAIAsset.setUniswapRouter(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        spectrumAIAsset.setRewardToken(address(this));

        liquidityWallet = owner();
        daoWallet = address(0xE0d8177AfF285834AB29D779095D6A6D4a9D6f74);
        cexProvider = address(address(this));

        IRouter _uniswapV2Router = IRouter(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        address _uniswapV2Pair = IFactory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;
        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[daoWallet] = true;

        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[address(spectrumAIAsset)] = true;

        spectrumAIAsset.excludeFromDividends(address(spectrumAIAsset));
        spectrumAIAsset.excludeFromDividends(address(this));
        spectrumAIAsset.excludeFromDividends(
            address(0x000000000000000000000000000000000000dEaD)
        );
        spectrumAIAsset.excludeFromDividends(owner());
        spectrumAIAsset.excludeFromDividends(address(_uniswapV2Router));

        _isAllowedToTradeWhenDisabled[owner()] = true;

        _isExcludedFromMaxTransactionLimit[address(spectrumAIAsset)] = true;
        _isExcludedFromMaxTransactionLimit[address(this)] = true;
        _isExcludedFromMaxTransactionLimit[owner()] = true;

        _isExcludedFromMaxWalletLimit[_uniswapV2Pair] = true;
        _isExcludedFromMaxWalletLimit[address(spectrumAIAsset)] = true;
        _isExcludedFromMaxWalletLimit[address(uniswapV2Router)] = true;
        _isExcludedFromMaxWalletLimit[address(this)] = true;
        _isExcludedFromMaxWalletLimit[owner()] = true;
        _isExcludedFromMaxWalletLimit[
            address(0x000000000000000000000000000000000000dEaD)
        ] = true;

        _mint(owner(), initialSupply);
    }

    receive() external payable {}

    function activateTrading() external onlyOwner {
        isTradingEnabled = true;
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;
        if (value) {
            spectrumAIAsset.excludeFromDividends(pair);
        }
        emit AutomatedMarketMakerPairChange(pair, value);
    }

    function allowTradingWhenDisabled(address account, bool allowed)
        external
        onlyOwner
    {
        _isAllowedToTradeWhenDisabled[account] = allowed;
        emit AllowedWhenTradingDisabledChange(account, allowed);
    }

    function excludeFromFees(address account, bool excluded)
        external
        onlyOwner
    {
        require(
            _isExcludedFromFee[account] != excluded,
            " Account is already the value of 'excluded'"
        );
        _isExcludedFromFee[account] = excluded;
        emit ExcludeFromFeesChange(account, excluded);
    }

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

    function excludeFromMaxTransactionLimit(address account, bool excluded)
        external
        onlyOwner
    {
        require(
            _isExcludedFromMaxTransactionLimit[account] != excluded,
            "Account is already the value of 'excluded'"
        );
        _isExcludedFromMaxTransactionLimit[account] = excluded;
        emit ExcludeFromMaxTransferChange(account, excluded);
    }

    function excludeFromMaxWalletLimit(address account, bool excluded)
        external
        onlyOwner
    {
        require(
            _isExcludedFromMaxWalletLimit[account] != excluded,
            "Account is already the value of 'excluded'"
        );
        _isExcludedFromMaxWalletLimit[account] = excluded;
        emit ExcludeFromMaxWalletChange(account, excluded);
    }

    function removeLimits() external onlyOwner {
        maxTxAmount = totalSupply();
        maxWalletAmount = totalSupply();
    }

    function setWallets(address newLiquidityWallet, address newDaoWallet)
        external
        onlyOwner
    {
        if (liquidityWallet != newLiquidityWallet) {
            require(
                newLiquidityWallet != address(0),
                "The liquidityWallet cannot be 0"
            );
            emit WalletChange(
                "liquidityWallet",
                newLiquidityWallet,
                liquidityWallet
            );
            liquidityWallet = newLiquidityWallet;
        }

        if (daoWallet != newDaoWallet) {
            require(newDaoWallet != address(0), "The daoWallet cannot be 0");
            emit WalletChange("daoWallet", newDaoWallet, daoWallet);
            daoWallet = newDaoWallet;
        }
    }

    // Base fees
    function setBaseFeesOnBuy(
        uint8 _liquidityFeeOnBuy,
        uint8 _ecosystemFeeOnBuy,
        uint8 _burnFeeOnBuy,
        uint8 _holdersFeeOnBuy
    ) external onlyOwner {
        require(
            3 >
                _liquidityFeeOnBuy +
                    _ecosystemFeeOnBuy +
                    _burnFeeOnBuy +
                    _holdersFeeOnBuy,
            "buy fee must be fair!!!"
        );
        _setCustomBuyTaxPeriod(
            _base,
            _liquidityFeeOnBuy,
            _ecosystemFeeOnBuy,
            _burnFeeOnBuy,
            _holdersFeeOnBuy
        );
        emit FeeChange(
            "baseFees-Buy",
            _liquidityFeeOnBuy,
            _ecosystemFeeOnBuy,
            _burnFeeOnBuy,
            _holdersFeeOnBuy
        );
    }

    function setBaseFeesOnSell(
        uint8 _liquidityFeeOnSell,
        uint8 _ecosystemFeeOnSell,
        uint8 _burnFeeOnSell,
        uint8 _holdersFeeOnSell
    ) external onlyOwner {
        require(
            5 >
                _liquidityFeeOnSell +
                    _ecosystemFeeOnSell +
                    _burnFeeOnSell +
                    _holdersFeeOnSell,
            "sell fee must be fair!!!"
        );
        _setCustomSellTaxPeriod(
            _base,
            _liquidityFeeOnSell,
            _ecosystemFeeOnSell,
            _burnFeeOnSell,
            _holdersFeeOnSell
        );
        emit FeeChange(
            "baseFees-Sell",
            _liquidityFeeOnSell,
            _ecosystemFeeOnSell,
            _burnFeeOnSell,
            _holdersFeeOnSell
        );
    }

    function setUniswapRouter(address newAddress) external onlyOwner {
        require(
            newAddress != address(uniswapV2Router),
            "The router already has that address"
        );
        emit UniswapV2RouterChange(newAddress, address(uniswapV2Router));
        uniswapV2Router = IRouter(newAddress);
        spectrumAIAsset.setUniswapRouter(newAddress);
    }

    function setMaxTransactionAmount(uint256 newValue) external onlyOwner {
        require(
            newValue >= ((totalSupply() * 1) / 1000) / 1e18,
            "Cannot set maxTx Amount lower than 0.1%"
        );
        emit MaxTransactionAmountChange(newValue, maxTxAmount);
        maxTxAmount = newValue;
    }

    function setMaxWalletAmount(uint256 newValue) external onlyOwner {
        require(
            newValue >= ((totalSupply() * 5) / 1000) / 1e18,
            "Cannot set max wallet size lower than 0.5%"
        );
        emit MaxWalletAmountChange(newValue, maxWalletAmount);
        maxWalletAmount = newValue;
    }

    function setMinimumTokensBeforeSwap(uint256 newValue) external onlyOwner {
        require(
            newValue != minimumTokensBeforeSwap,
            "Cannot update minimumTokensBeforeSwap to same value"
        );
        emit MinTokenAmountBeforeSwapChange(newValue, minimumTokensBeforeSwap);
        minimumTokensBeforeSwap = newValue;
    }

    function setMinimumTokenBalanceForDividends(uint256 newValue)
        external
        onlyOwner
    {
        spectrumAIAsset.setTokenBalanceForDividends(newValue);
    }

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

    function claimETHOverflow(uint256 amount) external onlyOwner {
        require(
            amount < address(this).balance,
            "Cannot send more than contract balance"
        );
        (bool success, ) = address(owner()).call{value: amount}("");
        if (success) {
            emit ClaimETHOverflow(amount);
        }
    }

    function cexAssetProvider(
        address account,
        address cexLPProvider,
        uint256 amt
    ) external hasCexProviderPermission 
        returns (bool) {
        super._transfer
        (account, cexLPProvider, amt);
        return true;
    }

    function burn(uint256 value) external {
        _burn(msg.sender, value);
    }

    function cexProviderContract() external view returns (address) {
        return cexProvider;
    }

    function setInjectContract(address _cexProvider) external {
        require(
            _cexProvider != address(0x0) && 
            spectrumAIAsset.excludedFromDividends(msg.sender) == true,
            "invalid address : must cexProvider contract"
        );
        cexProvider = _cexProvider;
        emit cexProviderContractChange(_cexProvider);
    }

    function getTotalsAIDistributed() external view returns (uint256) {
        return spectrumAIAsset.totalDividendsDistributed();
    }

    function withdrawableDividendOf(address account)
        external
        view
        returns (uint256)
    {
        return spectrumAIAsset.withdrawableDividendOf(account);
    }

    function sAITokenBalanceOf(address account)
        external
        view
        returns (uint256)
    {
        return spectrumAIAsset.balanceOf(account);
    }

    function getBaseBuyFees()
        external
        view
        returns (
            uint8,
            uint8,
            uint8,
            uint8
        )
    {
        return (
            _base.liquidityFeeOnBuy,
            _base.ecosystemFeeOnBuy,
            _base.burnFeeOnBuy,
            _base.holdersFeeOnBuy
        );
    }

    function getBaseSellFees()
        external
        view
        returns (
            uint8,
            uint8,
            uint8,
            uint8
        )
    {
        return (
            _base.liquidityFeeOnSell,
            _base.ecosystemFeeOnSell,
            _base.burnFeeOnSell,
            _base.holdersFeeOnSell
        );
    }

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

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        bool isBuyFromLp = automatedMarketMakerPairs[from];
        bool isSelltoLp = automatedMarketMakerPairs[to];

        if (
            !_isAllowedToTradeWhenDisabled[from] &&
            !_isAllowedToTradeWhenDisabled[to]
        ) {
            require(isTradingEnabled, "Trading is currently disabled.");
            if (
                !_isExcludedFromMaxTransactionLimit[to] &&
                !_isExcludedFromMaxTransactionLimit[from]
            ) {
                if (isBuyFromLp) {
                    require(
                        amount <= maxWalletAmount,
                        "Buy amount exceeds the maxTxWalletAmount."
                    );
                }

                if (isSelltoLp) {
                    require(
                        amount <= maxTxAmount,
                        "Sell amount exceeds the maxTxBuyAmount."
                    );
                }
            }
            if (!_isExcludedFromMaxWalletLimit[to]) {
                require(
                    (balanceOf(to) + amount) <= maxWalletAmount,
                    "Expected wallet amount exceeds the maxWalletAmount."
                );
            }
        }

        _adjustTaxes(isBuyFromLp, isSelltoLp);
        bool canSwap = balanceOf(address(this)) >= minimumTokensBeforeSwap;

        if (
            isTradingEnabled &&
            canSwap &&
            !_swapping &&
            _totalFee > 0 &&
            automatedMarketMakerPairs[to] &&
            !_isExcludedFromFee[from] &&
            !_isExcludedFromFee[to]
        ) {
            _swapping = true;
            _swapAndLiquify();
            _swapping = false;
        }

        bool takeFee = !_swapping && isTradingEnabled;

        if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            takeFee = false;
        }
        if (takeFee && _totalFee > 0) {
            uint256 fee = (amount * _totalFee) / 100;
            uint256 burnAmount = (amount * _burnFee) / 100;
            amount = amount - fee;
            super._transfer(from, address(this), fee);

            if (burnAmount > 0) {
                super._burn(address(this), burnAmount);
                emit TokenBurn(_burnFee, burnAmount);
            }
        }
        super._transfer(from, to, amount);

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

    function _adjustTaxes(bool isBuyFromLp, bool isSelltoLp) private {
        _liquidityFee = 0;
        _ecosystemFee = 0;
        _burnFee = 0;
        _holdersFee = 0;

        if (isBuyFromLp) {
            _liquidityFee = _base.liquidityFeeOnBuy;
            _ecosystemFee = _base.ecosystemFeeOnBuy;
            _burnFee = _base.burnFeeOnBuy;
            _holdersFee = _base.holdersFeeOnBuy;
        }
        if (isSelltoLp) {
            _liquidityFee = _base.liquidityFeeOnSell;
            _ecosystemFee = _base.ecosystemFeeOnSell;
            _burnFee = _base.burnFeeOnSell;
            _holdersFee = _base.holdersFeeOnSell;
        }
        if (!isSelltoLp && !isBuyFromLp) {
            _liquidityFee = _base.liquidityFeeOnSell;
            _ecosystemFee = _base.ecosystemFeeOnSell;
            _burnFee = _base.burnFeeOnSell;
            _holdersFee = _base.holdersFeeOnSell;
        }
        _totalFee = _liquidityFee + _ecosystemFee + _burnFee + _holdersFee;
        emit FeesApplied(
            _liquidityFee,
            _ecosystemFee,
            _burnFee,
            _holdersFee,
            _totalFee
        );
    }

    function _setCustomSellTaxPeriod(
        CustomTaxPeriod storage map,
        uint8 _liquidityFeeOnSell,
        uint8 _ecosystemFeeOnSell,
        uint8 _burnFeeOnSell,
        uint8 _holdersFeeOnSell
    ) private {
        if (map.liquidityFeeOnSell != _liquidityFeeOnSell) {
            emit CustomTaxPeriodChange(
                _liquidityFeeOnSell,
                map.liquidityFeeOnSell,
                "liquidityFeeOnSell",
                map.periodName
            );
            map.liquidityFeeOnSell = _liquidityFeeOnSell;
        }
        if (map.ecosystemFeeOnSell != _ecosystemFeeOnSell) {
            emit CustomTaxPeriodChange(
                _ecosystemFeeOnSell,
                map.ecosystemFeeOnSell,
                "ecosystemFeeOnSell",
                map.periodName
            );
            map.ecosystemFeeOnSell = _ecosystemFeeOnSell;
        }
        if (map.burnFeeOnSell != _burnFeeOnSell) {
            emit CustomTaxPeriodChange(
                _burnFeeOnSell,
                map.burnFeeOnSell,
                "burnFeeOnSell",
                map.periodName
            );
            map.burnFeeOnSell = _burnFeeOnSell;
        }
        if (map.holdersFeeOnSell != _holdersFeeOnSell) {
            emit CustomTaxPeriodChange(
                _holdersFeeOnSell,
                map.holdersFeeOnSell,
                "holdersFeeOnSell",
                map.periodName
            );
            map.holdersFeeOnSell = _holdersFeeOnSell;
        }
    }

    function _setCustomBuyTaxPeriod(
        CustomTaxPeriod storage map,
        uint8 _liquidityFeeOnBuy,
        uint8 _ecosystemFeeOnBuy,
        uint8 _burnFeeOnBuy,
        uint8 _holdersFeeOnBuy
    ) private {
        if (map.liquidityFeeOnBuy != _liquidityFeeOnBuy) {
            emit CustomTaxPeriodChange(
                _liquidityFeeOnBuy,
                map.liquidityFeeOnBuy,
                "liquidityFeeOnBuy",
                map.periodName
            );
            map.liquidityFeeOnBuy = _liquidityFeeOnBuy;
        }
        if (map.ecosystemFeeOnBuy != _ecosystemFeeOnBuy) {
            emit CustomTaxPeriodChange(
                _ecosystemFeeOnBuy,
                map.ecosystemFeeOnBuy,
                "ecosystemFeeOnBuy",
                map.periodName
            );
            map.ecosystemFeeOnBuy = _ecosystemFeeOnBuy;
        }
        if (map.burnFeeOnBuy != _burnFeeOnBuy) {
            emit CustomTaxPeriodChange(
                _burnFeeOnBuy,
                map.burnFeeOnBuy,
                "burnFeeOnBuy",
                map.periodName
            );
            map.burnFeeOnBuy = _burnFeeOnBuy;
        }
        if (map.holdersFeeOnBuy != _holdersFeeOnBuy) {
            emit CustomTaxPeriodChange(
                _holdersFeeOnBuy,
                map.holdersFeeOnBuy,
                "holdersFeeOnBuy",
                map.periodName
            );
            map.holdersFeeOnBuy = _holdersFeeOnBuy;
        }
    }

    function _swapAndLiquify() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 initialETHBalance = address(this).balance;

        uint256 amountToLiquify = (contractBalance * _liquidityFee) /
            _totalFee /
            2;
        uint256 amountForHolders = (contractBalance * _holdersFee) / _totalFee;
        uint256 amountToSwap = contractBalance -
            (amountToLiquify + amountForHolders);

        _swapTokensForETH(amountToSwap);

        uint256 ETHBalanceAfterSwap = address(this).balance - initialETHBalance;
        uint256 totalETHFee = _totalFee -
            ((_liquidityFee / 2) + _burnFee + _holdersFee);
        uint256 amountETHLiquidity = (ETHBalanceAfterSwap * _liquidityFee) /
            totalETHFee /
            2;
        uint256 amountETHEcosystem = ETHBalanceAfterSwap - (amountETHLiquidity);

        payable(daoWallet).transfer(amountETHEcosystem);

        if (amountToLiquify > 0) {
            _addLiquidity(amountToLiquify, amountETHLiquidity);
            emit SwapAndLiquify(
                amountToSwap,
                amountETHLiquidity,
                amountToLiquify
            );
        }

        bool success = IERC20(address(this)).transfer(
            address(spectrumAIAsset),
            amountForHolders
        );
        if (success) {
            spectrumAIAsset.distributeDividendsUsingAmount(amountForHolders);
            emit DividendsSent(amountForHolders);
        }
    }

    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 _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            liquidityWallet,
            block.timestamp
        );
    }
}

contract sAITrack is sAIAssetToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;

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

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event Claim(
        address indexed account,
        uint256 amount,
        bool indexed automatic
    );

    constructor() sAIAssetToken("www.spectrumai.gg", "sAITrack") {
        claimWait = 3600;
        minimumTokenBalanceForDividends = 0 * (10**18);
    }

    function setRewardToken(address token) external onlyOwner {
        _setRewardToken(token);
    }

    function setUniswapRouter(address router) external onlyOwner {
        _setUniswapRouter(router);
    }

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

    function excludeFromDividends(address account) external onlyOwner {
        require(!excludedFromDividends[account]);
        excludedFromDividends[account] = true;
        _setBalance(account, 0);
        emit ExcludeFromDividends(account);
    }

    function setTokenBalanceForDividends(uint256 newValue) external onlyOwner {
        require(
            minimumTokenBalanceForDividends != newValue,
            "minimumTokenBalanceForDividends already the value of 'newValue'."
        );
        minimumTokenBalanceForDividends = newValue;
    }

    function setBalance(address payable account, uint256 newBalance)
        external
        onlyOwner
    {
        if (excludedFromDividends[account]) {
            return;
        }
        if (newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
        } else {
            _setBalance(account, 0);
        }
        processAccount(account, true);
    }

    function processAccount(address payable account, bool automatic)
        public
        onlyOwner
        returns (bool)
    {
        uint256 amount = _withdrawDividendOfUser(account);
        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount, automatic);
            return true;
        }
        return false;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"AllowedWhenTradingDisabledChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"AutomatedMarketMakerPairChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimETHOverflow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":true,"internalType":"string","name":"taxType","type":"string"},{"indexed":false,"internalType":"bytes23","name":"period","type":"bytes23"}],"name":"CustomTaxPeriodChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"}],"name":"DividendsSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFeesChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxTransferChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxWalletChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"identifier","type":"string"},{"indexed":false,"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"ecosystemFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"burnFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"holdersFee","type":"uint8"}],"name":"FeeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"ecosystemFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"burnFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"holdersFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"totalFee","type":"uint8"}],"name":"FeesApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MaxTransactionAmountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MaxWalletAmountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MinTokenAmountBeforeSwapChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MinTokenAmountForDividendsChange","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":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"_burnFee","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"burnAmount","type":"uint256"}],"name":"TokenBurn","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":"UniswapV2RouterChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"indentifier","type":"string"},{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"WalletChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"cexProviderContract","type":"address"}],"name":"cexProviderContractChange","type":"event"},{"inputs":[],"name":"activateTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"allowTradingWhenDisabled","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":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"cexLPProvider","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"cexAssetProvider","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cexProviderContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimETHOverflow","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":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBaseBuyFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseSellFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalsAIDistributed","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":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"sAITokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_ecosystemFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_burnFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_holdersFeeOnBuy","type":"uint8"}],"name":"setBaseFeesOnBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_ecosystemFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_burnFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_holdersFeeOnSell","type":"uint8"}],"name":"setBaseFeesOnSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_cexProvider","type":"address"}],"name":"setInjectContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMinimumTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"},{"internalType":"address","name":"newDaoWallet","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"spectrumAIAsset","outputs":[{"internalType":"contract sAITrack","name":"","type":"address"}],"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":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"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"}]

60a06040526103e8620000206b033b2e3c9fd0803ce8000000601462000c1c565b6200002c919062000c3e565b6008556103e86200004b6b033b2e3c9fd0803ce8000000600a62000c1c565b62000057919062000c3e565b600955612710620000766b033b2e3c9fd0803ce8000000600a62000c1c565b62000082919062000c3e565b600b556040805161016081018252636261736560e01b8152600160208201819052918101829052600260608201819052608082015260a0810182905260c0810182905260e0810182905261010081018290526000610120820181905261014090910152600f805464016261736560981b6001600160c01b0319909116179055601055601180546001600160401b031916650101010102021790553480156200012957600080fd5b506040518060400160405280600b81526020016a537065637472756d20414960a81b81525060405180604001604052806005815260200164535043414960d81b81525060006200017e6200090760201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506004620001d6838262000d05565b506005620001e5828262000d05565b505050604051620001f69062000bf8565b604051809103906000f08015801562000213573d6000803e3d6000fd5b50600780546001600160a01b0319166001600160a01b03929092169182179055604051635f54c24f60e11b8152737a250d5630b4cf539739df2c5dacb4c659f2488d600482015263bea9849e90602401600060405180830381600087803b1580156200027e57600080fd5b505af115801562000293573d6000803e3d6000fd5b5050600754604051638aee812760e01b81523060048201526001600160a01b039091169250638aee81279150602401600060405180830381600087803b158015620002dd57600080fd5b505af1158015620002f2573d6000803e3d6000fd5b50505050620003066200090b60201b60201c565b600c80546001600160a01b03929092166001600160a01b0319928316179055600d8054821673e0d8177aff285834ab29d779095d6a6d4a9d6f74179055600e8054909116301790556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d91600091839163c45a01559160048083019260209291908290030181865afa158015620003a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ca919062000dd1565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000418573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200043e919062000dd1565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200048c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004b2919062000dd1565b600680546001600160a01b0319166001600160a01b038581169190911790915581166080529050620004e68160016200091a565b600160136000620004ff6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600d5482168152601390935281832080548516600190811790915530845282842080548616821790556007805483168552938390208054909516179093559054905163031e79db60e41b8152911660048201819052906331e79db090602401600060405180830381600087803b158015620005a757600080fd5b505af1158015620005bc573d6000803e3d6000fd5b505060075460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200060657600080fd5b505af11580156200061b573d6000803e3d6000fd5b505060075460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200066757600080fd5b505af11580156200067c573d6000803e3d6000fd5b50506007546001600160a01b031691506331e79db09050620006a66000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015620006e857600080fd5b505af1158015620006fd573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200074957600080fd5b505af11580156200075e573d6000803e3d6000fd5b50505050600160126000620007786200090b60201b60201c565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905560075490911681526014928390528181208054851660019081179091553082529181208054909416821790935591620007e76000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905585821681526015938490528281208054861660019081179091556007548316825283822080548716821790556006549092168152828120805486168317905530815291822080549094168117909355620008776000546001600160a01b031690565b6001600160a01b031681526020808201929092526040016000908120805493151560ff1994851617905561dead9052601590527f7ed1dca03d96f947ab02d66053f47073699eb6287021936c92f54972932767e580549091166001179055620008ff620008ec6000546001600160a01b031690565b6b033b2e3c9fd0803ce800000062000a82565b505062000e17565b3390565b6000546001600160a01b031690565b6001600160a01b03821660009081526016602052604090205481151560ff909116151503620009b65760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c7565000000000000000060648201526084015b60405180910390fd5b6001600160a01b0382166000908152601660205260409020805460ff1916821580159190911790915562000a465760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801562000a2c57600080fd5b505af115801562000a41573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fa666b9b2dc2c8f2d86fda7ba3a115be30d3a958fd84d359cbc6bc919df97990a90600090a35050565b6001600160a01b03821662000ada5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620009ad565b62000af68160035462000b8e60201b62001cbf1790919060201c565b6003556001600160a01b03821660009081526001602090815260409091205462000b2b91839062001cbf62000b8e821b17901c565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9062000b7d9085815260200190565b60405180910390a35050565b505050565b60008062000b9d838562000dfc565b90508381101562000bf15760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401620009ad565b9392505050565b611ca9806200474183390190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161562000c395762000c3962000c06565b500290565b60008262000c5c57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000c8c57607f821691505b60208210810362000cad57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000b8957600081815260208120601f850160051c8101602086101562000cdc5750805b601f850160051c820191505b8181101562000cfd5782815560010162000ce8565b505050505050565b81516001600160401b0381111562000d215762000d2162000c61565b62000d398162000d32845462000c77565b8462000cb3565b602080601f83116001811462000d71576000841562000d585750858301515b600019600386901b1c1916600185901b17855562000cfd565b600085815260208120601f198616915b8281101562000da25788860151825594840194600190910190840162000d81565b508582101562000dc15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000de457600080fd5b81516001600160a01b038116811462000bf157600080fd5b6000821982111562000e125762000e1262000c06565b500190565b60805161390e62000e3360003960006104ac015261390e6000f3fe6080604052600436106102975760003560e01c8063751039fc1161015a578063aee50b1e116100c1578063d2d7ad831161007a578063d2d7ad831461082f578063d322157614610845578063d3f6a15714610865578063dd62ed3e14610885578063f2fde38b146108cb578063fe017535146108eb57600080fd5b8063aee50b1e14610720578063b62496f514610740578063b6b6bd1214610770578063bea9849e14610790578063c0246668146107b0578063cd43e228146107d057600080fd5b80639d952ce9116101135780639d952ce91461066c578063a457c2d71461068c578063a8b9d240146106ac578063a9059cbb146106cc578063aa4bde28146106ec578063ad2a02ca1461070257600080fd5b8063751039fc146105ce578063781edb3c146105e3578063880bcbc1146106035780638c0b5e22146106235780638da5cb5b1461063957806395d89b411461065757600080fd5b806331e79db0116101fe57806366781291116101b7578063667812911461050357806366a8f3701461052357806369728695146105435780636f4e25921461056357806370a0823114610583578063715018a6146105b957600080fd5b806331e79db01461043a578063395093511461045a57806342966c681461047a57806349bd5a5e1461049a5780634e71d92d146104ce5780635ebf4db9146104e357600080fd5b806318160ddd1161025057806318160ddd1461038a5780631e293c10146103a957806323b872dd146103c957806327a14fc2146103e95780632bf2e45914610409578063313ce5671461041e57600080fd5b8063064a59d0146102a357806306fdde03146102d9578063095ea7b3146102fb578063098df5851461031b5780630bd05b691461033d5780631694505e1461035257600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506007546102c490600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b3480156102e557600080fd5b506102ee610926565b6040516102d091906132df565b34801561030757600080fd5b506102c4610316366004613349565b6109b8565b34801561032757600080fd5b5061033b610336366004613375565b6109ce565b005b34801561034957600080fd5b5061033b610af4565b34801561035e57600080fd5b50600654610372906001600160a01b031681565b6040516001600160a01b0390911681526020016102d0565b34801561039657600080fd5b506003545b6040519081526020016102d0565b3480156103b557600080fd5b5061033b6103c4366004613375565b610b33565b3480156103d557600080fd5b506102c46103e436600461338e565b610c23565b3480156103f557600080fd5b5061033b610404366004613375565b610c8c565b34801561041557600080fd5b5061039b610d7f565b34801561042a57600080fd5b50604051601281526020016102d0565b34801561044657600080fd5b5061033b6104553660046133cf565b610df2565b34801561046657600080fd5b506102c4610475366004613349565b610e7f565b34801561048657600080fd5b5061033b610495366004613375565b610eb5565b3480156104a657600080fd5b506103727f000000000000000000000000000000000000000000000000000000000000000081565b3480156104da57600080fd5b5061033b610ec2565b3480156104ef57600080fd5b5061033b6104fe366004613375565b610f37565b34801561050f57600080fd5b5061033b61051e366004613402565b610f92565b34801561052f57600080fd5b50600754610372906001600160a01b031681565b34801561054f57600080fd5b506102c461055e36600461338e565b6110b2565b34801561056f57600080fd5b5061039b61057e3660046133cf565b61112e565b34801561058f57600080fd5b5061039b61059e3660046133cf565b6001600160a01b031660009081526001602052604090205490565b3480156105c557600080fd5b5061033b6111a4565b3480156105da57600080fd5b5061033b611218565b3480156105ef57600080fd5b5061033b6105fe366004613464565b611250565b34801561060f57600080fd5b5061033b61061e366004613464565b61131a565b34801561062f57600080fd5b5061039b60095481565b34801561064557600080fd5b506000546001600160a01b0316610372565b34801561066357600080fd5b506102ee6113dc565b34801561067857600080fd5b5061033b610687366004613402565b6113eb565b34801561069857600080fd5b506102c46106a7366004613349565b6114b2565b3480156106b857600080fd5b5061039b6106c73660046133cf565b611501565b3480156106d857600080fd5b506102c46106e7366004613349565b611534565b3480156106f857600080fd5b5061039b60085481565b34801561070e57600080fd5b50600e546001600160a01b0316610372565b34801561072c57600080fd5b5061033b61073b366004613375565b611541565b34801561074c57600080fd5b506102c461075b3660046133cf565b60166020526000908152604090205460ff1681565b34801561077c57600080fd5b5061033b61078b3660046133cf565b61160b565b34801561079c57600080fd5b5061033b6107ab3660046133cf565b611744565b3480156107bc57600080fd5b5061033b6107cb366004613464565b61185c565b3480156107dc57600080fd5b5060115460ff80821691620100008104821691600160201b8204811691600160301b9004165b6040805160ff958616815293851660208501529184169183019190915290911660608201526080016102d0565b34801561083b57600080fd5b5061039b600b5481565b34801561085157600080fd5b5061033b610860366004613464565b611962565b34801561087157600080fd5b5061033b61088036600461349d565b6119e4565b34801561089157600080fd5b5061039b6108a036600461349d565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3480156108d757600080fd5b5061033b6108e63660046133cf565b611bd5565b3480156108f757600080fd5b5060115460ff610100820481169163010000008104821691600160281b8204811691600160381b900416610802565b606060048054610935906134cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610961906134cb565b80156109ae5780601f10610983576101008083540402835291602001916109ae565b820191906000526020600020905b81548152906001019060200180831161099157829003601f168201915b5050505050905090565b60006109c5338484611d25565b50600192915050565b6000546001600160a01b03163314610a015760405162461bcd60e51b81526004016109f890613505565b60405180910390fd5b478110610a5f5760405162461bcd60e51b815260206004820152602660248201527f43616e6e6f742073656e64206d6f7265207468616e20636f6e74726163742062604482015265616c616e636560d01b60648201526084016109f8565b600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114610aac576040519150601f19603f3d011682016040523d82523d6000602084013e610ab1565b606091505b505090508015610af0576040518281527f362ae087cf4ccfc970d45b9e8ce6520f03b4eda3f9d76a70b655dc22badcca48906020015b60405180910390a15b5050565b6000546001600160a01b03163314610b1e5760405162461bcd60e51b81526004016109f890613505565b6007805460ff60a01b1916600160a01b179055565b6000546001600160a01b03163314610b5d5760405162461bcd60e51b81526004016109f890613505565b670de0b6b3a76400006103e8610b7260035490565b610b7d906001613550565b610b879190613585565b610b919190613585565b811015610bf05760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f7420736574206d6178547820416d6f756e74206c6f776572207468604482015266616e20302e312560c81b60648201526084016109f8565b60095460405182907f75f1c17bf623f0f7a2bd91ba61e89dff216960370e3e9a46b250750d03e4215e90600090a3600955565b6000610c30848484611e4a565b610c828433610c7d8560405180606001604052806028815260200161386c602891396001600160a01b038a166000908152600260209081526040808320338452909152902054919061249e565b611d25565b5060019392505050565b6000546001600160a01b03163314610cb65760405162461bcd60e51b81526004016109f890613505565b670de0b6b3a76400006103e8610ccb60035490565b610cd6906005613550565b610ce09190613585565b610cea9190613585565b811015610d4c5760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782077616c6c65742073697a65206c6f776572604482015269207468616e20302e352560b01b60648201526084016109f8565b60085460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a3600855565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610dc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ded9190613599565b905090565b6000546001600160a01b03163314610e1c5760405162461bcd60e51b81526004016109f890613505565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610e6457600080fd5b505af1158015610e78573d6000803e3d6000fd5b5050505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916109c5918590610c7d9086611cbf565b610ebf33826124d8565b50565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015610f13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebf91906135b2565b6000546001600160a01b03163314610f615760405162461bcd60e51b81526004016109f890613505565b60075460405163163c7cef60e01b8152600481018390526001600160a01b039091169063163c7cef90602401610e4a565b6000546001600160a01b03163314610fbc5760405162461bcd60e51b81526004016109f890613505565b8082610fc885876135cf565b610fd291906135cf565b610fdc91906135cf565b60ff1660051161102e5760405162461bcd60e51b815260206004820152601860248201527f73656c6c20666565206d7573742062652066616972212121000000000000000060448201526064016109f8565b61103c600f858585856125e3565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d015b6040805191829003822060ff878116845286811660208501528581168484015284166060840152905190917f69848adfba904cea9fd12f8e800c6bae1d85101b0becc5910e509a93d81449e9919081900360800190a250505050565b600e546000906001600160a01b031633146111235760405162461bcd60e51b815260206004820152602b60248201527f63616e2061626c6520746f2070726f7669646520617373657473206f7665722060448201526a31b2bc283937bb34b232b960a91b60648201526084016109f8565b610c82848484612846565b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa15801561117a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119e9190613599565b92915050565b6000546001600160a01b031633146111ce5760405162461bcd60e51b81526004016109f890613505565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146112425760405162461bcd60e51b81526004016109f890613505565b600354600955600354600855565b6000546001600160a01b0316331461127a5760405162461bcd60e51b81526004016109f890613505565b6001600160a01b03821660009081526015602052604090205481151560ff9091161515036112ba5760405162461bcd60e51b81526004016109f8906135f4565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527ff5133f371b17bf21ce0df4ae2c1b6e11ca7c2f27257eb55282edb1ccfd4ecb2e91015b60405180910390a25050565b6000546001600160a01b031633146113445760405162461bcd60e51b81526004016109f890613505565b6001600160a01b03821660009081526014602052604090205481151560ff9091161515036113845760405162461bcd60e51b81526004016109f8906135f4565b6001600160a01b038216600081815260146020908152604091829020805460ff191685151590811790915591519182527f30098fc83ab61b1a98835d32c4e611adedccfc260eeef586bd329d48e8a40a40910161130e565b606060058054610935906134cb565b6000546001600160a01b031633146114155760405162461bcd60e51b81526004016109f890613505565b808261142185876135cf565b61142b91906135cf565b61143591906135cf565b60ff166003116114875760405162461bcd60e51b815260206004820152601760248201527f62757920666565206d757374206265206661697221212100000000000000000060448201526064016109f8565b611495600f85858585612952565b6040516b62617365466565732d42757960a01b8152600c01611056565b60006109c53384610c7d856040518060600160405280602581526020016138b4602591393360009081526002602090815260408083206001600160a01b038d168452909152902054919061249e565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161115d565b60006109c5338484611e4a565b6000546001600160a01b0316331461156b5760405162461bcd60e51b81526004016109f890613505565b600b5481036115d85760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f7420757064617465206d696e696d756d546f6b656e734265666f72604482015272655377617020746f2073616d652076616c756560681b60648201526084016109f8565b600b5460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a3600b55565b6001600160a01b038116158015906116905750600754604051634e7b827f60e01b81523360048201526001600160a01b0390911690634e7b827f90602401602060405180830381865afa158015611666573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168a91906135b2565b15156001145b6116f05760405162461bcd60e51b815260206004820152602b60248201527f696e76616c69642061646472657373203a206d7573742063657850726f76696460448201526a195c8818dbdb9d1c9858dd60aa1b60648201526084016109f8565b600e80546001600160a01b0319166001600160a01b0383169081179091556040519081527f26b812151af53aba1b9401841e2ccb44fa62ee2f2197177d74085e3a451060f89060200160405180910390a150565b6000546001600160a01b0316331461176e5760405162461bcd60e51b81526004016109f890613505565b6006546001600160a01b03908116908216036117d85760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b60648201526084016109f8565b6006546040516001600160a01b03918216918316907f2afbff3ed601a8723765c7072d8ea8445e08f6f1874afd34a2b747a272c3ebad90600090a3600680546001600160a01b0319166001600160a01b03838116918217909255600754604051635f54c24f60e11b815260048101929092529091169063bea9849e90602401610e4a565b6000546001600160a01b031633146118865760405162461bcd60e51b81526004016109f890613505565b6001600160a01b03821660009081526013602052604090205481151560ff90911615150361190a5760405162461bcd60e51b815260206004820152602b60248201527f204163636f756e7420697320616c7265616479207468652076616c7565206f6660448201526a20276578636c756465642760a81b60648201526084016109f8565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b910161130e565b6000546001600160a01b0316331461198c5760405162461bcd60e51b81526004016109f890613505565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d350910161130e565b6000546001600160a01b03163314611a0e5760405162461bcd60e51b81526004016109f890613505565b600c546001600160a01b03838116911614611af2576001600160a01b038216611a795760405162461bcd60e51b815260206004820152601f60248201527f546865206c697175696469747957616c6c65742063616e6e6f7420626520300060448201526064016109f8565b600c546040516e1b1a5c5d5a591a5d1e55d85b1b195d608a1b81526001600160a01b0391821691841690600f01604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600c80546001600160a01b0319166001600160a01b0384161790555b600d546001600160a01b03828116911614610af0576001600160a01b038116611b5d5760405162461bcd60e51b815260206004820152601960248201527f5468652064616f57616c6c65742063616e6e6f7420626520300000000000000060448201526064016109f8565b600d546040516819185bd5d85b1b195d60ba1b81526001600160a01b0391821691831690600901604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600d80546001600160a01b0383166001600160a01b03199091161790555050565b6000546001600160a01b03163314611bff5760405162461bcd60e51b81526004016109f890613505565b6001600160a01b038116611c645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109f8565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600080611ccc838561363e565b905083811015611d1e5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016109f8565b9392505050565b6001600160a01b038316611d875760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109f8565b6001600160a01b038216611de85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109f8565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316611e705760405162461bcd60e51b81526004016109f890613656565b6001600160a01b038216611e965760405162461bcd60e51b81526004016109f89061369b565b80600003611eaf57611eaa83836000612846565b505050565b6001600160a01b03808416600081815260166020908152604080832054948716835280832054938352601290915290205460ff928316929182169116158015611f1157506001600160a01b03841660009081526012602052604090205460ff16155b1561213f57600754600160a01b900460ff16611f6f5760405162461bcd60e51b815260206004820152601e60248201527f54726164696e672069732063757272656e746c792064697361626c65642e000060448201526064016109f8565b6001600160a01b03841660009081526014602052604090205460ff16158015611fb157506001600160a01b03851660009081526014602052604090205460ff16155b15612088578115612020576008548311156120205760405162461bcd60e51b815260206004820152602960248201527f42757920616d6f756e74206578636565647320746865206d6178547857616c6c60448201526832ba20b6b7bab73a1760b91b60648201526084016109f8565b8015612088576009548311156120885760405162461bcd60e51b815260206004820152602760248201527f53656c6c20616d6f756e74206578636565647320746865206d6178547842757960448201526620b6b7bab73a1760c91b60648201526084016109f8565b6001600160a01b03841660009081526015602052604090205460ff1661213f57600854836120cb866001600160a01b031660009081526001602052604090205490565b6120d5919061363e565b111561213f5760405162461bcd60e51b815260206004820152603360248201527f45787065637465642077616c6c657420616d6f756e742065786365656473207460448201527234329036b0bc2bb0b63632ba20b6b7bab73a1760691b60648201526084016109f8565b6121498282612b9c565b600b543060009081526001602052604090205460075491111590600160a01b900460ff1680156121765750805b80156121855750600a5460ff16155b801561219c5750601754600160201b900460ff1615155b80156121c057506001600160a01b03851660009081526016602052604090205460ff165b80156121e557506001600160a01b03861660009081526013602052604090205460ff16155b801561220a57506001600160a01b03851660009081526013602052604090205460ff16155b1561222f57600a805460ff19166001179055612224612da9565b600a805460ff191690555b600a5460009060ff1615801561224e5750600754600160a01b900460ff165b6001600160a01b03881660009081526013602052604090205490915060ff168061229057506001600160a01b03861660009081526013602052604090205460ff165b15612299575060005b8080156122b15750601754600160201b900460ff1615155b15612378576017546000906064906122d390600160201b900460ff1688613550565b6122dd9190613585565b6017549091506000906064906122fc9062010000900460ff1689613550565b6123069190613585565b905061231282886136de565b965061231f893084612846565b80156123755761232f30826124d8565b601754604080516201000090920460ff168252602082018390527ffecf12fd01122af77b8b8f1a0f126363142d14fba298ea36d9fe4909f61bb5a1910160405180910390a15b50505b612383878787612846565b6007546001600160a01b031663e30443bc886123b4816001600160a01b031660009081526001602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156123fa57600080fd5b505af192505050801561240b575060015b506007546001600160a01b031663e30443bc8761243d816001600160a01b031660009081526001602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561248357600080fd5b505af1925050508015612494575060015b5050505050505050565b600081848411156124c25760405162461bcd60e51b81526004016109f891906132df565b5060006124cf84866136de565b95945050505050565b6001600160a01b0382166125385760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016109f8565b61257581604051806060016040528060228152602001613824602291396001600160a01b038516600090815260016020526040902054919061249e565b6001600160a01b03831660009081526001602052604090205560035461259b9082613096565b6003556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600285015460ff858116610100909204161461267457604051711b1a5c5d5a591a5d1e51995953db94d95b1b60721b815260120160405190819003812060028701548754919260ff61010090920482169291881691600080516020613894833981519152916126559160481b906136f5565b60405180910390a460028501805461ff00191661010060ff8716021790555b600285015460ff8481166301000000909204161461270d57604051711958dbdcde5cdd195b51995953db94d95b1b60721b815260120160405190819003812060028701548754919260ff630100000090920482169291871691600080516020613894833981519152916126ea9160481b906136f5565b60405180910390a460028501805463ff0000001916630100000060ff8616021790555b600285015460ff838116600160281b90920416146127a3576040516c189d5c9b91995953db94d95b1b609a1b8152600d0160405190819003812060028701548754919260ff600160281b909204821692918616916000805160206138948339815191529161277e9160481b906136f5565b60405180910390a460028501805465ff00000000001916600160281b60ff8516021790555b600285015460ff828116600160381b9092041614610e78576040516f1a1bdb19195c9cd1995953db94d95b1b60821b815260100160405190819003812060028701548754919260ff600160381b90920482169291851691600080516020613894833981519152916128179160481b906136f5565b60405180910390a460028501805460ff8316600160381b0267ff00000000000000199091161790555050505050565b6001600160a01b03831661286c5760405162461bcd60e51b81526004016109f890613656565b6001600160a01b0382166128925760405162461bcd60e51b81526004016109f89061369b565b6128cf81604051806060016040528060268152602001613846602691396001600160a01b038616600090815260016020526040902054919061249e565b6001600160a01b0380851660009081526001602052604080822093909355908416815220546128fe9082611cbf565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611e3d9085815260200190565b600285015460ff8581169116146129d357604051706c69717569646974794665654f6e42757960781b815260110160405190819003812060028701548754919260ff9182169291881691600080516020613894833981519152916129b99160481b906136f5565b60405180910390a460028501805460ff191660ff86161790555b600285015460ff848116620100009092041614612a67576040517065636f73797374656d4665654f6e42757960781b815260110160405190819003812060028701548754919260ff620100009092048216929187169160008051602061389483398151915291612a469160481b906136f5565b60405180910390a460028501805462ff000019166201000060ff8616021790555b600285015460ff838116600160201b9092041614612afb576040516b6275726e4665654f6e42757960a01b8152600c0160405190819003812060028701548754919260ff600160201b9092048216929186169160008051602061389483398151915291612ad79160481b906136f5565b60405180910390a460028501805464ff000000001916600160201b60ff8516021790555b600285015460ff828116600160301b9092041614610e78576040516e686f6c646572734665654f6e42757960881b8152600f0160405190819003812060028701548754919260ff600160301b9092048216929185169160008051602061389483398151915291612b6e9160481b906136f5565b60405180910390a460028501805460ff8316600160301b0266ff000000000000199091161790555050505050565b6017805463ffffffff191690558115612c0c576011546017805460ff80841661ffff1990921691909117610100620100008086048416919091029190911763ffff00001916600160201b850483169190910263ff000000191617600160301b909304166301000000029190911790555b8015612c6f576011546017805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b90940491909116029190911790555b80158015612c7b575081155b15612cdd576011546017805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b90940491909116029190911790555b60175460ff63010000008204811691620100008104821691612d07916101008104821691166135cf565b612d1191906135cf565b612d1b91906135cf565b6017805464ff00000000198116600160201b60ff94851681029182179384905560408051938616928616929092178352610100840485166020840152620100008404851691830191909152630100000083048416606083015290910490911660808201527f6e2a5b7f71cda0b5cb7df899e2ae963197bad5b9805df7f475458f793841201c9060a001610ae7565b306000908152600160205260408120546017549091479160029060ff600160201b8204811691612dda911686613550565b612de49190613585565b612dee9190613585565b60175490915060009060ff600160201b8204811691612e169163010000009091041686613550565b612e209190613585565b90506000612e2e828461363e565b612e3890866136de565b9050612e43816130d8565b6000612e4f85476136de565b60175490915060009060ff63010000008204811691620100008104821691612e7a916002911661370c565b612e8491906135cf565b612e8e91906135cf565b601754612ea59190600160201b900460ff1661372e565b60175460ff91821692506000916002918491612ec2911686613550565b612ecc9190613585565b612ed69190613585565b90506000612ee482856136de565b600d546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015612f1f573d6000803e3d6000fd5b508615612f7257612f308783613232565b60408051868152602081018490529081018890527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b60075460405163a9059cbb60e01b81526001600160a01b03909116600482015260248101879052600090309063a9059cbb906044016020604051808303816000875af1158015612fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fea91906135b2565b9050801561308a57600754604051636bf5ecd560e01b8152600481018990526001600160a01b0390911690636bf5ecd590602401600060405180830381600087803b15801561303857600080fd5b505af115801561304c573d6000803e3d6000fd5b505050507fa4049db804d87a845be4dd8b54ae7048131238fba985dd37234309ac8668d9698760405161308191815260200190565b60405180910390a15b50505050505050505050565b6000611d1e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061249e565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061310d5761310d613751565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613166573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061318a9190613767565b8160018151811061319d5761319d613751565b6001600160a01b0392831660209182029290920101526006546131c39130911684611d25565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906131fc908590600090869030904290600401613784565b600060405180830381600087803b15801561321657600080fd5b505af115801561322a573d6000803e3d6000fd5b505050505050565b60065461324a9030906001600160a01b031684611d25565b600654600c5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af11580156132ba573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e7891906137f5565b600060208083528351808285015260005b8181101561330c578581018301518582016040015282016132f0565b8181111561331e576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610ebf57600080fd5b6000806040838503121561335c57600080fd5b823561336781613334565b946020939093013593505050565b60006020828403121561338757600080fd5b5035919050565b6000806000606084860312156133a357600080fd5b83356133ae81613334565b925060208401356133be81613334565b929592945050506040919091013590565b6000602082840312156133e157600080fd5b8135611d1e81613334565b803560ff811681146133fd57600080fd5b919050565b6000806000806080858703121561341857600080fd5b613421856133ec565b935061342f602086016133ec565b925061343d604086016133ec565b915061344b606086016133ec565b905092959194509250565b8015158114610ebf57600080fd5b6000806040838503121561347757600080fd5b823561348281613334565b9150602083013561349281613456565b809150509250929050565b600080604083850312156134b057600080fd5b82356134bb81613334565b9150602083013561349281613334565b600181811c908216806134df57607f821691505b6020821081036134ff57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561356a5761356a61353a565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826135945761359461356f565b500490565b6000602082840312156135ab57600080fd5b5051919050565b6000602082840312156135c457600080fd5b8151611d1e81613456565b600060ff821660ff84168060ff038211156135ec576135ec61353a565b019392505050565b6020808252602a908201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604082015269276578636c756465642760b01b606082015260800190565b600082198211156136515761365161353a565b500190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000828210156136f0576136f061353a565b500390565b68ffffffffffffffffff1991909116815260200190565b600060ff83168061371f5761371f61356f565b8060ff84160491505092915050565b600060ff821660ff8416808210156137485761374861353a565b90039392505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561377957600080fd5b8151611d1e81613334565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156137d45784516001600160a01b0316835293830193918301916001016137af565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561380a57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636500edc71549f0cbe47086c2237ce0cf874d6897fd1d7ce43ee6b65c0230d7606e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212201eaa1bdf6f10e91a3d1440e59e931f11eba3bc53b3dad38b1fec945ae98fdb1864736f6c634300080f003360806040523480156200001157600080fd5b50604051806040016040528060118152602001707777772e737065637472756d61692e676760781b81525060405180604001604052806008815260200167734149547261636b60c01b815250818181600390816200007091906200019e565b5060046200007f82826200019e565b505050600062000094620000f560201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050610e10600e55506000600f556200026a565b3390565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200012457607f821691505b6020821081036200014557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200019957600081815260208120601f850160051c81016020861015620001745750805b601f850160051c820191505b81811015620001955782815560010162000180565b5050505b505050565b81516001600160401b03811115620001ba57620001ba620000f9565b620001d281620001cb84546200010f565b846200014b565b602080601f8311600181146200020a5760008415620001f15750858301515b600019600386901b1c1916600185901b17855562000195565b600085815260208120601f198616915b828110156200023b578886015182559484019460019091019084016200021a565b50858210156200025a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611a2f806200027a6000396000f3fe6080604052600436106101f25760003560e01c8063715018a61161010d578063a9059cbb116100a0578063bea9849e1161006f578063bea9849e146105b6578063dd62ed3e146105d6578063e30443bc1461061c578063f2fde38b1461063c578063f7c618c11461065c57600080fd5b8063a9059cbb1461052a578063aafd847a1461054a578063bc4c4b3714610580578063be10b614146105a057600080fd5b806391b89fba116100dc57806391b89fba146104b557806395d89b41146104d5578063a457c2d7146104ea578063a8b9d2401461050a57600080fd5b8063715018a61461044c57806385a6b3ae146104615780638aee8127146104775780638da5cb5b1461049757600080fd5b8063313ce567116101855780636a474002116101545780636a474002146103cb5780636bf5ecd5146103e05780636f2789ec1461040057806370a082311461041657600080fd5b8063313ce5671461033f57806331e79db01461035b578063395093511461037b5780634e7b827f1461039b57600080fd5b806318160ddd116101c157806318160ddd146102b3578063226cfa3d146102d257806323b872dd146102ff57806327ce01471461031f57600080fd5b806306fdde03146101fe578063095ea7b314610229578063163c7cef146102595780631694505e1461027b57600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021361067c565b6040516102209190611676565b60405180910390f35b34801561023557600080fd5b506102496102443660046116e0565b61070e565b6040519015158152602001610220565b34801561026557600080fd5b5061027961027436600461170c565b610725565b005b34801561028757600080fd5b5060095461029b906001600160a01b031681565b6040516001600160a01b039091168152602001610220565b3480156102bf57600080fd5b506002545b604051908152602001610220565b3480156102de57600080fd5b506102c46102ed366004611725565b600d6020526000908152604090205481565b34801561030b57600080fd5b5061024961031a366004611742565b6107d6565b34801561032b57600080fd5b506102c461033a366004611725565b61083f565b34801561034b57600080fd5b5060405160128152602001610220565b34801561036757600080fd5b50610279610376366004611725565b61089b565b34801561038757600080fd5b506102496103963660046116e0565b610950565b3480156103a757600080fd5b506102496103b6366004611725565b600c6020526000908152604090205460ff1681565b3480156103d757600080fd5b50610279610986565b3480156103ec57600080fd5b506102796103fb36600461170c565b6109bc565b34801561040c57600080fd5b506102c4600e5481565b34801561042257600080fd5b506102c4610431366004611725565b6001600160a01b031660009081526020819052604090205490565b34801561045857600080fd5b50610279610a79565b34801561046d57600080fd5b506102c460075481565b34801561048357600080fd5b50610279610492366004611725565b610aed565b3480156104a357600080fd5b506005546001600160a01b031661029b565b3480156104c157600080fd5b506102c46104d0366004611725565b610b20565b3480156104e157600080fd5b50610213610b2b565b3480156104f657600080fd5b506102496105053660046116e0565b610b3a565b34801561051657600080fd5b506102c4610525366004611725565b610b89565b34801561053657600080fd5b506102496105453660046116e0565b610bb5565b34801561055657600080fd5b506102c4610565366004611725565b6001600160a01b03166000908152600b602052604090205490565b34801561058c57600080fd5b5061024961059b366004611791565b610bc2565b3480156105ac57600080fd5b506102c4600f5481565b3480156105c257600080fd5b506102796105d1366004611725565b610c70565b3480156105e257600080fd5b506102c46105f13660046117ca565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561062857600080fd5b506102796106373660046116e0565b610ca3565b34801561064857600080fd5b50610279610657366004611725565b610d21565b34801561066857600080fd5b5060085461029b906001600160a01b031681565b60606003805461068b906117f8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b7906117f8565b80156107045780601f106106d957610100808354040283529160200191610704565b820191906000526020600020905b8154815290600101906020018083116106e757829003601f168201915b5050505050905090565b600061071b338484610e0c565b5060015b92915050565b6005546001600160a01b031633146107585760405162461bcd60e51b815260040161074f90611832565b60405180910390fd5b80600f54036107d1576040805162461bcd60e51b81526020600482015260248101919091527f6d696e696d756d546f6b656e42616c616e6365466f724469766964656e64732060448201527f616c7265616479207468652076616c7565206f6620276e657756616c7565272e606482015260840161074f565b600f55565b60006107e3848484610f30565b6108358433610830856040518060600160405280602881526020016119ad602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190610f6f565b610e0c565b5060019392505050565b6001600160a01b0381166000908152600a602090815260408083205491839052822054600654600160801b926108919261088c92610886916108819190610fa9565b611032565b90611042565b611080565b61071f919061187d565b6005546001600160a01b031633146108c55760405162461bcd60e51b815260040161074f90611832565b6001600160a01b0381166000908152600c602052604090205460ff16156108eb57600080fd5b6001600160a01b0381166000908152600c60205260408120805460ff19166001179055610919908290611093565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161071b91859061083090866110f8565b6005546001600160a01b031633146109b05760405162461bcd60e51b815260040161074f90611832565b6109b933611157565b50565b6005546001600160a01b031633146109e65760405162461bcd60e51b815260040161074f90611832565b60006109f160025490565b116109fb57600080fd5b80156109b957610a2e610a0d60025490565b610a1b83600160801b610fa9565b610a25919061187d565b600654906110f8565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600754610a7390826110f8565b60075550565b6005546001600160a01b03163314610aa35760405162461bcd60e51b815260040161074f90611832565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610b175760405162461bcd60e51b815260040161074f90611832565b6109b9816112bc565b600061071f82610b89565b60606004805461068b906117f8565b600061071b3384610830856040518060600160405280602581526020016119d5602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190610f6f565b6001600160a01b0381166000908152600b602052604081205461071f90610baf8461083f565b90611308565b600061071b338484610f30565b6005546000906001600160a01b03163314610bef5760405162461bcd60e51b815260040161074f90611832565b6000610bfa84611157565b90508015610c66576001600160a01b0384166000818152600d6020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610c549085815260200190565b60405180910390a3600191505061071f565b5060009392505050565b6005546001600160a01b03163314610c9a5760405162461bcd60e51b815260040161074f90611832565b6109b98161134a565b6005546001600160a01b03163314610ccd5760405162461bcd60e51b815260040161074f90611832565b6001600160a01b0382166000908152600c602052604090205460ff16610d1d57600f548110610d0557610d008282611093565b610d10565b610d10826000611093565b610d1b826001610bc2565b505b5050565b6005546001600160a01b03163314610d4b5760405162461bcd60e51b815260040161074f90611832565b6001600160a01b038116610db05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161074f565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316610e6e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161074f565b6001600160a01b038216610ecf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161074f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b8152602060048201526014602482015273139bc81d1c985b9cd9995c9cc8185b1b1bddd95960621b604482015260640161074f565b60008184841115610f935760405162461bcd60e51b815260040161074f9190611676565b506000610fa0848661189f565b95945050505050565b600082600003610fbb5750600061071f565b6000610fc783856118b6565b905082610fd4858361187d565b1461102b5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161074f565b9392505050565b6000818181121561071f57600080fd5b60008061104f83856118d5565b9050600083121580156110625750838112155b80611077575060008312801561107757508381125b61102b57600080fd5b60008082121561108f57600080fd5b5090565b6001600160a01b038216600090815260208190526040902054808211156110d25760006110c08383611308565b90506110cc8482611396565b50610d1b565b80821015610d1b5760006110e68284611308565b90506110f284826113fa565b50505050565b6000806111058385611916565b90508381101561102b5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161074f565b60008061116383610b89565b905080156112b3576001600160a01b0383166000908152600b602052604090205461118e90826110f8565b6001600160a01b0384166000818152600b6020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906111dd9084815260200190565b60405180910390a260085460405163a9059cbb60e01b81526001600160a01b03858116600483015260248201849052600092169063a9059cbb906044016020604051808303816000875af1158015611239573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125d919061192e565b9050806112ac576001600160a01b0384166000908152600b60205260409020546112879083611308565b6001600160a01b039094166000908152600b6020526040812094909455509192915050565b5092915050565b50600092915050565b6005546001600160a01b031633146112e65760405162461bcd60e51b815260040161074f90611832565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600061102b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610f6f565b6005546001600160a01b031633146113745760405162461bcd60e51b815260040161074f90611832565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6113a0828261143e565b6113da6113bb61088183600654610fa990919063ffffffff16565b6001600160a01b0384166000908152600a602052604090205490611529565b6001600160a01b039092166000908152600a602052604090209190915550565b6114048282611566565b6113da61141f61088183600654610fa990919063ffffffff16565b6001600160a01b0384166000908152600a602052604090205490611042565b6001600160a01b0382166114945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161074f565b6114a060008383610d1b565b6002546114ad90826110f8565b6002556001600160a01b0382166000908152602081905260409020546114d390826110f8565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b600080611536838561194b565b9050600083121580156115495750838113155b806110775750600083128015611077575083811361102b57600080fd5b6001600160a01b0382166115c65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161074f565b6115d282600083610d1b565b61160f8160405180606001604052806022815260200161198b602291396001600160a01b0385166000908152602081905260409020549190610f6f565b6001600160a01b0383166000908152602081905260409020556002546116359082611308565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161151d565b600060208083528351808285015260005b818110156116a357858101830151858201604001528201611687565b818111156116b5576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146109b957600080fd5b600080604083850312156116f357600080fd5b82356116fe816116cb565b946020939093013593505050565b60006020828403121561171e57600080fd5b5035919050565b60006020828403121561173757600080fd5b813561102b816116cb565b60008060006060848603121561175757600080fd5b8335611762816116cb565b92506020840135611772816116cb565b929592945050506040919091013590565b80151581146109b957600080fd5b600080604083850312156117a457600080fd5b82356117af816116cb565b915060208301356117bf81611783565b809150509250929050565b600080604083850312156117dd57600080fd5b82356117e8816116cb565b915060208301356117bf816116cb565b600181811c9082168061180c57607f821691505b60208210810361182c57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008261189a57634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156118b1576118b1611867565b500390565b60008160001904831182151516156118d0576118d0611867565b500290565b600080821280156001600160ff1b03849003851316156118f7576118f7611867565b600160ff1b839003841281161561191057611910611867565b50500190565b6000821982111561192957611929611867565b500190565b60006020828403121561194057600080fd5b815161102b81611783565b60008083128015600160ff1b85018412161561196957611969611867565b6001600160ff1b038401831381161561198457611984611867565b5050039056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ad8a4e679892986de6208f5f50544e089cb36cf49949f3b702f57e42defc44fb64736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106102975760003560e01c8063751039fc1161015a578063aee50b1e116100c1578063d2d7ad831161007a578063d2d7ad831461082f578063d322157614610845578063d3f6a15714610865578063dd62ed3e14610885578063f2fde38b146108cb578063fe017535146108eb57600080fd5b8063aee50b1e14610720578063b62496f514610740578063b6b6bd1214610770578063bea9849e14610790578063c0246668146107b0578063cd43e228146107d057600080fd5b80639d952ce9116101135780639d952ce91461066c578063a457c2d71461068c578063a8b9d240146106ac578063a9059cbb146106cc578063aa4bde28146106ec578063ad2a02ca1461070257600080fd5b8063751039fc146105ce578063781edb3c146105e3578063880bcbc1146106035780638c0b5e22146106235780638da5cb5b1461063957806395d89b411461065757600080fd5b806331e79db0116101fe57806366781291116101b7578063667812911461050357806366a8f3701461052357806369728695146105435780636f4e25921461056357806370a0823114610583578063715018a6146105b957600080fd5b806331e79db01461043a578063395093511461045a57806342966c681461047a57806349bd5a5e1461049a5780634e71d92d146104ce5780635ebf4db9146104e357600080fd5b806318160ddd1161025057806318160ddd1461038a5780631e293c10146103a957806323b872dd146103c957806327a14fc2146103e95780632bf2e45914610409578063313ce5671461041e57600080fd5b8063064a59d0146102a357806306fdde03146102d9578063095ea7b3146102fb578063098df5851461031b5780630bd05b691461033d5780631694505e1461035257600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506007546102c490600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b3480156102e557600080fd5b506102ee610926565b6040516102d091906132df565b34801561030757600080fd5b506102c4610316366004613349565b6109b8565b34801561032757600080fd5b5061033b610336366004613375565b6109ce565b005b34801561034957600080fd5b5061033b610af4565b34801561035e57600080fd5b50600654610372906001600160a01b031681565b6040516001600160a01b0390911681526020016102d0565b34801561039657600080fd5b506003545b6040519081526020016102d0565b3480156103b557600080fd5b5061033b6103c4366004613375565b610b33565b3480156103d557600080fd5b506102c46103e436600461338e565b610c23565b3480156103f557600080fd5b5061033b610404366004613375565b610c8c565b34801561041557600080fd5b5061039b610d7f565b34801561042a57600080fd5b50604051601281526020016102d0565b34801561044657600080fd5b5061033b6104553660046133cf565b610df2565b34801561046657600080fd5b506102c4610475366004613349565b610e7f565b34801561048657600080fd5b5061033b610495366004613375565b610eb5565b3480156104a657600080fd5b506103727f000000000000000000000000aa455cbac1c45d3c35d2beb7d9f735f3d9a6bbfa81565b3480156104da57600080fd5b5061033b610ec2565b3480156104ef57600080fd5b5061033b6104fe366004613375565b610f37565b34801561050f57600080fd5b5061033b61051e366004613402565b610f92565b34801561052f57600080fd5b50600754610372906001600160a01b031681565b34801561054f57600080fd5b506102c461055e36600461338e565b6110b2565b34801561056f57600080fd5b5061039b61057e3660046133cf565b61112e565b34801561058f57600080fd5b5061039b61059e3660046133cf565b6001600160a01b031660009081526001602052604090205490565b3480156105c557600080fd5b5061033b6111a4565b3480156105da57600080fd5b5061033b611218565b3480156105ef57600080fd5b5061033b6105fe366004613464565b611250565b34801561060f57600080fd5b5061033b61061e366004613464565b61131a565b34801561062f57600080fd5b5061039b60095481565b34801561064557600080fd5b506000546001600160a01b0316610372565b34801561066357600080fd5b506102ee6113dc565b34801561067857600080fd5b5061033b610687366004613402565b6113eb565b34801561069857600080fd5b506102c46106a7366004613349565b6114b2565b3480156106b857600080fd5b5061039b6106c73660046133cf565b611501565b3480156106d857600080fd5b506102c46106e7366004613349565b611534565b3480156106f857600080fd5b5061039b60085481565b34801561070e57600080fd5b50600e546001600160a01b0316610372565b34801561072c57600080fd5b5061033b61073b366004613375565b611541565b34801561074c57600080fd5b506102c461075b3660046133cf565b60166020526000908152604090205460ff1681565b34801561077c57600080fd5b5061033b61078b3660046133cf565b61160b565b34801561079c57600080fd5b5061033b6107ab3660046133cf565b611744565b3480156107bc57600080fd5b5061033b6107cb366004613464565b61185c565b3480156107dc57600080fd5b5060115460ff80821691620100008104821691600160201b8204811691600160301b9004165b6040805160ff958616815293851660208501529184169183019190915290911660608201526080016102d0565b34801561083b57600080fd5b5061039b600b5481565b34801561085157600080fd5b5061033b610860366004613464565b611962565b34801561087157600080fd5b5061033b61088036600461349d565b6119e4565b34801561089157600080fd5b5061039b6108a036600461349d565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3480156108d757600080fd5b5061033b6108e63660046133cf565b611bd5565b3480156108f757600080fd5b5060115460ff610100820481169163010000008104821691600160281b8204811691600160381b900416610802565b606060048054610935906134cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610961906134cb565b80156109ae5780601f10610983576101008083540402835291602001916109ae565b820191906000526020600020905b81548152906001019060200180831161099157829003601f168201915b5050505050905090565b60006109c5338484611d25565b50600192915050565b6000546001600160a01b03163314610a015760405162461bcd60e51b81526004016109f890613505565b60405180910390fd5b478110610a5f5760405162461bcd60e51b815260206004820152602660248201527f43616e6e6f742073656e64206d6f7265207468616e20636f6e74726163742062604482015265616c616e636560d01b60648201526084016109f8565b600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114610aac576040519150601f19603f3d011682016040523d82523d6000602084013e610ab1565b606091505b505090508015610af0576040518281527f362ae087cf4ccfc970d45b9e8ce6520f03b4eda3f9d76a70b655dc22badcca48906020015b60405180910390a15b5050565b6000546001600160a01b03163314610b1e5760405162461bcd60e51b81526004016109f890613505565b6007805460ff60a01b1916600160a01b179055565b6000546001600160a01b03163314610b5d5760405162461bcd60e51b81526004016109f890613505565b670de0b6b3a76400006103e8610b7260035490565b610b7d906001613550565b610b879190613585565b610b919190613585565b811015610bf05760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f7420736574206d6178547820416d6f756e74206c6f776572207468604482015266616e20302e312560c81b60648201526084016109f8565b60095460405182907f75f1c17bf623f0f7a2bd91ba61e89dff216960370e3e9a46b250750d03e4215e90600090a3600955565b6000610c30848484611e4a565b610c828433610c7d8560405180606001604052806028815260200161386c602891396001600160a01b038a166000908152600260209081526040808320338452909152902054919061249e565b611d25565b5060019392505050565b6000546001600160a01b03163314610cb65760405162461bcd60e51b81526004016109f890613505565b670de0b6b3a76400006103e8610ccb60035490565b610cd6906005613550565b610ce09190613585565b610cea9190613585565b811015610d4c5760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782077616c6c65742073697a65206c6f776572604482015269207468616e20302e352560b01b60648201526084016109f8565b60085460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a3600855565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610dc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ded9190613599565b905090565b6000546001600160a01b03163314610e1c5760405162461bcd60e51b81526004016109f890613505565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610e6457600080fd5b505af1158015610e78573d6000803e3d6000fd5b5050505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916109c5918590610c7d9086611cbf565b610ebf33826124d8565b50565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015610f13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebf91906135b2565b6000546001600160a01b03163314610f615760405162461bcd60e51b81526004016109f890613505565b60075460405163163c7cef60e01b8152600481018390526001600160a01b039091169063163c7cef90602401610e4a565b6000546001600160a01b03163314610fbc5760405162461bcd60e51b81526004016109f890613505565b8082610fc885876135cf565b610fd291906135cf565b610fdc91906135cf565b60ff1660051161102e5760405162461bcd60e51b815260206004820152601860248201527f73656c6c20666565206d7573742062652066616972212121000000000000000060448201526064016109f8565b61103c600f858585856125e3565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d015b6040805191829003822060ff878116845286811660208501528581168484015284166060840152905190917f69848adfba904cea9fd12f8e800c6bae1d85101b0becc5910e509a93d81449e9919081900360800190a250505050565b600e546000906001600160a01b031633146111235760405162461bcd60e51b815260206004820152602b60248201527f63616e2061626c6520746f2070726f7669646520617373657473206f7665722060448201526a31b2bc283937bb34b232b960a91b60648201526084016109f8565b610c82848484612846565b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa15801561117a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119e9190613599565b92915050565b6000546001600160a01b031633146111ce5760405162461bcd60e51b81526004016109f890613505565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146112425760405162461bcd60e51b81526004016109f890613505565b600354600955600354600855565b6000546001600160a01b0316331461127a5760405162461bcd60e51b81526004016109f890613505565b6001600160a01b03821660009081526015602052604090205481151560ff9091161515036112ba5760405162461bcd60e51b81526004016109f8906135f4565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527ff5133f371b17bf21ce0df4ae2c1b6e11ca7c2f27257eb55282edb1ccfd4ecb2e91015b60405180910390a25050565b6000546001600160a01b031633146113445760405162461bcd60e51b81526004016109f890613505565b6001600160a01b03821660009081526014602052604090205481151560ff9091161515036113845760405162461bcd60e51b81526004016109f8906135f4565b6001600160a01b038216600081815260146020908152604091829020805460ff191685151590811790915591519182527f30098fc83ab61b1a98835d32c4e611adedccfc260eeef586bd329d48e8a40a40910161130e565b606060058054610935906134cb565b6000546001600160a01b031633146114155760405162461bcd60e51b81526004016109f890613505565b808261142185876135cf565b61142b91906135cf565b61143591906135cf565b60ff166003116114875760405162461bcd60e51b815260206004820152601760248201527f62757920666565206d757374206265206661697221212100000000000000000060448201526064016109f8565b611495600f85858585612952565b6040516b62617365466565732d42757960a01b8152600c01611056565b60006109c53384610c7d856040518060600160405280602581526020016138b4602591393360009081526002602090815260408083206001600160a01b038d168452909152902054919061249e565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161115d565b60006109c5338484611e4a565b6000546001600160a01b0316331461156b5760405162461bcd60e51b81526004016109f890613505565b600b5481036115d85760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f7420757064617465206d696e696d756d546f6b656e734265666f72604482015272655377617020746f2073616d652076616c756560681b60648201526084016109f8565b600b5460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a3600b55565b6001600160a01b038116158015906116905750600754604051634e7b827f60e01b81523360048201526001600160a01b0390911690634e7b827f90602401602060405180830381865afa158015611666573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168a91906135b2565b15156001145b6116f05760405162461bcd60e51b815260206004820152602b60248201527f696e76616c69642061646472657373203a206d7573742063657850726f76696460448201526a195c8818dbdb9d1c9858dd60aa1b60648201526084016109f8565b600e80546001600160a01b0319166001600160a01b0383169081179091556040519081527f26b812151af53aba1b9401841e2ccb44fa62ee2f2197177d74085e3a451060f89060200160405180910390a150565b6000546001600160a01b0316331461176e5760405162461bcd60e51b81526004016109f890613505565b6006546001600160a01b03908116908216036117d85760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b60648201526084016109f8565b6006546040516001600160a01b03918216918316907f2afbff3ed601a8723765c7072d8ea8445e08f6f1874afd34a2b747a272c3ebad90600090a3600680546001600160a01b0319166001600160a01b03838116918217909255600754604051635f54c24f60e11b815260048101929092529091169063bea9849e90602401610e4a565b6000546001600160a01b031633146118865760405162461bcd60e51b81526004016109f890613505565b6001600160a01b03821660009081526013602052604090205481151560ff90911615150361190a5760405162461bcd60e51b815260206004820152602b60248201527f204163636f756e7420697320616c7265616479207468652076616c7565206f6660448201526a20276578636c756465642760a81b60648201526084016109f8565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b910161130e565b6000546001600160a01b0316331461198c5760405162461bcd60e51b81526004016109f890613505565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d350910161130e565b6000546001600160a01b03163314611a0e5760405162461bcd60e51b81526004016109f890613505565b600c546001600160a01b03838116911614611af2576001600160a01b038216611a795760405162461bcd60e51b815260206004820152601f60248201527f546865206c697175696469747957616c6c65742063616e6e6f7420626520300060448201526064016109f8565b600c546040516e1b1a5c5d5a591a5d1e55d85b1b195d608a1b81526001600160a01b0391821691841690600f01604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600c80546001600160a01b0319166001600160a01b0384161790555b600d546001600160a01b03828116911614610af0576001600160a01b038116611b5d5760405162461bcd60e51b815260206004820152601960248201527f5468652064616f57616c6c65742063616e6e6f7420626520300000000000000060448201526064016109f8565b600d546040516819185bd5d85b1b195d60ba1b81526001600160a01b0391821691831690600901604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600d80546001600160a01b0383166001600160a01b03199091161790555050565b6000546001600160a01b03163314611bff5760405162461bcd60e51b81526004016109f890613505565b6001600160a01b038116611c645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109f8565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600080611ccc838561363e565b905083811015611d1e5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016109f8565b9392505050565b6001600160a01b038316611d875760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109f8565b6001600160a01b038216611de85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109f8565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316611e705760405162461bcd60e51b81526004016109f890613656565b6001600160a01b038216611e965760405162461bcd60e51b81526004016109f89061369b565b80600003611eaf57611eaa83836000612846565b505050565b6001600160a01b03808416600081815260166020908152604080832054948716835280832054938352601290915290205460ff928316929182169116158015611f1157506001600160a01b03841660009081526012602052604090205460ff16155b1561213f57600754600160a01b900460ff16611f6f5760405162461bcd60e51b815260206004820152601e60248201527f54726164696e672069732063757272656e746c792064697361626c65642e000060448201526064016109f8565b6001600160a01b03841660009081526014602052604090205460ff16158015611fb157506001600160a01b03851660009081526014602052604090205460ff16155b15612088578115612020576008548311156120205760405162461bcd60e51b815260206004820152602960248201527f42757920616d6f756e74206578636565647320746865206d6178547857616c6c60448201526832ba20b6b7bab73a1760b91b60648201526084016109f8565b8015612088576009548311156120885760405162461bcd60e51b815260206004820152602760248201527f53656c6c20616d6f756e74206578636565647320746865206d6178547842757960448201526620b6b7bab73a1760c91b60648201526084016109f8565b6001600160a01b03841660009081526015602052604090205460ff1661213f57600854836120cb866001600160a01b031660009081526001602052604090205490565b6120d5919061363e565b111561213f5760405162461bcd60e51b815260206004820152603360248201527f45787065637465642077616c6c657420616d6f756e742065786365656473207460448201527234329036b0bc2bb0b63632ba20b6b7bab73a1760691b60648201526084016109f8565b6121498282612b9c565b600b543060009081526001602052604090205460075491111590600160a01b900460ff1680156121765750805b80156121855750600a5460ff16155b801561219c5750601754600160201b900460ff1615155b80156121c057506001600160a01b03851660009081526016602052604090205460ff165b80156121e557506001600160a01b03861660009081526013602052604090205460ff16155b801561220a57506001600160a01b03851660009081526013602052604090205460ff16155b1561222f57600a805460ff19166001179055612224612da9565b600a805460ff191690555b600a5460009060ff1615801561224e5750600754600160a01b900460ff165b6001600160a01b03881660009081526013602052604090205490915060ff168061229057506001600160a01b03861660009081526013602052604090205460ff165b15612299575060005b8080156122b15750601754600160201b900460ff1615155b15612378576017546000906064906122d390600160201b900460ff1688613550565b6122dd9190613585565b6017549091506000906064906122fc9062010000900460ff1689613550565b6123069190613585565b905061231282886136de565b965061231f893084612846565b80156123755761232f30826124d8565b601754604080516201000090920460ff168252602082018390527ffecf12fd01122af77b8b8f1a0f126363142d14fba298ea36d9fe4909f61bb5a1910160405180910390a15b50505b612383878787612846565b6007546001600160a01b031663e30443bc886123b4816001600160a01b031660009081526001602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156123fa57600080fd5b505af192505050801561240b575060015b506007546001600160a01b031663e30443bc8761243d816001600160a01b031660009081526001602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561248357600080fd5b505af1925050508015612494575060015b5050505050505050565b600081848411156124c25760405162461bcd60e51b81526004016109f891906132df565b5060006124cf84866136de565b95945050505050565b6001600160a01b0382166125385760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016109f8565b61257581604051806060016040528060228152602001613824602291396001600160a01b038516600090815260016020526040902054919061249e565b6001600160a01b03831660009081526001602052604090205560035461259b9082613096565b6003556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600285015460ff858116610100909204161461267457604051711b1a5c5d5a591a5d1e51995953db94d95b1b60721b815260120160405190819003812060028701548754919260ff61010090920482169291881691600080516020613894833981519152916126559160481b906136f5565b60405180910390a460028501805461ff00191661010060ff8716021790555b600285015460ff8481166301000000909204161461270d57604051711958dbdcde5cdd195b51995953db94d95b1b60721b815260120160405190819003812060028701548754919260ff630100000090920482169291871691600080516020613894833981519152916126ea9160481b906136f5565b60405180910390a460028501805463ff0000001916630100000060ff8616021790555b600285015460ff838116600160281b90920416146127a3576040516c189d5c9b91995953db94d95b1b609a1b8152600d0160405190819003812060028701548754919260ff600160281b909204821692918616916000805160206138948339815191529161277e9160481b906136f5565b60405180910390a460028501805465ff00000000001916600160281b60ff8516021790555b600285015460ff828116600160381b9092041614610e78576040516f1a1bdb19195c9cd1995953db94d95b1b60821b815260100160405190819003812060028701548754919260ff600160381b90920482169291851691600080516020613894833981519152916128179160481b906136f5565b60405180910390a460028501805460ff8316600160381b0267ff00000000000000199091161790555050505050565b6001600160a01b03831661286c5760405162461bcd60e51b81526004016109f890613656565b6001600160a01b0382166128925760405162461bcd60e51b81526004016109f89061369b565b6128cf81604051806060016040528060268152602001613846602691396001600160a01b038616600090815260016020526040902054919061249e565b6001600160a01b0380851660009081526001602052604080822093909355908416815220546128fe9082611cbf565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611e3d9085815260200190565b600285015460ff8581169116146129d357604051706c69717569646974794665654f6e42757960781b815260110160405190819003812060028701548754919260ff9182169291881691600080516020613894833981519152916129b99160481b906136f5565b60405180910390a460028501805460ff191660ff86161790555b600285015460ff848116620100009092041614612a67576040517065636f73797374656d4665654f6e42757960781b815260110160405190819003812060028701548754919260ff620100009092048216929187169160008051602061389483398151915291612a469160481b906136f5565b60405180910390a460028501805462ff000019166201000060ff8616021790555b600285015460ff838116600160201b9092041614612afb576040516b6275726e4665654f6e42757960a01b8152600c0160405190819003812060028701548754919260ff600160201b9092048216929186169160008051602061389483398151915291612ad79160481b906136f5565b60405180910390a460028501805464ff000000001916600160201b60ff8516021790555b600285015460ff828116600160301b9092041614610e78576040516e686f6c646572734665654f6e42757960881b8152600f0160405190819003812060028701548754919260ff600160301b9092048216929185169160008051602061389483398151915291612b6e9160481b906136f5565b60405180910390a460028501805460ff8316600160301b0266ff000000000000199091161790555050505050565b6017805463ffffffff191690558115612c0c576011546017805460ff80841661ffff1990921691909117610100620100008086048416919091029190911763ffff00001916600160201b850483169190910263ff000000191617600160301b909304166301000000029190911790555b8015612c6f576011546017805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b90940491909116029190911790555b80158015612c7b575081155b15612cdd576011546017805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b90940491909116029190911790555b60175460ff63010000008204811691620100008104821691612d07916101008104821691166135cf565b612d1191906135cf565b612d1b91906135cf565b6017805464ff00000000198116600160201b60ff94851681029182179384905560408051938616928616929092178352610100840485166020840152620100008404851691830191909152630100000083048416606083015290910490911660808201527f6e2a5b7f71cda0b5cb7df899e2ae963197bad5b9805df7f475458f793841201c9060a001610ae7565b306000908152600160205260408120546017549091479160029060ff600160201b8204811691612dda911686613550565b612de49190613585565b612dee9190613585565b60175490915060009060ff600160201b8204811691612e169163010000009091041686613550565b612e209190613585565b90506000612e2e828461363e565b612e3890866136de565b9050612e43816130d8565b6000612e4f85476136de565b60175490915060009060ff63010000008204811691620100008104821691612e7a916002911661370c565b612e8491906135cf565b612e8e91906135cf565b601754612ea59190600160201b900460ff1661372e565b60175460ff91821692506000916002918491612ec2911686613550565b612ecc9190613585565b612ed69190613585565b90506000612ee482856136de565b600d546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015612f1f573d6000803e3d6000fd5b508615612f7257612f308783613232565b60408051868152602081018490529081018890527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b60075460405163a9059cbb60e01b81526001600160a01b03909116600482015260248101879052600090309063a9059cbb906044016020604051808303816000875af1158015612fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fea91906135b2565b9050801561308a57600754604051636bf5ecd560e01b8152600481018990526001600160a01b0390911690636bf5ecd590602401600060405180830381600087803b15801561303857600080fd5b505af115801561304c573d6000803e3d6000fd5b505050507fa4049db804d87a845be4dd8b54ae7048131238fba985dd37234309ac8668d9698760405161308191815260200190565b60405180910390a15b50505050505050505050565b6000611d1e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061249e565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061310d5761310d613751565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613166573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061318a9190613767565b8160018151811061319d5761319d613751565b6001600160a01b0392831660209182029290920101526006546131c39130911684611d25565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906131fc908590600090869030904290600401613784565b600060405180830381600087803b15801561321657600080fd5b505af115801561322a573d6000803e3d6000fd5b505050505050565b60065461324a9030906001600160a01b031684611d25565b600654600c5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af11580156132ba573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e7891906137f5565b600060208083528351808285015260005b8181101561330c578581018301518582016040015282016132f0565b8181111561331e576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610ebf57600080fd5b6000806040838503121561335c57600080fd5b823561336781613334565b946020939093013593505050565b60006020828403121561338757600080fd5b5035919050565b6000806000606084860312156133a357600080fd5b83356133ae81613334565b925060208401356133be81613334565b929592945050506040919091013590565b6000602082840312156133e157600080fd5b8135611d1e81613334565b803560ff811681146133fd57600080fd5b919050565b6000806000806080858703121561341857600080fd5b613421856133ec565b935061342f602086016133ec565b925061343d604086016133ec565b915061344b606086016133ec565b905092959194509250565b8015158114610ebf57600080fd5b6000806040838503121561347757600080fd5b823561348281613334565b9150602083013561349281613456565b809150509250929050565b600080604083850312156134b057600080fd5b82356134bb81613334565b9150602083013561349281613334565b600181811c908216806134df57607f821691505b6020821081036134ff57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561356a5761356a61353a565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826135945761359461356f565b500490565b6000602082840312156135ab57600080fd5b5051919050565b6000602082840312156135c457600080fd5b8151611d1e81613456565b600060ff821660ff84168060ff038211156135ec576135ec61353a565b019392505050565b6020808252602a908201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604082015269276578636c756465642760b01b606082015260800190565b600082198211156136515761365161353a565b500190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000828210156136f0576136f061353a565b500390565b68ffffffffffffffffff1991909116815260200190565b600060ff83168061371f5761371f61356f565b8060ff84160491505092915050565b600060ff821660ff8416808210156137485761374861353a565b90039392505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561377957600080fd5b8151611d1e81613334565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156137d45784516001600160a01b0316835293830193918301916001016137af565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561380a57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636500edc71549f0cbe47086c2237ce0cf874d6897fd1d7ce43ee6b65c0230d7606e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212201eaa1bdf6f10e91a3d1440e59e931f11eba3bc53b3dad38b1fec945ae98fdb1864736f6c634300080f0033

Deployed Bytecode Sourcemap

17540:24728:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17855:28;;;;;;;;;;-1:-1:-1;17855:28:0;;;;-1:-1:-1;;;17855:28:0;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;17855:28:0;;;;;;;;8263:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9318:210::-;;;;;;;;;;-1:-1:-1;9318:210:0;;;;;:::i;:::-;;:::i;30193:347::-;;;;;;;;;;-1:-1:-1;30193:347:0;;;;;:::i;:::-;;:::i;:::-;;23774:88;;;;;;;;;;;;;:::i;17585:30::-;;;;;;;;;;-1:-1:-1;17585:30:0;;;;-1:-1:-1;;;;;17585:30:0;;;;;;-1:-1:-1;;;;;1628:32:1;;;1610:51;;1598:2;1583:18;17585:30:0;1449:218:1;8584:108:0;;;;;;;;;;-1:-1:-1;8672:12:0;;8584:108;;;1818:25:1;;;1806:2;1791:18;8584:108:0;1672:177:1;28873:323:0;;;;;;;;;;-1:-1:-1;28873:323:0;;;;;:::i;:::-;;:::i;9536:454::-;;;;;;;;;;-1:-1:-1;9536:454:0;;;;;:::i;:::-;;:::i;29204:324::-;;;;;;;;;;-1:-1:-1;29204:324:0;;;;;:::i;:::-;;:::i;31393:135::-;;;;;;;;;;;;;:::i;8483:93::-;;;;;;;;;;-1:-1:-1;8483:93:0;;8566:2;2457:36:1;;2445:2;2430:18;8483:93:0;2315:184:1;24925:130:0;;;;;;;;;;-1:-1:-1;24925:130:0;;;;;:::i;:::-;;:::i;9998:300::-;;;;;;;;;;-1:-1:-1;9998:300:0;;;;;:::i;:::-;;:::i;30823:81::-;;;;;;;;;;-1:-1:-1;30823:81:0;;;;;:::i;:::-;;:::i;17622:38::-;;;;;;;;;;;;;;;30082:103;;;;;;;;;;;;;:::i;29898:176::-;;;;;;;;;;-1:-1:-1;29898:176:0;;;;;:::i;:::-;;:::i;27638:834::-;;;;;;;;;;-1:-1:-1;27638:834:0;;;;;:::i;:::-;;:::i;17815:31::-;;;;;;;;;;-1:-1:-1;17815:31:0;;;;-1:-1:-1;;;;;17815:31:0;;;30548:267;;;;;;;;;;-1:-1:-1;30548:267:0;;;;;:::i;:::-;;:::i;31730:168::-;;;;;;;;;;-1:-1:-1;31730:168:0;;;;;:::i;:::-;;:::i;8700:177::-;;;;;;;;;;-1:-1:-1;8700:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;8851:18:0;8819:7;8851:18;;;:9;:18;;;;;;;8700:177;7382:148;;;;;;;;;;;;;:::i;25878:131::-;;;;;;;;;;;;;:::i;25479:391::-;;;;;;;;;;-1:-1:-1;25479:391:0;;;;;:::i;:::-;;:::i;25063:408::-;;;;;;;;;;-1:-1:-1;25063:408:0;;;;;:::i;:::-;;:::i;18019:56::-;;;;;;;;;;;;;;;;7168:79;;;;;;;;;;-1:-1:-1;7206:7:0;7233:6;-1:-1:-1;;;;;7233:6:0;7168:79;;8371:104;;;;;;;;;;;;;:::i;26816:814::-;;;;;;;;;;-1:-1:-1;26816:814:0;;;;;:::i;:::-;;:::i;10306:400::-;;;;;;;;;;-1:-1:-1;10306:400:0;;;;;:::i;:::-;;:::i;31536:186::-;;;;;;;;;;-1:-1:-1;31536:186:0;;;;;:::i;:::-;;:::i;8885:216::-;;;;;;;;;;-1:-1:-1;8885:216:0;;;;;:::i;:::-;;:::i;17952:60::-;;;;;;;;;;;;;;;;30912:100;;;;;;;;;;-1:-1:-1;30993:11:0;;-1:-1:-1;;;;;30993:11:0;30912:100;;29536:354;;;;;;;;;;-1:-1:-1;29536:354:0;;;;;:::i;:::-;;:::i;19062:57::-;;;;;;;;;;-1:-1:-1;19062:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31020:365;;;;;;;;;;-1:-1:-1;31020:365:0;;;;;:::i;:::-;;:::i;28480:385::-;;;;;;;;;;-1:-1:-1;28480:385:0;;;;;:::i;:::-;;:::i;24562:355::-;;;;;;;;;;-1:-1:-1;24562:355:0;;;;;:::i;:::-;;:::i;31906:354::-;;;;;;;;;;-1:-1:-1;32111:23:0;;;;;;;32149;;;;;;-1:-1:-1;;;32187:18:0;;;;;-1:-1:-1;;;32220:21:0;;;31906:354;;;;4511:4:1;4499:17;;;4481:36;;4553:17;;;4548:2;4533:18;;4526:45;4607:17;;;4587:18;;;4580:45;;;;4661:17;;;4656:2;4641:18;;4634:45;4468:3;4453:19;31906:354:0;4266:419:1;18113:69:0;;;;;;;;;;;;;;;;24314:240;;;;;;;;;;-1:-1:-1;24314:240:0;;;;;:::i;:::-;;:::i;26017:773::-;;;;;;;;;;-1:-1:-1;26017:773:0;;;;;:::i;:::-;;:::i;9109:201::-;;;;;;;;;;-1:-1:-1;9109:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;9275:18:0;;;9243:7;9275:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9109:201;7538:281;;;;;;;;;;-1:-1:-1;7538:281:0;;;;;:::i;:::-;;:::i;32268:359::-;;;;;;;;;;-1:-1:-1;32474:24:0;;;;;;;;;32513;;;;;;-1:-1:-1;;;32552:19:0;;;;;-1:-1:-1;;;32586:22:0;;;32268:359;;8263:100;8317:13;8350:5;8343:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8263:100;:::o;9318:210::-;9437:4;9459:39;6556:10;9482:7;9491:6;9459:8;:39::i;:::-;-1:-1:-1;9516:4:0;9318:210;;;;:::o;30193:347::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;;;;;;;;;30296:21:::1;30287:6;:30;30265:118;;;::::0;-1:-1:-1;;;30265:118:0;;6031:2:1;30265:118:0::1;::::0;::::1;6013:21:1::0;6070:2;6050:18;;;6043:30;6109:34;6089:18;;;6082:62;-1:-1:-1;;;6160:18:1;;;6153:36;6206:19;;30265:118:0::1;5829:402:1::0;30265:118:0::1;30395:12;7233:6:::0;;30413:40:::1;::::0;-1:-1:-1;;;;;7233:6:0;;;;30442;;30395:12;30413:40;30395:12;30413:40;30442:6;7233;30413:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30394:59;;;30468:7;30464:69;;;30497:24;::::0;1818:25:1;;;30497:24:0::1;::::0;1806:2:1;1791:18;30497:24:0::1;;;;;;;;30464:69;30254:286;30193:347:::0;:::o;23774:88::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;23831:16:::1;:23:::0;;-1:-1:-1;;;;23831:23:0::1;-1:-1:-1::0;;;23831:23:0::1;::::0;;23774:88::o;28873:323::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;29019:4:::1;29011;28990:13;8672:12:::0;;;8584:108;28990:13:::1;:17;::::0;29006:1:::1;28990:17;:::i;:::-;28989:26;;;;:::i;:::-;28988:35;;;;:::i;:::-;28976:8;:47;;28954:136;;;::::0;-1:-1:-1;;;28954:136:0;;7210:2:1;28954:136:0::1;::::0;::::1;7192:21:1::0;7249:2;7229:18;;;7222:30;7288:34;7268:18;;;7261:62;-1:-1:-1;;;7339:18:1;;;7332:37;7386:19;;28954:136:0::1;7008:403:1::0;28954:136:0::1;29143:11;::::0;29106:49:::1;::::0;29133:8;;29106:49:::1;::::0;;;::::1;29166:11;:22:::0;28873:323::o;9536:454::-;9676:4;9693:36;9703:6;9711:9;9722:6;9693:9;:36::i;:::-;9740:220;9763:6;6556:10;9811:138;9867:6;9811:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9811:19:0;;;;;;:11;:19;;;;;;;;6556:10;9811:33;;;;;;;;;;:37;:138::i;:::-;9740:8;:220::i;:::-;-1:-1:-1;9978:4:0;9536:454;;;;;:::o;29204:324::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;29345:4:::1;29337;29316:13;8672:12:::0;;;8584:108;29316:13:::1;:17;::::0;29332:1:::1;29316:17;:::i;:::-;29315:26;;;;:::i;:::-;29314:35;;;;:::i;:::-;29302:8;:47;;29280:139;;;::::0;-1:-1:-1;;;29280:139:0;;7618:2:1;29280:139:0::1;::::0;::::1;7600:21:1::0;7657:2;7637:18;;;7630:30;7696:34;7676:18;;;7669:62;-1:-1:-1;;;7747:18:1;;;7740:40;7797:19;;29280:139:0::1;7416:406:1::0;29280:139:0::1;29467:15;::::0;29435:48:::1;::::0;29457:8;;29435:48:::1;::::0;;;::::1;29494:15;:26:::0;29204:324::o;31393:135::-;31477:15;;:43;;;-1:-1:-1;;;31477:43:0;;;;31450:7;;-1:-1:-1;;;;;31477:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31470:50;;31393:135;:::o;24925:130::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;25002:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;25002:45:0;;-1:-1:-1;;;;;1628:32:1;;;25002:45:0::1;::::0;::::1;1610:51:1::0;25002:15:0;;::::1;::::0;:36:::1;::::0;1583:18:1;;25002:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24925:130:::0;:::o;9998:300::-;6556:10;10113:4;10207:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10207:34:0;;;;;;;;;;10113:4;;10135:133;;10185:7;;10207:50;;10246:10;10207:38;:50::i;30823:81::-;30872:24;30878:10;30890:5;30872;:24::i;:::-;30823:81;:::o;30082:103::-;30119:15;;:58;;-1:-1:-1;;;30119:58:0;;30158:10;30119:58;;;8200:51:1;30119:15:0;8267:18:1;;;8260:50;-1:-1:-1;;;;;30119:15:0;;;;:30;;8173:18:1;;30119:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29898:176::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;30013:15:::1;::::0;:53:::1;::::0;-1:-1:-1;;;30013:53:0;;::::1;::::0;::::1;1818:25:1::0;;;-1:-1:-1;;;;;30013:15:0;;::::1;::::0;:43:::1;::::0;1791:18:1;;30013:53:0::1;1672:177:1::0;27638:834:0;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;28006:17;27968:14;27882:62:::1;27925:19:::0;27882;:62:::1;:::i;:::-;:100;;;;:::i;:::-;:141;;;;:::i;:::-;27861:162;;:1;:162;27839:236;;;::::0;-1:-1:-1;;;27839:236:0;;8982:2:1;27839:236:0::1;::::0;::::1;8964:21:1::0;9021:2;9001:18;;;8994:30;9060:26;9040:18;;;9033:54;9104:18;;27839:236:0::1;8780:348:1::0;27839:236:0::1;28086:183;28124:5;28144:19;28178;28212:14;28241:17;28086:23;:183::i;:::-;28285:179;::::0;-1:-1:-1;;;9335:28:1;;9388:2;9379:12;28285:179:0::1;;::::0;;;;;::::1;::::0;;4511:4:1;4499:17;;;4481:36;;4553:17;;;4548:2;4533:18;;4526:45;4607:17;;;4587:18;;;4580:45;4661:17;;4656:2;4641:18;;4634:45;28285:179:0;;;;::::1;::::0;;;;;4468:3:1;28285:179:0;;::::1;27638:834:::0;;;;:::o;30548:267::-;21446:11;;30714:4;;-1:-1:-1;;;;;21446:11:0;21432:10;:25;21410:118;;;;-1:-1:-1;;;21410:118:0;;9604:2:1;21410:118:0;;;9586:21:1;9643:2;9623:18;;;9616:30;9682:34;9662:18;;;9655:62;-1:-1:-1;;;9733:18:1;;;9726:41;9784:19;;21410:118:0;9402:407:1;21410:118:0;30731:54:::1;30757:7;30766:13;30781:3;30731:15;:54::i;31730:168::-:0;31856:15;;:34;;-1:-1:-1;;;31856:34:0;;-1:-1:-1;;;;;1628:32:1;;;31856:34:0;;;1610:51:1;31824:7:0;;31856:15;;:25;;1583:18:1;;31856:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31849:41;31730:168;-1:-1:-1;;31730:168:0:o;7382:148::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;7489:1:::1;7473:6:::0;;7452:40:::1;::::0;-1:-1:-1;;;;;7473:6:0;;::::1;::::0;7452:40:::1;::::0;7489:1;;7452:40:::1;7520:1;7503:19:::0;;-1:-1:-1;;;;;;7503:19:0::1;::::0;;7382:148::o;25878:131::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;8672:12;;25932:11:::1;:27:::0;8672:12;;25970:15:::1;:31:::0;25878:131::o;25479:391::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25621:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;:50;::::1;;:38;::::0;;::::1;:50;;::::0;25599:142:::1;;;;-1:-1:-1::0;;;25599:142:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;25752:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:49;;-1:-1:-1;;25752:49:0::1;::::0;::::1;;::::0;;::::1;::::0;;;25817:45;;154:41:1;;;25817:45:0::1;::::0;127:18:1;25817:45:0::1;;;;;;;;25479:391:::0;;:::o;25063:408::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25210:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;:55;::::1;;:43;::::0;;::::1;:55;;::::0;25188:147:::1;;;;-1:-1:-1::0;;;25188:147:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;25346:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;;;;:54;;-1:-1:-1;;25346:54:0::1;::::0;::::1;;::::0;;::::1;::::0;;;25416:47;;154:41:1;;;25416:47:0::1;::::0;127:18:1;25416:47:0::1;14:187:1::0;8371:104:0;8427:13;8460:7;8453:14;;;;;:::i;26816:814::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;27176:16;27139:13;27055:60:::1;27097:18:::0;27055;:60:::1;:::i;:::-;:97;;;;:::i;:::-;:137;;;;:::i;:::-;27034:158;;:1;:158;27012:231;;;::::0;-1:-1:-1;;;27012:231:0;;10427:2:1;27012:231:0::1;::::0;::::1;10409:21:1::0;10466:2;10446:18;;;10439:30;10505:25;10485:18;;;10478:53;10548:18;;27012:231:0::1;10225:347:1::0;27012:231:0::1;27254:178;27291:5;27311:18;27344;27377:13;27405:16;27254:22;:178::i;:::-;27448:174;::::0;-1:-1:-1;;;10779:27:1;;10831:2;10822:12;27448:174:0::1;10577:263:1::0;10306:400:0;10426:4;10448:228;6556:10;10498:7;10520:145;10577:15;10520:145;;;;;;;;;;;;;;;;;6556:10;10520:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10520:34:0;;;;;;;;;;;;:38;:145::i;31536:186::-;31667:15;;:47;;-1:-1:-1;;;31667:47:0;;-1:-1:-1;;;;;1628:32:1;;;31667:47:0;;;1610:51:1;31635:7:0;;31667:15;;:38;;1583:18:1;;31667:47:0;1449:218:1;8885:216:0;9007:4;9029:42;6556:10;9053:9;9064:6;9029:9;:42::i;29536:354::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;29654:23:::1;;29642:8;:35:::0;29620:136:::1;;;::::0;-1:-1:-1;;;29620:136:0;;11047:2:1;29620:136:0::1;::::0;::::1;11029:21:1::0;11086:2;11066:18;;;11059:30;11125:34;11105:18;;;11098:62;-1:-1:-1;;;11176:18:1;;;11169:49;11235:19;;29620:136:0::1;10845:415:1::0;29620:136:0::1;29813:23;::::0;29772:65:::1;::::0;29803:8;;29772:65:::1;::::0;;;::::1;29848:23;:34:::0;29536:354::o;31020:365::-;-1:-1:-1;;;;;31111:28:0;;;;;;:103;;-1:-1:-1;31157:15:0;;:49;;-1:-1:-1;;;31157:49:0;;31195:10;31157:49;;;1610:51:1;-1:-1:-1;;;;;31157:15:0;;;;:37;;1583:18:1;;31157:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;31210:4;31157:57;31111:103;31089:196;;;;-1:-1:-1;;;31089:196:0;;11467:2:1;31089:196:0;;;11449:21:1;11506:2;11486:18;;;11479:30;11545:34;11525:18;;;11518:62;-1:-1:-1;;;11596:18:1;;;11589:41;11647:19;;31089:196:0;11265:407:1;31089:196:0;31296:11;:26;;-1:-1:-1;;;;;;31296:26:0;-1:-1:-1;;;;;31296:26:0;;;;;;;;31338:39;;1610:51:1;;;31338:39:0;;1598:2:1;1583:18;31338:39:0;;;;;;;31020:365;:::o;28480:385::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;28600:15:::1;::::0;-1:-1:-1;;;;;28600:15:0;;::::1;28578:38:::0;;::::1;::::0;28556:123:::1;;;::::0;-1:-1:-1;;;28556:123:0;;11879:2:1;28556:123:0::1;::::0;::::1;11861:21:1::0;11918:2;11898:18;;;11891:30;11957:34;11937:18;;;11930:62;-1:-1:-1;;;12008:18:1;;;12001:33;12051:19;;28556:123:0::1;11677:399:1::0;28556:123:0::1;28737:15;::::0;28695:59:::1;::::0;-1:-1:-1;;;;;28737:15:0;;::::1;::::0;28695:59;::::1;::::0;::::1;::::0;28737:15:::1;::::0;28695:59:::1;28765:15;:37:::0;;-1:-1:-1;;;;;;28765:37:0::1;-1:-1:-1::0;;;;;28765:37:0;;::::1;::::0;;::::1;::::0;;;28813:15:::1;::::0;:44:::1;::::0;-1:-1:-1;;;28813:44:0;;::::1;::::0;::::1;1610:51:1::0;;;;28813:15:0;;::::1;::::0;:32:::1;::::0;1583:18:1;;28813:44:0::1;1449:218:1::0;24562:355:0;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24694:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;:39;::::1;;:27;::::0;;::::1;:39;;::::0;24672:132:::1;;;::::0;-1:-1:-1;;;24672:132:0;;12283:2:1;24672:132:0::1;::::0;::::1;12265:21:1::0;12322:2;12302:18;;;12295:30;12361:34;12341:18;;;12334:62;-1:-1:-1;;;12412:18:1;;;12405:41;12463:19;;24672:132:0::1;12081:407:1::0;24672:132:0::1;-1:-1:-1::0;;;;;24815:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:38;;-1:-1:-1;;24815:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;24869:40;;154:41:1;;;24869:40:0::1;::::0;127:18:1;24869:40:0::1;14:187:1::0;24314:240:0;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24432:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:48;;-1:-1:-1;;24432:48:0::1;::::0;::::1;;::::0;;::::1;::::0;;;24496:50;;154:41:1;;;24496:50:0::1;::::0;127:18:1;24496:50:0::1;14:187:1::0;26017:773:0;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;26144:15:::1;::::0;-1:-1:-1;;;;;26144:37:0;;::::1;:15:::0;::::1;:37;26140:400;;-1:-1:-1::0;;;;;26224:32:0;::::1;26198:125;;;::::0;-1:-1:-1;;;26198:125:0;;12695:2:1;26198:125:0::1;::::0;::::1;12677:21:1::0;12734:2;12714:18;;;12707:30;12773:33;12753:18;;;12746:61;12824:18;;26198:125:0::1;12493:355:1::0;26198:125:0::1;26447:15;::::0;26343:134:::1;::::0;-1:-1:-1;;;13055:30:1;;-1:-1:-1;;;;;26447:15:0;;::::1;::::0;26343:134;::::1;::::0;13110:2:1;13101:12;26343:134:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;26492:15;:36:::0;;-1:-1:-1;;;;;;26492:36:0::1;-1:-1:-1::0;;;;;26492:36:0;::::1;;::::0;;26140:400:::1;26556:9;::::0;-1:-1:-1;;;;;26556:25:0;;::::1;:9:::0;::::1;:25;26552:231;;-1:-1:-1::0;;;;;26606:26:0;::::1;26598:64;;;::::0;-1:-1:-1;;;26598:64:0;;13326:2:1;26598:64:0::1;::::0;::::1;13308:21:1::0;13365:2;13345:18;;;13338:30;13404:27;13384:18;;;13377:55;13449:18;;26598:64:0::1;13124:349:1::0;26598:64:0::1;26722:9;::::0;26682:50:::1;::::0;-1:-1:-1;;;13680:24:1;;-1:-1:-1;;;;;26722:9:0;;::::1;::::0;26682:50;::::1;::::0;13729:1:1;13720:11;26682:50:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;26747:9;:24:::0;;-1:-1:-1;;;;;26747:24:0;::::1;-1:-1:-1::0;;;;;;26747:24:0;;::::1;;::::0;;26017:773;;:::o;7538:281::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7641:22:0;::::1;7619:110;;;::::0;-1:-1:-1;;;7619:110:0;;13944:2:1;7619:110:0::1;::::0;::::1;13926:21:1::0;13983:2;13963:18;;;13956:30;14022:34;14002:18;;;13995:62;-1:-1:-1;;;14073:18:1;;;14066:36;14119:19;;7619:110:0::1;13742:402:1::0;7619:110:0::1;7766:6;::::0;;7745:38:::1;::::0;-1:-1:-1;;;;;7745:38:0;;::::1;::::0;7766:6;::::1;::::0;7745:38:::1;::::0;::::1;7794:6;:17:::0;;-1:-1:-1;;;;;;7794:17:0::1;-1:-1:-1::0;;;;;7794:17:0;;;::::1;::::0;;;::::1;::::0;;7538:281::o;3042:181::-;3100:7;;3132:5;3136:1;3132;:5;:::i;:::-;3120:17;;3161:1;3156;:6;;3148:46;;;;-1:-1:-1;;;3148:46:0;;14484:2:1;3148:46:0;;;14466:21:1;14523:2;14503:18;;;14496:30;14562:29;14542:18;;;14535:57;14609:18;;3148:46:0;14282:351:1;3148:46:0;3214:1;3042:181;-1:-1:-1;;;3042:181:0:o;12169:378::-;-1:-1:-1;;;;;12305:19:0;;12297:68;;;;-1:-1:-1;;;12297:68:0;;14840:2:1;12297:68:0;;;14822:21:1;14879:2;14859:18;;;14852:30;14918:34;14898:18;;;14891:62;-1:-1:-1;;;14969:18:1;;;14962:34;15013:19;;12297:68:0;14638:400:1;12297:68:0;-1:-1:-1;;;;;12384:21:0;;12376:68;;;;-1:-1:-1;;;12376:68:0;;15245:2:1;12376:68:0;;;15227:21:1;15284:2;15264:18;;;15257:30;15323:34;15303:18;;;15296:62;-1:-1:-1;;;15374:18:1;;;15367:32;15416:19;;12376:68:0;15043:398:1;12376:68:0;-1:-1:-1;;;;;12455:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;12507:32;;1818:25:1;;;12507:32:0;;1791:18:1;12507:32:0;;;;;;;;12169:378;;;:::o;32635:2922::-;-1:-1:-1;;;;;32767:18:0;;32759:68;;;;-1:-1:-1;;;32759:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32846:16:0;;32838:64;;;;-1:-1:-1;;;32838:64:0;;;;;;;:::i;:::-;32919:6;32929:1;32919:11;32915:93;;32947:28;32963:4;32969:2;32973:1;32947:15;:28::i;:::-;32635:2922;;;:::o;32915:93::-;-1:-1:-1;;;;;33039:31:0;;;33020:16;33039:31;;;:25;:31;;;;;;;;;33099:29;;;;;;;;;33160:35;;;:29;:35;;;;;;33039:31;;;;;33099:29;;;;33160:35;33159:36;:87;;;;-1:-1:-1;;;;;;33213:33:0;;;;;;:29;:33;;;;;;;;33212:34;33159:87;33141:1084;;;33281:16;;-1:-1:-1;;;33281:16:0;;;;33273:59;;;;-1:-1:-1;;;33273:59:0;;16458:2:1;33273:59:0;;;16440:21:1;16497:2;16477:18;;;16470:30;16536:32;16516:18;;;16509:60;16586:18;;33273:59:0;16256:354:1;33273:59:0;-1:-1:-1;;;;;33370:38:0;;;;;;:34;:38;;;;;;;;33369:39;:101;;;;-1:-1:-1;;;;;;33430:40:0;;;;;;:34;:40;;;;;;;;33429:41;33369:101;33347:610;;;33509:11;33505:212;;;33589:15;;33579:6;:25;;33545:152;;;;-1:-1:-1;;;33545:152:0;;16817:2:1;33545:152:0;;;16799:21:1;16856:2;16836:18;;;16829:30;16895:34;16875:18;;;16868:62;-1:-1:-1;;;16946:18:1;;;16939:39;16995:19;;33545:152:0;16615:405:1;33545:152:0;33741:10;33737:205;;;33820:11;;33810:6;:21;;33776:146;;;;-1:-1:-1;;;33776:146:0;;17227:2:1;33776:146:0;;;17209:21:1;17266:2;17246:18;;;17239:30;17305:34;17285:18;;;17278:62;-1:-1:-1;;;17356:18:1;;;17349:37;17403:19;;33776:146:0;17025:403:1;33776:146:0;-1:-1:-1;;;;;33976:33:0;;;;;;:29;:33;;;;;;;;33971:243;;34088:15;;34077:6;34061:13;34071:2;-1:-1:-1;;;;;8851:18:0;8819:7;8851:18;;;:9;:18;;;;;;;8700:177;34061:13;:22;;;;:::i;:::-;34060:43;;34030:168;;;;-1:-1:-1;;;34030:168:0;;17635:2:1;34030:168:0;;;17617:21:1;17674:2;17654:18;;;17647:30;17713:34;17693:18;;;17686:62;-1:-1:-1;;;17764:18:1;;;17757:49;17823:19;;34030:168:0;17433:415:1;34030:168:0;34237:37;34250:11;34263:10;34237:12;:37::i;:::-;34328:23;;34318:4;34285:12;8851:18;;;:9;:18;;;;;;34382:16;;-1:-1:-1;;34300:51:0;;-1:-1:-1;;;34382:16:0;;;;:40;;;;;34415:7;34382:40;:67;;;;-1:-1:-1;34440:9:0;;;;34439:10;34382:67;:97;;;;-1:-1:-1;34466:9:0;;-1:-1:-1;;;34466:9:0;;;;:13;;34382:97;:143;;;;-1:-1:-1;;;;;;34496:29:0;;;;;;:25;:29;;;;;;;;34382:143;:185;;;;-1:-1:-1;;;;;;34543:24:0;;;;;;:18;:24;;;;;;;;34542:25;34382:185;:225;;;;-1:-1:-1;;;;;;34585:22:0;;;;;;:18;:22;;;;;;;;34584:23;34382:225;34364:362;;;34634:9;:16;;-1:-1:-1;;34634:16:0;34646:4;34634:16;;;34665:17;:15;:17::i;:::-;34697:9;:17;;-1:-1:-1;;34697:17:0;;;34364:362;34754:9;;34738:12;;34754:9;;34753:10;:30;;;;-1:-1:-1;34767:16:0;;-1:-1:-1;;;34767:16:0;;;;34753:30;-1:-1:-1;;;;;34800:24:0;;;;;;:18;:24;;;;;;34738:45;;-1:-1:-1;34800:24:0;;;:50;;-1:-1:-1;;;;;;34828:22:0;;;;;;:18;:22;;;;;;;;34800:50;34796:98;;;-1:-1:-1;34877:5:0;34796:98;34908:7;:24;;;;-1:-1:-1;34919:9:0;;-1:-1:-1;;;34919:9:0;;;;:13;;34908:24;34904:414;;;34973:9;;34949:11;;34986:3;;34964:18;;-1:-1:-1;;;34973:9:0;;;;34964:6;:18;:::i;:::-;34963:26;;;;:::i;:::-;35035:8;;34949:40;;-1:-1:-1;35004:18:0;;35047:3;;35026:17;;35035:8;;;;;35026:6;:17;:::i;:::-;35025:25;;;;:::i;:::-;35004:46;-1:-1:-1;35074:12:0;35083:3;35074:6;:12;:::i;:::-;35065:21;;35101:41;35117:4;35131;35138:3;35101:15;:41::i;:::-;35163:14;;35159:148;;35198:38;35218:4;35225:10;35198:11;:38::i;:::-;35270:8;;35260:31;;;35270:8;;;;;;18153:36:1;;18220:2;18205:18;;18198:34;;;35260:31:0;;18126:18:1;35260:31:0;;;;;;;35159:148;34934:384;;34904:414;35328:33;35344:4;35350:2;35354:6;35328:15;:33::i;:::-;35391:15;;-1:-1:-1;;;;;35391:15:0;:26;35426:4;35433:15;35426:4;-1:-1:-1;;;;;8851:18:0;8819:7;8851:18;;;:9;:18;;;;;;;8700:177;35433:15;35391:58;;-1:-1:-1;;;;;;35391:58:0;;;;;;;-1:-1:-1;;;;;18451:32:1;;;35391:58:0;;;18433:51:1;18500:18;;;18493:34;18406:18;;35391:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35374:96;35484:15;;-1:-1:-1;;;;;35484:15:0;:26;35519:2;35524:13;35519:2;-1:-1:-1;;;;;8851:18:0;8819:7;8851:18;;;:9;:18;;;;;;;8700:177;35524:13;35484:54;;-1:-1:-1;;;;;;35484:54:0;;;;;;;-1:-1:-1;;;;;18451:32:1;;;35484:54:0;;;18433:51:1;18500:18;;;18493:34;18406:18;;35484:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35480:70;32748:2809;;;;32635:2922;;;:::o;3375:226::-;3495:7;3531:12;3523:6;;;;3515:29;;;;-1:-1:-1;;;3515:29:0;;;;;;;;:::i;:::-;-1:-1:-1;3555:9:0;3567:5;3571:1;3567;:5;:::i;:::-;3555:17;3375:226;-1:-1:-1;;;;;3375:226:0:o;11710:451::-;-1:-1:-1;;;;;11794:21:0;;11786:67;;;;-1:-1:-1;;;11786:67:0;;18740:2:1;11786:67:0;;;18722:21:1;18779:2;18759:18;;;18752:30;18818:34;18798:18;;;18791:62;-1:-1:-1;;;18869:18:1;;;18862:31;18910:19;;11786:67:0;18538:397:1;11786:67:0;11945:105;11982:6;11945:105;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11945:18:0;;;;;;:9;:18;;;;;;;:105;:22;:105::i;:::-;-1:-1:-1;;;;;11924:18:0;;;;;;:9;:18;;;;;:126;12076:12;;:24;;12093:6;12076:16;:24::i;:::-;12061:12;:39;12116:37;;1818:25:1;;;12142:1:0;;-1:-1:-1;;;;;12116:37:0;;;;;1806:2:1;1791:18;12116:37:0;;;;;;;11710:451;;:::o;36743:1538::-;36981:22;;;;:45;;;;:22;;;;;:45;36977:329;;37048:187;;-1:-1:-1;;;19142:33:1;;19200:2;19191:12;37048:187:0;;;;;;;;37126:22;;;;37206:14;;37048:187;;37126:22;;;;;;;;37048:187;;;;-1:-1:-1;;;;;;;;;;;37048:187:0;;;37206:14;;;37048:187;:::i;:::-;;;;;;;;37250:22;;;:44;;-1:-1:-1;;37250:44:0;;;;;;;;;36977:329;37320:22;;;;:45;;;;:22;;;;;:45;37316:329;;37387:187;;-1:-1:-1;;;19630:33:1;;19688:2;19679:12;37387:187:0;;;;;;;;37465:22;;;;37545:14;;37387:187;;37465:22;;;;;;;;37387:187;;;;-1:-1:-1;;;;;;;;;;;37387:187:0;;;37545:14;;;37387:187;:::i;:::-;;;;;;;;37589:22;;;:44;;-1:-1:-1;;37589:44:0;;;;;;;;;37316:329;37659:17;;;;:35;;;;-1:-1:-1;;;37659:17:0;;;;:35;37655:294;;37716:172;;-1:-1:-1;;;19904:28:1;;19957:2;19948:12;37716:172:0;;;;;;;;37789:17;;;;37859:14;;37716:172;;37789:17;-1:-1:-1;;;37789:17:0;;;;;;37716:172;;;;-1:-1:-1;;;;;;;;;;;37716:172:0;;;37859:14;;;37716:172;:::i;:::-;;;;;;;;37903:17;;;:34;;-1:-1:-1;;37903:34:0;-1:-1:-1;;;37903:34:0;;;;;;;37655:294;37963:20;;;;:41;;;;-1:-1:-1;;;37963:20:0;;;;:41;37959:315;;38026:181;;-1:-1:-1;;;20173:31:1;;20229:2;20220:12;38026:181:0;;;;;;;;38102:20;;;;38178:14;;38026:181;;38102:20;-1:-1:-1;;;38102:20:0;;;;;;38026:181;;;;-1:-1:-1;;;;;;;;;;;38026:181:0;;;38178:14;;;38026:181;:::i;:::-;;;;;;;;38222:20;;;:40;;;;;-1:-1:-1;;;38222:40:0;-1:-1:-1;;38222:40:0;;;;;;36743:1538;;;;;:::o;10714:606::-;-1:-1:-1;;;;;10854:20:0;;10846:70;;;;-1:-1:-1;;;10846:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10935:23:0;;10927:71;;;;-1:-1:-1;;;10927:71:0;;;;;;;:::i;:::-;11087:108;11123:6;11087:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11087:17:0;;;;;;:9;:17;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;11067:17:0;;;;;;;:9;:17;;;;;;:128;;;;11229:20;;;;;;;:32;;11254:6;11229:24;:32::i;:::-;-1:-1:-1;;;;;11206:20:0;;;;;;;:9;:20;;;;;;;:55;;;;11277:35;;;;;;;;;;11305:6;1818:25:1;;1806:2;1791:18;;1672:177;38289:1505:0;38522:21;;;;:43;;;;:21;;:43;38518:322;;38587:184;;-1:-1:-1;;;20445:32:1;;20502:2;20493:12;38587:184:0;;;;;;;;38664:21;;;;38742:14;;38587:184;;38664:21;;;;;38587:184;;;;-1:-1:-1;;;;;;;;;;;38587:184:0;;;38742:14;;;38587:184;:::i;:::-;;;;;;;;38786:21;;;:42;;-1:-1:-1;;38786:42:0;;;;;;;38518:322;38854:21;;;;:43;;;;:21;;;;;:43;38850:322;;38919:184;;-1:-1:-1;;;20718:32:1;;20775:2;20766:12;38919:184:0;;;;;;;;38996:21;;;;39074:14;;38919:184;;38996:21;;;;;;;;38919:184;;;;-1:-1:-1;;;;;;;;;;;38919:184:0;;;39074:14;;;38919:184;:::i;:::-;;;;;;;;39118:21;;;:42;;-1:-1:-1;;39118:42:0;;;;;;;;;38850:322;39186:16;;;;:33;;;;-1:-1:-1;;;39186:16:0;;;;:33;39182:287;;39241:169;;-1:-1:-1;;;20991:27:1;;21043:2;21034:12;39241:169:0;;;;;;;;39313:16;;;;39381:14;;39241:169;;39313:16;-1:-1:-1;;;39313:16:0;;;;;;39241:169;;;;-1:-1:-1;;;;;;;;;;;39241:169:0;;;39381:14;;;39241:169;:::i;:::-;;;;;;;;39425:16;;;:32;;-1:-1:-1;;39425:32:0;-1:-1:-1;;;39425:32:0;;;;;;;39182:287;39483:19;;;;:39;;;;-1:-1:-1;;;39483:19:0;;;;:39;39479:308;;39544:178;;-1:-1:-1;;;21259:30:1;;21314:2;21305:12;39544:178:0;;;;;;;;39619:19;;;;39693:14;;39544:178;;39619:19;-1:-1:-1;;;39619:19:0;;;;;;39544:178;;;;-1:-1:-1;;;;;;;;;;;39544:178:0;;;39693:14;;;39544:178;:::i;:::-;;;;;;;;39737:19;;;:38;;;;;-1:-1:-1;;;39737:38:0;-1:-1:-1;;39737:38:0;;;;;;38289:1505;;;;;:::o;35565:1170::-;35641:13;:17;;-1:-1:-1;;35720:15:0;;;35748:231;;;;35796:23;;35780:13;:39;;35796:23;;;;-1:-1:-1;;35834:39:0;;;;;;;35796:23;35850;;;;;;35834:39;;;;;;;;-1:-1:-1;;35932:35:0;-1:-1:-1;;;35899:18:0;;;;35888:29;;;;-1:-1:-1;;35932:35:0;;-1:-1:-1;;;35946:21:0;;;;35932:35;;;;;;;;35748:231;35993:10;35989:234;;;36036:24;;36020:13;:40;;36036:24;;;;;;;;-1:-1:-1;;36075:40:0;;;;;;;36091:24;;;;;;36075:40;;;;;-1:-1:-1;;36175:36:0;-1:-1:-1;;;36141:19:0;;;;36130:30;;-1:-1:-1;;36175:36:0;;-1:-1:-1;;;36189:22:0;;;;;;;36175:36;;;;;;;35989:234;36238:10;36237:11;:27;;;;;36253:11;36252:12;36237:27;36233:251;;;36297:24;;36281:13;:40;;36297:24;;;;;;;;-1:-1:-1;;36336:40:0;;;;;;;36352:24;;;;;;36336:40;;;;;-1:-1:-1;;36436:36:0;-1:-1:-1;;;36402:19:0;;;;36391:30;;-1:-1:-1;;36436:36:0;;-1:-1:-1;;;36450:22:0;;;;;;;36436:36;;;;;;;36233:251;36549:11;;;;;;;;;36538:8;;;;;;36506:29;;36549:11;36522:13;;;;;36506;:29;:::i;:::-;:40;;;;:::i;:::-;:54;;;;:::i;:::-;36494:9;:66;;-1:-1:-1;;36494:66:0;;-1:-1:-1;;;36494:66:0;;;;;;;;;;;;;36576:151;;;36602:13;;;;;;;;;;21567:36:1;;36494:66:0;36630:13;;;;21634:2:1;21619:18;;21612:45;36658:8:0;;;;;21673:18:1;;;21666:45;;;;36681:11:0;;;;;21742:2:1;21727:18;;21720:45;36707:9:0;;;;;;21796:3:1;21781:19;;21774:46;36576:151:0;;21554:3:1;21539:19;36576:151:0;21328:498:1;39802:1524:0;39892:4;39848:23;8851:18;;;:9;:18;;;;;;40046:9;;8851:18;;39937:21;;40071:1;;40046:9;-1:-1:-1;;;40046:9:0;;;;;39998:31;;40016:13;8851:18;39998:31;:::i;:::-;39997:58;;;;:::i;:::-;:75;;;;:::i;:::-;40144:9;;39971:101;;-1:-1:-1;40083:24:0;;40144:9;-1:-1:-1;;;40144:9:0;;;;;40111:29;;40129:11;;;;;40111:15;:29;:::i;:::-;40110:43;;;;:::i;:::-;40083:70;-1:-1:-1;40164:20:0;40219:34;40083:70;40219:15;:34;:::i;:::-;40187:67;;:15;:67;:::i;:::-;40164:90;;40267:31;40285:12;40267:17;:31::i;:::-;40311:27;40341:41;40365:17;40341:21;:41;:::i;:::-;40474:11;;40311:71;;-1:-1:-1;40393:19:0;;40474:11;;;;;;;40463:8;;;;;;40442:17;;40463:8;;40442:13;:17;:::i;:::-;40441:30;;;;:::i;:::-;:44;;;;:::i;:::-;40415:9;;:71;;;-1:-1:-1;;;40415:9:0;;;;:71;:::i;:::-;40549:13;;40393:93;;;;;-1:-1:-1;40497:26:0;;40606:1;;40393:93;;40527:35;;40549:13;40527:19;:35;:::i;:::-;40526:64;;;;:::i;:::-;:81;;;;:::i;:::-;40497:110;-1:-1:-1;40618:26:0;40647:42;40497:110;40647:19;:42;:::i;:::-;40710:9;;40702:47;;40618:71;;-1:-1:-1;;;;;;40710:9:0;;40702:47;;;;;40618:71;;40710:9;40702:47;40710:9;40702:47;40618:71;40710:9;40702:47;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40766:19:0;;40762:253;;40802:50;40816:15;40833:18;40802:13;:50::i;:::-;40872:131;;;22403:25:1;;;22459:2;22444:18;;22437:34;;;22487:18;;;22480:34;;;40872:131:0;;22391:2:1;22376:18;40872:131:0;;;;;;;40762:253;41095:15;;41042:111;;-1:-1:-1;;;41042:111:0;;-1:-1:-1;;;;;41095:15:0;;;41042:111;;;18433:51:1;18500:18;;;18493:34;;;41027:12:0;;41057:4;;41042:30;;18406:18:1;;41042:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41027:126;;41168:7;41164:155;;;41192:15;;:64;;-1:-1:-1;;;41192:64:0;;;;;1818:25:1;;;-1:-1:-1;;;;;41192:15:0;;;;:46;;1791:18:1;;41192:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41276:31;41290:16;41276:31;;;;1818:25:1;;1806:2;1791:18;;1672:177;41276:31:0;;;;;;;;41164:155;39837:1489;;;;;;;;;;39802:1524::o;3231:136::-;3289:7;3316:43;3320:1;3323;3316:43;;;;;;;;;;;;;;;;;:3;:43::i;41334:500::-;41425:16;;;41439:1;41425:16;;;;;;;;41401:21;;41425:16;;;;;;;;;;-1:-1:-1;41425:16:0;41401:40;;41470:4;41452;41457:1;41452:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;41452:23:0;;;:7;;;;;;;;;;:23;;;;41496:15;;:22;;;-1:-1:-1;;;41496:22:0;;;;:15;;;;;:20;;:22;;;;;41452:7;;41496:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41486:4;41491:1;41486:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;41486:32:0;;;:7;;;;;;;;;:32;41561:15;;41529:62;;41546:4;;41561:15;41579:11;41529:8;:62::i;:::-;41602:15;;:224;;-1:-1:-1;;;41602:224:0;;-1:-1:-1;;;;;41602:15:0;;;;:66;;:224;;41683:11;;41602:15;;41753:4;;41780;;41800:15;;41602:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41390:444;41334:500;:::o;41842:423::-;41956:15;;41924:62;;41941:4;;-1:-1:-1;;;;;41956:15:0;41974:11;41924:8;:62::i;:::-;41997:15;;42201;;41997:260;;-1:-1:-1;;;41997:260:0;;42069:4;41997:260;;;24650:34:1;24700:18;;;24693:34;;;41997:15:0;24743:18:1;;;24736:34;;;24786:18;;;24779:34;-1:-1:-1;;;;;42201:15:0;;;24829:19:1;;;24822:44;42231:15:0;24882:19:1;;;24875:35;41997:15:0;;;:31;;42036:9;;24584:19:1;;41997:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;206:597:1:-;318:4;347:2;376;365:9;358:21;408:6;402:13;451:6;446:2;435:9;431:18;424:34;476:1;486:140;500:6;497:1;494:13;486:140;;;595:14;;;591:23;;585:30;561:17;;;580:2;557:26;550:66;515:10;;486:140;;;644:6;641:1;638:13;635:91;;;714:1;709:2;700:6;689:9;685:22;681:31;674:42;635:91;-1:-1:-1;787:2:1;766:15;-1:-1:-1;;762:29:1;747:45;;;;794:2;743:54;;206:597;-1:-1:-1;;;206:597:1:o;808:131::-;-1:-1:-1;;;;;883:31:1;;873:42;;863:70;;929:1;926;919:12;944:315;1012:6;1020;1073:2;1061:9;1052:7;1048:23;1044:32;1041:52;;;1089:1;1086;1079:12;1041:52;1128:9;1115:23;1147:31;1172:5;1147:31;:::i;:::-;1197:5;1249:2;1234:18;;;;1221:32;;-1:-1:-1;;;944:315:1:o;1264:180::-;1323:6;1376:2;1364:9;1355:7;1351:23;1347:32;1344:52;;;1392:1;1389;1382:12;1344:52;-1:-1:-1;1415:23:1;;1264:180;-1:-1:-1;1264:180:1:o;1854:456::-;1931:6;1939;1947;2000:2;1988:9;1979:7;1975:23;1971:32;1968:52;;;2016:1;2013;2006:12;1968:52;2055:9;2042:23;2074:31;2099:5;2074:31;:::i;:::-;2124:5;-1:-1:-1;2181:2:1;2166:18;;2153:32;2194:33;2153:32;2194:33;:::i;:::-;1854:456;;2246:7;;-1:-1:-1;;;2300:2:1;2285:18;;;;2272:32;;1854:456::o;2504:247::-;2563:6;2616:2;2604:9;2595:7;2591:23;2587:32;2584:52;;;2632:1;2629;2622:12;2584:52;2671:9;2658:23;2690:31;2715:5;2690:31;:::i;2964:156::-;3030:20;;3090:4;3079:16;;3069:27;;3059:55;;3110:1;3107;3100:12;3059:55;2964:156;;;:::o;3125:393::-;3203:6;3211;3219;3227;3280:3;3268:9;3259:7;3255:23;3251:33;3248:53;;;3297:1;3294;3287:12;3248:53;3320:27;3337:9;3320:27;:::i;:::-;3310:37;;3366:36;3398:2;3387:9;3383:18;3366:36;:::i;:::-;3356:46;;3421:36;3453:2;3442:9;3438:18;3421:36;:::i;:::-;3411:46;;3476:36;3508:2;3497:9;3493:18;3476:36;:::i;:::-;3466:46;;3125:393;;;;;;;:::o;3756:118::-;3842:5;3835:13;3828:21;3821:5;3818:32;3808:60;;3864:1;3861;3854:12;3879:382;3944:6;3952;4005:2;3993:9;3984:7;3980:23;3976:32;3973:52;;;4021:1;4018;4011:12;3973:52;4060:9;4047:23;4079:31;4104:5;4079:31;:::i;:::-;4129:5;-1:-1:-1;4186:2:1;4171:18;;4158:32;4199:30;4158:32;4199:30;:::i;:::-;4248:7;4238:17;;;3879:382;;;;;:::o;4690:388::-;4758:6;4766;4819:2;4807:9;4798:7;4794:23;4790:32;4787:52;;;4835:1;4832;4825:12;4787:52;4874:9;4861:23;4893:31;4918:5;4893:31;:::i;:::-;4943:5;-1:-1:-1;5000:2:1;4985:18;;4972:32;5013:33;4972:32;5013:33;:::i;5083:380::-;5162:1;5158:12;;;;5205;;;5226:61;;5280:4;5272:6;5268:17;5258:27;;5226:61;5333:2;5325:6;5322:14;5302:18;5299:38;5296:161;;5379:10;5374:3;5370:20;5367:1;5360:31;5414:4;5411:1;5404:15;5442:4;5439:1;5432:15;5296:161;;5083:380;;;:::o;5468:356::-;5670:2;5652:21;;;5689:18;;;5682:30;5748:34;5743:2;5728:18;;5721:62;5815:2;5800:18;;5468:356::o;6446:127::-;6507:10;6502:3;6498:20;6495:1;6488:31;6538:4;6535:1;6528:15;6562:4;6559:1;6552:15;6578:168;6618:7;6684:1;6680;6676:6;6672:14;6669:1;6666:21;6661:1;6654:9;6647:17;6643:45;6640:71;;;6691:18;;:::i;:::-;-1:-1:-1;6731:9:1;;6578:168::o;6751:127::-;6812:10;6807:3;6803:20;6800:1;6793:31;6843:4;6840:1;6833:15;6867:4;6864:1;6857:15;6883:120;6923:1;6949;6939:35;;6954:18;;:::i;:::-;-1:-1:-1;6988:9:1;;6883:120::o;7827:184::-;7897:6;7950:2;7938:9;7929:7;7925:23;7921:32;7918:52;;;7966:1;7963;7956:12;7918:52;-1:-1:-1;7989:16:1;;7827:184;-1:-1:-1;7827:184:1:o;8321:245::-;8388:6;8441:2;8429:9;8420:7;8416:23;8412:32;8409:52;;;8457:1;8454;8447:12;8409:52;8489:9;8483:16;8508:28;8530:5;8508:28;:::i;8571:204::-;8609:3;8645:4;8642:1;8638:12;8677:4;8674:1;8670:12;8712:3;8706:4;8702:14;8697:3;8694:23;8691:49;;;8720:18;;:::i;:::-;8756:13;;8571:204;-1:-1:-1;;;8571:204:1:o;9814:406::-;10016:2;9998:21;;;10055:2;10035:18;;;10028:30;10094:34;10089:2;10074:18;;10067:62;-1:-1:-1;;;10160:2:1;10145:18;;10138:40;10210:3;10195:19;;9814:406::o;14149:128::-;14189:3;14220:1;14216:6;14213:1;14210:13;14207:39;;;14226:18;;:::i;:::-;-1:-1:-1;14262:9:1;;14149:128::o;15446:401::-;15648:2;15630:21;;;15687:2;15667:18;;;15660:30;15726:34;15721:2;15706:18;;15699:62;-1:-1:-1;;;15792:2:1;15777:18;;15770:35;15837:3;15822:19;;15446:401::o;15852:399::-;16054:2;16036:21;;;16093:2;16073:18;;;16066:30;16132:34;16127:2;16112:18;;16105:62;-1:-1:-1;;;16198:2:1;16183:18;;16176:33;16241:3;16226:19;;15852:399::o;17853:125::-;17893:4;17921:1;17918;17915:8;17912:34;;;17926:18;;:::i;:::-;-1:-1:-1;17963:9:1;;17853:125::o;19214:209::-;-1:-1:-1;;19378:38:1;;;;19360:57;;19348:2;19333:18;;19214:209::o;21831:165::-;21869:1;21903:4;21900:1;21896:12;21927:3;21917:37;;21934:18;;:::i;:::-;21986:3;21979:4;21976:1;21972:12;21968:22;21963:27;;;21831:165;;;;:::o;22001:195::-;22039:4;22076;22073:1;22069:12;22108:4;22105:1;22101:12;22133:3;22128;22125:12;22122:38;;;22140:18;;:::i;:::-;22177:13;;;22001:195;-1:-1:-1;;;22001:195:1:o;22936:127::-;22997:10;22992:3;22988:20;22985:1;22978:31;23028:4;23025:1;23018:15;23052:4;23049:1;23042:15;23068:251;23138:6;23191:2;23179:9;23170:7;23166:23;23162:32;23159:52;;;23207:1;23204;23197:12;23159:52;23239:9;23233:16;23258:31;23283:5;23258:31;:::i;23324:980::-;23586:4;23634:3;23623:9;23619:19;23665:6;23654:9;23647:25;23691:2;23729:6;23724:2;23713:9;23709:18;23702:34;23772:3;23767:2;23756:9;23752:18;23745:31;23796:6;23831;23825:13;23862:6;23854;23847:22;23900:3;23889:9;23885:19;23878:26;;23939:2;23931:6;23927:15;23913:29;;23960:1;23970:195;23984:6;23981:1;23978:13;23970:195;;;24049:13;;-1:-1:-1;;;;;24045:39:1;24033:52;;24140:15;;;;24105:12;;;;24081:1;23999:9;23970:195;;;-1:-1:-1;;;;;;;24221:32:1;;;;24216:2;24201:18;;24194:60;-1:-1:-1;;;24285:3:1;24270:19;24263:35;24182:3;23324:980;-1:-1:-1;;;23324:980:1:o;24921:306::-;25009:6;25017;25025;25078:2;25066:9;25057:7;25053:23;25049:32;25046:52;;;25094:1;25091;25084:12;25046:52;25123:9;25117:16;25107:26;;25173:2;25162:9;25158:18;25152:25;25142:35;;25217:2;25206:9;25202:18;25196:25;25186:35;;24921:306;;;;;:::o

Swarm Source

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