ETH Price: $3,107.77 (-2.37%)

Token

Asap Sniper Bot (ASAP)
 

Overview

Max Total Supply

1,000,000,000 ASAP

Holders

1,071 (0.00%)

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$66,900.00

Circulating Supply Market Cap

$39,774.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
39,631.197576709159472088 ASAP

Value
$2.65 ( ~0.000852700547510974 Eth) [0.0040%]
0x88e861b3d8861af336c491c277288d959601db9d
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

AsapBot provides an on-chain real-time new token discovery alert from the blockchain, as well as sniping services.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ASAP

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-07
*/

/*
Token Name : ASAP - Auto discord dex sniper BOT
SYMBOL : ASAP
The fastest discord DEX (uniswap, pancakeswap ) sniper bot , Be the first to buy the next 1000X tokens.
Buy/sell Tax 4/4: 
Treasury : 2% 
liquidity Pool : 1%
Holders reward (paid in ether) : 1%
website : https://asapbot.xyz/
twitter : https://twitter.com/MyAsapBot
Telegram :https://t.me/myasapbot

Features
New Token listing
Manual Buy/Sell
Auto-Buying
Degen Vault
Hold & Earn
*/
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;


/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

    function name() external pure returns (string memory);

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

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

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

contract ASAP is Pausable, Ownable, IERC20 {
    address constant UNISWAPROUTER =
        address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address constant ZERO = 0x0000000000000000000000000000000000000000;

    string private constant _name = "Asap Sniper Bot";
    string private constant _symbol = "ASAP";

    uint256 public buyTreasuryFeeBPS = 200;
    uint256 public buyLiquidityFeeBPS = 100;
    uint256 public buyRewardFeeBPS = 100;
    uint256 public buyTotalFeeBPS = 400;

    uint256 public sellTreasuryFeeBPS = 200;
    uint256 public sellLiquidityFeeBPS = 100;
    uint256 public sellRewardFeeBPS = 100;
    uint256 public sellTotalFeeBPS = 400;

    uint256 public tokensForTreasury;
    uint256 public tokensForLiquidity;
    uint256 public tokensForRewards;

    uint256 public swapTokensAtAmount = 100000 * (10**18);
    uint256 public lastSwapTime;
    bool swapAllToken = true;

    bool public swapEnabled = true;
    bool public taxEnabled = true;
    bool public transferTaxEnabled = false;
    bool public compoundingEnabled = true;

    uint256 private _totalSupply;
    bool private swapping;
    bool private isCompounding;

    address treasuryWallet;
    address liquidityWallet;

    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(address => bool) private _whiteList;
    mapping(address => bool) isBlacklisted;

    event SwapAndAddLiquidity(
        uint256 tokensSwapped,
        uint256 nativeReceived,
        uint256 tokensIntoLiquidity
    );
    event SendRewards(uint256 tokensSwapped, uint256 amount);
    event SendTreasury(uint256 tokensSwapped, uint256 amount);
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );
    event SwapEnabled(bool enabled);
    event TaxEnabled(bool enabled);
    event TransferTaxEnabled(bool enabled);
    event CompoundingEnabled(bool enabled);
    event BlacklistEnabled(bool enabled);
    event SellFeeUpdated(uint256 treasury, uint256 liquidity, uint256 reward);
    event BuyFeeUpdated(uint256 treasury, uint256 liquidity, uint256 reward);
    event WalletUpdated(address treasury, address liquidity);
    event TradingEnabled();
    event UniswapV2RouterUpdated();
    event RewardSettingsUpdated(
        bool swapEnabled,
        uint256 swapTokensAtAmount,
        bool swapAllToken
    );
    event AccountExcludedFromMaxTx(address account);
    event AccountExcludedFromMaxWallet(address account);
    event MaxWalletBPSUpdated(uint256 bps);
    event TokenRescued(address token, uint256 amount);
    event ETHRescued(uint256 amount);
    event AccountBlacklisted(address account);
    event AccountWhitelisted(address account);
    event LogErrorString(string message);

    RewardTracker public immutable rewardTracker;
    IUniswapV2Router02 public uniswapV2Router;

    address public uniswapV2Pair;

    uint256 public maxTxBPS = 50;
    uint256 public maxWalletBPS = 250;

    bool isOpen = false;

    mapping(address => bool) private _isExcludedFromMaxTx;
    mapping(address => bool) private _isExcludedFromMaxWallet;

    constructor() {
        treasuryWallet = owner();
        liquidityWallet = owner();

        rewardTracker = new RewardTracker(address(this), UNISWAPROUTER);

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(UNISWAPROUTER);

        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        rewardTracker.excludeFromRewards(address(rewardTracker), true);
        rewardTracker.excludeFromRewards(address(this), true);
        rewardTracker.excludeFromRewards(owner(), true);
        rewardTracker.excludeFromRewards(address(_uniswapV2Router), true);

        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(rewardTracker), true);

        excludeFromMaxTx(owner(), true);
        excludeFromMaxTx(address(this), true);
        excludeFromMaxTx(address(rewardTracker), true);

        excludeFromMaxWallet(owner(), true);
        excludeFromMaxWallet(address(this), true);
        excludeFromMaxWallet(address(rewardTracker), true);

        _mint(owner(), 1000000000 * (10**18));
    }

    receive() external payable {}

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

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

    function decimals() public pure 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 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 increaseAllowance(address spender, uint256 addedValue)
        public
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] + addedValue
        );
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        returns (bool)
    {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(
            currentAllowance >= subtractedValue,
            "ASAP: decreased allowance below zero"
        );
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        return true;
    }

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(
            currentAllowance >= amount,
            "ASAP: transfer amount exceeds allowance"
        );
        _approve(sender, _msgSender(), currentAllowance - amount);
        return true;
    }

    function openTrading() external onlyOwner {
        isOpen = true;
        emit TradingEnabled();
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal {
        require(
            isOpen ||
                sender == owner() ||
                recipient == owner() ||
                _whiteList[sender] ||
                _whiteList[recipient],
            "Not Open"
        );

        require(!isBlacklisted[sender], "ASAP: Sender is blacklisted");
        require(!isBlacklisted[recipient], "ASAP: Recipient is blacklisted");

        require(sender != address(0), "ASAP: transfer from the zero address");
        require(recipient != address(0), "ASAP: transfer to the zero address");

        uint256 _maxTxAmount = (totalSupply() * maxTxBPS) / 10000;
        uint256 _maxWallet = (totalSupply() * maxWalletBPS) / 10000;
        require(
            amount <= _maxTxAmount || _isExcludedFromMaxTx[sender],
            "TX Limit Exceeded"
        );

        if (
            sender != owner() &&
            recipient != address(this) &&
            recipient != address(DEAD) &&
            recipient != uniswapV2Pair
        ) {
            uint256 currentBalance = balanceOf(recipient);
            require(
                _isExcludedFromMaxWallet[recipient] ||
                    (currentBalance + amount <= _maxWallet),
                "Wallet hold too large amount of token"
            );
        }

        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "ASAP: transfer amount exceeds balance"
        );

        uint256 contractTokenBalance = balanceOf(address(this));
        uint256 contractNativeBalance = address(this).balance;

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            swapEnabled && // True
            canSwap && // true
            !swapping && // swapping=false !false true
            !automatedMarketMakerPairs[sender] && // no swap on remove liquidity step 1 or DEX buy
            sender != address(uniswapV2Router) && // no swap on remove liquidity step 2
            sender != owner() &&
            recipient != owner()
        ) {
            swapping = true;

            if (!swapAllToken) {
                contractTokenBalance = swapTokensAtAmount;
            }
            _executeSwap(contractTokenBalance, contractNativeBalance);

            lastSwapTime = block.timestamp;
            swapping = false;
        }

        bool takeFee;

        if (
            sender == address(uniswapV2Pair) ||
            recipient == address(uniswapV2Pair) ||
            automatedMarketMakerPairs[recipient] ||
            automatedMarketMakerPairs[sender] ||
            transferTaxEnabled
        ) {
            takeFee = true;
        }

        if (_isExcludedFromFees[sender] || _isExcludedFromFees[recipient]) {
            takeFee = false;
        }

        if (swapping || isCompounding || !taxEnabled) {
            takeFee = false;
        }

        if (takeFee) {
            uint256 fees;
            // selling
            if (automatedMarketMakerPairs[recipient] && sellTotalFeeBPS > 0) {
                fees = (amount * sellTotalFeeBPS) / 10000;
                tokensForTreasury +=
                    (fees * sellTreasuryFeeBPS) /
                    sellTotalFeeBPS;
                tokensForRewards += (fees * sellRewardFeeBPS) / sellTotalFeeBPS;
                tokensForLiquidity +=
                    (fees * sellLiquidityFeeBPS) /
                    sellTotalFeeBPS;
            } else if (
                automatedMarketMakerPairs[sender] && buyTotalFeeBPS > 0
            ) {
                // buying
                fees = (amount * buyTotalFeeBPS) / 10000;
                tokensForTreasury +=
                    (fees * buyTreasuryFeeBPS) /
                    buyTotalFeeBPS;
                tokensForRewards += (fees * buyRewardFeeBPS) / buyTotalFeeBPS;
                tokensForLiquidity +=
                    (fees * buyLiquidityFeeBPS) /
                    buyTotalFeeBPS;
            }
            amount -= fees;
            _executeTransfer(sender, address(this), fees);
        }

        _executeTransfer(sender, recipient, amount);

        rewardTracker.setBalance(payable(sender), balanceOf(sender));
        rewardTracker.setBalance(payable(recipient), balanceOf(recipient));
    }

    function _executeTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        require(sender != address(0), "ASAP: transfer from the zero address");
        require(recipient != address(0), "ASAP: transfer to the zero address");
        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "ASAP: transfer amount exceeds balance"
        );
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;
        emit Transfer(sender, recipient, amount);
    }

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

    function _mint(address account, uint256 amount) private {
        require(account != address(0), "ASAP: mint to the zero address");
        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) private {
        require(account != address(0), "ASAP: burn from the zero address");
        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ASAP: burn amount exceeds balance");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;
        emit Transfer(account, address(0), amount);
    }

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

    function addLiquidity(uint256 tokens, uint256 native) private {
        _approve(address(this), address(uniswapV2Router), tokens);
        uniswapV2Router.addLiquidityETH{value: native}(
            address(this),
            tokens,
            0, // slippage unavoidable
            0, // slippage unavoidable
            liquidityWallet,
            block.timestamp
        );
    }

    function includeToWhiteList(address[] memory _users) private {
        for (uint8 i = 0; i < _users.length; i++) {
            _whiteList[_users[i]] = true;
        }
    }

    function _executeSwap(uint256 tokens, uint256 native) private {
        if (tokens <= 0) {
            return;
        }

        uint256 swapTokensTreasury;
        if (address(treasuryWallet) != address(0)) {
            swapTokensTreasury = tokensForTreasury;
        }

        uint256 swapTokensRewards;
        if (rewardTracker.totalSupply() > 0) {
            swapTokensRewards = tokensForRewards;
        }

        uint256 swapTokensLiquidity = tokensForLiquidity / 2;
        uint256 addTokensLiquidity = tokensForLiquidity - swapTokensLiquidity;
        uint256 swapTokensTotal = swapTokensRewards +
            swapTokensTreasury +
            swapTokensLiquidity;

        uint256 initNativeBal = address(this).balance;
        swapTokensForNative(swapTokensTotal);
        uint256 nativeSwapped = (address(this).balance - initNativeBal) +
            native;

        tokensForTreasury = 0;
        tokensForRewards = 0;
        tokensForLiquidity = 0;

        uint256 nativeTreasury = (nativeSwapped * swapTokensTreasury) /
            swapTokensTotal;
        uint256 nativeRewards = (nativeSwapped * swapTokensRewards) /
            swapTokensTotal;
        uint256 nativeLiquidity = nativeSwapped -
            nativeTreasury -
            nativeRewards;

        if (nativeTreasury > 0) {
            (bool success, ) = payable(treasuryWallet).call{
                value: nativeTreasury
            }("");
            if (success) {
                emit SendTreasury(swapTokensTreasury, nativeTreasury);
            } else {
                emit LogErrorString("Wallet failed to receive treasury tokens");
            }
        }

        addLiquidity(addTokensLiquidity, nativeLiquidity);
        emit SwapAndAddLiquidity(
            swapTokensLiquidity,
            nativeLiquidity,
            addTokensLiquidity
        );

        if (nativeRewards > 0) {
            (bool success, ) = address(rewardTracker).call{
                value: nativeRewards
            }("");
            if (success) {
                emit SendRewards(swapTokensRewards, nativeRewards);
            } else {
                emit LogErrorString("Tracker failed to receive tokens");
            }
        }
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(
            _isExcludedFromFees[account] != excluded,
            "ASAP: account is already set to requested state"
        );
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

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

    function manualSendReward(uint256 amount, address holder)
        external
        onlyOwner
    {
        rewardTracker.manualSendReward(amount, holder);
    }

    function excludeFromRewards(address account, bool excluded)
        public
        onlyOwner
    {
        rewardTracker.excludeFromRewards(account, excluded);
    }

    function isExcludedFromRewards(address account) public view returns (bool) {
        return rewardTracker.isExcludedFromRewards(account);
    }

    function setWallet(
        address payable _treasuryWallet,
        address payable _liquidityWallet
    ) external onlyOwner {
        require(
            _liquidityWallet != address(0),
            "_liquidityWallet can not be zero address!"
        );
        require(
            _treasuryWallet != address(0),
            "_treasuryWallet can not be zero address!"
        );

        treasuryWallet = _treasuryWallet;
        liquidityWallet = _liquidityWallet;

        emit WalletUpdated(treasuryWallet, liquidityWallet);
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        require(pair != uniswapV2Pair, "ASAP: DEX pair can not be removed");
        _setAutomatedMarketMakerPair(pair, value);
    }

    function setBuyFee(
        uint256 _treasuryFee,
        uint256 _liquidityFee,
        uint256 _rewardFee
    ) external onlyOwner {
        buyTreasuryFeeBPS = _treasuryFee;
        buyLiquidityFeeBPS = _liquidityFee;
        buyRewardFeeBPS = _rewardFee;
        buyTotalFeeBPS = _treasuryFee + _liquidityFee + _rewardFee;
        require(buyTotalFeeBPS <= 5000, "Total buy fee is too large");
        emit BuyFeeUpdated(_treasuryFee, _liquidityFee, _rewardFee);
    }

    function setSellFee(
        uint256 _treasuryFee,
        uint256 _liquidityFee,
        uint256 _rewardFee
    ) external onlyOwner {
        sellTreasuryFeeBPS = _treasuryFee;
        sellLiquidityFeeBPS = _liquidityFee;
        sellRewardFeeBPS = _rewardFee;
        sellTotalFeeBPS = _treasuryFee + _liquidityFee + _rewardFee;
        require(sellTotalFeeBPS <= 5000, "Total sell fee is too large");
        emit SellFeeUpdated(_treasuryFee, _liquidityFee, _rewardFee);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "ASAP: automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;
        if (value) {
            rewardTracker.excludeFromRewards(pair, true);
        }
        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(
            newAddress != address(0),
            "uniswapV2Router can not be zero address!"
        );
        require(
            newAddress != address(uniswapV2Router),
            "ASAP: the router is already set to the new address"
        );

        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
        address _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory())
            .createPair(address(this), uniswapV2Router.WETH());
        uniswapV2Pair = _uniswapV2Pair;

        emit UniswapV2RouterUpdated();
    }

    function claim() public {
        rewardTracker.processAccount(payable(_msgSender()));
    }

    function compound() public {
        require(compoundingEnabled, "ASAP: compounding is not enabled");
        isCompounding = true;
        rewardTracker.compoundAccount(payable(_msgSender()));
        isCompounding = false;
    }

    function withdrawableRewardOf(address account)
        public
        view
        returns (uint256)
    {
        return rewardTracker.withdrawableRewardOf(account);
    }

    function withdrawnRewardOf(address account) public view returns (uint256) {
        return rewardTracker.withdrawnRewardOf(account);
    }

    function accumulativeRewardOf(address account)
        public
        view
        returns (uint256)
    {
        return rewardTracker.accumulativeRewardOf(account);
    }

    function getAccountInfo(address account)
        public
        view
        returns (
            address,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        return rewardTracker.getAccountInfo(account);
    }

    function getLastClaimTime(address account) public view returns (uint256) {
        return rewardTracker.getLastClaimTime(account);
    }

    function setSwapEnabled(bool _enabled) external onlyOwner {
        swapEnabled = _enabled;
        emit SwapEnabled(_enabled);
    }

    function setTaxEnabled(bool _enabled) external onlyOwner {
        taxEnabled = _enabled;
        emit TaxEnabled(_enabled);
    }

    function setTransferTaxEnabled(bool _enabled) external onlyOwner {
        transferTaxEnabled = _enabled;
        emit TransferTaxEnabled(_enabled);
    }

    function setCompoundingEnabled(bool _enabled) external onlyOwner {
        compoundingEnabled = _enabled;
        emit CompoundingEnabled(_enabled);
    }

    function updateRewardSettings(
        bool _swapEnabled,
        uint256 _swapTokensAtAmount,
        bool _swapAllToken
    ) external onlyOwner {
        swapEnabled = _swapEnabled;
        swapTokensAtAmount = _swapTokensAtAmount;
        swapAllToken = _swapAllToken;

        emit RewardSettingsUpdated(
            swapEnabled,
            swapTokensAtAmount,
            swapAllToken
        );
    }

    function setMaxTxBPS(uint256 bps) external onlyOwner {
        require(bps >= 75 && bps <= 10000, "BPS must be between 75 and 10000");
        maxTxBPS = bps;
    }

    function excludeFromMaxTx(address account, bool excluded) public onlyOwner {
        _isExcludedFromMaxTx[account] = excluded;
        emit AccountExcludedFromMaxTx(account);
    }

    function isExcludedFromMaxTx(address account) public view returns (bool) {
        return _isExcludedFromMaxTx[account];
    }

    function setMaxWalletBPS(uint256 bps) external onlyOwner {
        require(
            bps >= 175 && bps <= 10000,
            "BPS must be between 175 and 10000"
        );
        maxWalletBPS = bps;
        emit MaxWalletBPSUpdated(bps);
    }

    function excludeFromMaxWallet(address account, bool excluded)
        public
        onlyOwner
    {
        _isExcludedFromMaxWallet[account] = excluded;
        emit AccountExcludedFromMaxWallet(account);
    }

    function isExcludedFromMaxWallet(address account)
        public
        view
        returns (bool)
    {
        return _isExcludedFromMaxWallet[account];
    }

    function rescueToken(address _token, uint256 _amount) external onlyOwner {
        IERC20(_token).transfer(msg.sender, _amount);

        emit TokenRescued(_token, _amount);
    }

    function rescueETH(uint256 _amount) external onlyOwner {
        (bool success, ) = payable(msg.sender).call{value: _amount}("");
        require(success, "ETH rescue failed.");
        emit ETHRescued(_amount);
    }

    function blackList(address _user) public onlyOwner {
        require(!isBlacklisted[_user], "user already blacklisted");
        isBlacklisted[_user] = true;
        emit AccountBlacklisted(_user);
    }

    function removeFromBlacklist(address _user) public onlyOwner {
        require(isBlacklisted[_user], "user already whitelisted");
        isBlacklisted[_user] = false;
        emit AccountWhitelisted(_user);
    }

    function blackListMany(address[] memory _users) public onlyOwner {
        for (uint8 i = 0; i < _users.length; i++) {
            blackList(_users[i]);
        }
    }

    function unBlackListMany(address[] memory _users) public onlyOwner {
        for (uint8 i = 0; i < _users.length; i++) {
            removeFromBlacklist(_users[i]);
        }
    }
}

contract RewardTracker is Ownable, IERC20 {
    address immutable UNISWAPROUTER;

    string private constant _name = "ASAP_RewardTracker";
    string private constant _symbol = "ASAP_RewardTracker";

    uint256 public lastProcessedIndex;

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

    uint256 private constant magnitude = 2**128;
    uint256 public immutable minTokenBalanceForRewards;
    uint256 private magnifiedRewardPerShare;
    uint256 public totalRewardsDistributed;
    uint256 public totalRewardsWithdrawn;

    address public immutable tokenAddress;

    mapping(address => bool) public excludedFromRewards;
    mapping(address => int256) private magnifiedRewardCorrections;
    mapping(address => uint256) private withdrawnRewards;
    mapping(address => uint256) private lastClaimTimes;

    event RewardsDistributed(address indexed from, uint256 weiAmount);
    event RewardWithdrawn(address indexed to, uint256 weiAmount);
    event ExcludeFromRewards(address indexed account, bool excluded);
    event Claim(address indexed account, uint256 amount);
    event Compound(address indexed account, uint256 amount, uint256 tokens);
    event LogErrorString(string message);

    struct AccountInfo {
        address account;
        uint256 withdrawableRewards;
        uint256 totalRewards;
        uint256 lastClaimTime;
    }

    constructor(address _tokenAddress, address _uniswapRouter) {
        minTokenBalanceForRewards = 1 * (10**18);
        tokenAddress = _tokenAddress;
        UNISWAPROUTER = _uniswapRouter;
    }

    receive() external payable {
        distributeRewards();
    }

    function distributeRewards() public payable {
        require(_totalSupply > 0, "Total supply invalid");
        if (msg.value > 0) {
            magnifiedRewardPerShare =
                magnifiedRewardPerShare +
                ((msg.value * magnitude) / _totalSupply);
            emit RewardsDistributed(msg.sender, msg.value);
            totalRewardsDistributed += msg.value;
        }
    }

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

    function excludeFromRewards(address account, bool excluded)
        external
        onlyOwner
    {
        require(
            excludedFromRewards[account] != excluded,
            "ASAP_RewardTracker: account already set to requested state"
        );
        excludedFromRewards[account] = excluded;
        if (excluded) {
            _setBalance(account, 0);
        } else {
            uint256 newBalance = IERC20(tokenAddress).balanceOf(account);
            if (newBalance >= minTokenBalanceForRewards) {
                _setBalance(account, newBalance);
            } else {
                _setBalance(account, 0);
            }
        }
        emit ExcludeFromRewards(account, excluded);
    }

    function isExcludedFromRewards(address account) public view returns (bool) {
        return excludedFromRewards[account];
    }

    function manualSendReward(uint256 amount, address holder)
        external
        onlyOwner
    {
        uint256 contractETHBalance = address(this).balance;
        (bool success, ) = payable(holder).call{
            value: amount > 0 ? amount : contractETHBalance
        }("");
        require(success, "Manual send failed.");
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = _balances[account];
        if (newBalance > currentBalance) {
            uint256 addAmount = newBalance - currentBalance;
            _mint(account, addAmount);
        } else if (newBalance < currentBalance) {
            uint256 subAmount = currentBalance - newBalance;
            _burn(account, subAmount);
        }
    }

    function _mint(address account, uint256 amount) private {
        require(
            account != address(0),
            "ASAP_RewardTracker: mint to the zero address"
        );
        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
        magnifiedRewardCorrections[account] =
            magnifiedRewardCorrections[account] -
            int256(magnifiedRewardPerShare * amount);
    }

    function _burn(address account, uint256 amount) private {
        require(
            account != address(0),
            "ASAP_RewardTracker: burn from the zero address"
        );
        uint256 accountBalance = _balances[account];
        require(
            accountBalance >= amount,
            "ASAP_RewardTracker: burn amount exceeds balance"
        );
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;
        emit Transfer(account, address(0), amount);
        magnifiedRewardCorrections[account] =
            magnifiedRewardCorrections[account] +
            int256(magnifiedRewardPerShare * amount);
    }

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

    function _withdrawRewardOfUser(address payable account)
        private
        returns (uint256)
    {
        uint256 _withdrawableReward = withdrawableRewardOf(account);
        if (_withdrawableReward > 0) {
            withdrawnRewards[account] += _withdrawableReward;
            totalRewardsWithdrawn += _withdrawableReward;
            (bool success, ) = account.call{value: _withdrawableReward}("");
            if (!success) {
                withdrawnRewards[account] -= _withdrawableReward;
                totalRewardsWithdrawn -= _withdrawableReward;
                emit LogErrorString("Withdraw failed");
                return 0;
            }
            emit RewardWithdrawn(account, _withdrawableReward);
            return _withdrawableReward;
        }
        return 0;
    }

    function compoundAccount(address payable account)
        public
        onlyOwner
        returns (bool)
    {
        (uint256 amount, uint256 tokens) = _compoundRewardOfUser(account);
        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Compound(account, amount, tokens);
            return true;
        }
        return false;
    }

    function _compoundRewardOfUser(address payable account)
        private
        returns (uint256, uint256)
    {
        uint256 _withdrawableReward = withdrawableRewardOf(account);
        if (_withdrawableReward > 0) {
            withdrawnRewards[account] += _withdrawableReward;
            totalRewardsWithdrawn += _withdrawableReward;

            IUniswapV2Router02 uniswapV2Router = IUniswapV2Router02(
                UNISWAPROUTER
            );

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

            bool success;
            uint256 tokens;

            uint256 initTokenBal = IERC20(tokenAddress).balanceOf(account);
            try
                uniswapV2Router
                    .swapExactETHForTokensSupportingFeeOnTransferTokens{
                    value: _withdrawableReward
                }(0, path, address(account), block.timestamp)
            {
                success = true;
                tokens = IERC20(tokenAddress).balanceOf(account) - initTokenBal;
            } catch Error(
                string memory /*err*/
            ) {
                success = false;
            }

            if (!success) {
                withdrawnRewards[account] -= _withdrawableReward;
                totalRewardsWithdrawn -= _withdrawableReward;
                emit LogErrorString("Withdraw failed");
                return (0, 0);
            }

            emit RewardWithdrawn(account, _withdrawableReward);
            return (_withdrawableReward, tokens);
        }
        return (0, 0);
    }

    function withdrawableRewardOf(address account)
        public
        view
        returns (uint256)
    {
        return accumulativeRewardOf(account) - withdrawnRewards[account];
    }

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

    function accumulativeRewardOf(address account)
        public
        view
        returns (uint256)
    {
        int256 a = int256(magnifiedRewardPerShare * balanceOf(account));
        int256 b = magnifiedRewardCorrections[account]; // this is an explicit int256 (signed)
        return uint256(a + b) / magnitude;
    }

    function getAccountInfo(address account)
        public
        view
        returns (
            address,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        AccountInfo memory info;
        info.account = account;
        info.withdrawableRewards = withdrawableRewardOf(account);
        info.totalRewards = accumulativeRewardOf(account);
        info.lastClaimTime = lastClaimTimes[account];
        return (
            info.account,
            info.withdrawableRewards,
            info.totalRewards,
            info.lastClaimTime,
            totalRewardsWithdrawn
        );
    }

    function getLastClaimTime(address account) public view returns (uint256) {
        return lastClaimTimes[account];
    }

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

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

    function decimals() public pure returns (uint8) {
        return 18;
    }

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

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

    function transfer(address, uint256) public pure override returns (bool) {
        revert("ASAP_RewardTracker: method not implemented");
    }

    function allowance(address, address)
        public
        pure
        override
        returns (uint256)
    {
        revert("ASAP_RewardTracker: method not implemented");
    }

    function approve(address, uint256) public pure override returns (bool) {
        revert("ASAP_RewardTracker: method not implemented");
    }

    function transferFrom(
        address,
        address,
        uint256
    ) public pure override returns (bool) {
        revert("ASAP_RewardTracker: method not implemented");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"AccountBlacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"AccountExcludedFromMaxTx","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"AccountExcludedFromMaxWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"AccountWhitelisted","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":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"BlacklistEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"treasury","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"BuyFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"CompoundingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ETHRescued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"LogErrorString","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bps","type":"uint256"}],"name":"MaxWalletBPSUpdated","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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"swapEnabled","type":"bool"},{"indexed":false,"internalType":"uint256","name":"swapTokensAtAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"swapAllToken","type":"bool"}],"name":"RewardSettingsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"treasury","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"SellFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendTreasury","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nativeReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndAddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TaxEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenRescued","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TransferTaxEnabled","type":"event"},{"anonymous":false,"inputs":[],"name":"UniswapV2RouterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"},{"indexed":false,"internalType":"address","name":"liquidity","type":"address"}],"name":"WalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"accumulativeRewardOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"address","name":"_user","type":"address"}],"name":"blackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"blackListMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyLiquidityFeeBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRewardFeeBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFeeBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTreasuryFeeBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compoundingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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"},{"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":"excludeFromMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getLastClaimTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxTx","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSwapTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"holder","type":"address"}],"name":"manualSendReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTxBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardTracker","outputs":[{"internalType":"contract RewardTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFeeBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardFeeBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFeeBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTreasuryFeeBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_treasuryFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_rewardFee","type":"uint256"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setCompoundingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"setMaxTxBPS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"setMaxWalletBPS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_treasuryFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_rewardFee","type":"uint256"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setTaxEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setTransferTaxEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_treasuryWallet","type":"address"},{"internalType":"address payable","name":"_liquidityWallet","type":"address"}],"name":"setWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"taxEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForTreasury","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferTaxEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"unBlackListMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_swapEnabled","type":"bool"},{"internalType":"uint256","name":"_swapTokensAtAmount","type":"uint256"},{"internalType":"bool","name":"_swapAllToken","type":"bool"}],"name":"updateRewardSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableRewardOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawnRewardOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a060405260c860018190556064600281905560038190556101906004819055600592909255600681905560075560085569152d02c7e14af6800000600c55600e805464ffffffffff19166401000101011790556032601a5560fa601b55601c805460ff191690553480156200007457600080fd5b506000805460ff191690556200008a3362000598565b620000a260005461010090046001600160a01b031690565b601080546001600160a01b03928316620100000262010000600160b01b0319909116179055600054601180546001600160a01b0319166101009092049092161790556040513090737a250d5630b4cf539739df2c5dacb4c659f2488d906200010a9062000ae6565b6001600160a01b03928316815291166020820152604001604051809103906000f0801580156200013e573d6000803e3d6000fd5b506001600160a01b03166080526040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d91600091839163c45a01559160048083019260209291908290030181865afa158015620001a1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001c7919062000af4565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000215573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023b919062000af4565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000289573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002af919062000af4565b601880546001600160a01b038086166001600160a01b03199283161790925560198054928416929091169190911790559050620002ee81600162000605565b608051604051632ad4cab760e01b81526001600160a01b03909116600482018190526001602483015290632ad4cab790604401600060405180830381600087803b1580156200033c57600080fd5b505af115801562000351573d6000803e3d6000fd5b5050608051604051632ad4cab760e01b8152306004820152600160248201526001600160a01b039091169250632ad4cab79150604401600060405180830381600087803b158015620003a257600080fd5b505af1158015620003b7573d6000803e3d6000fd5b505050506080516001600160a01b0316632ad4cab7620003dc620005f160201b60201c565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260016024820152604401600060405180830381600087803b1580156200042557600080fd5b505af11580156200043a573d6000803e3d6000fd5b5050608051604051632ad4cab760e01b81526001600160a01b038681166004830152600160248301529091169250632ad4cab79150604401600060405180830381600087803b1580156200048d57600080fd5b505af1158015620004a2573d6000803e3d6000fd5b50505050620004c2620004ba620005f160201b60201c565b600162000773565b620004cf30600162000773565b608051620004df90600162000773565b62000503620004fb60005461010090046001600160a01b031690565b6001620008ac565b62000510306001620008ac565b60805162000520906001620008ac565b620005446200053c60005461010090046001600160a01b031690565b60016200095a565b620005513060016200095a565b608051620005619060016200095a565b620005906200057d60005461010090046001600160a01b031690565b6b033b2e3c9fd0803ce800000062000a01565b505062000b4d565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b60005461010090046001600160a01b031690565b6001600160a01b03821660009081526015602052604090205460ff1615158115151415620006a05760405162461bcd60e51b815260206004820152603e60248201527f415341503a206175746f6d61746564206d61726b6574206d616b65722070616960448201527f7220697320616c72656164792073657420746f20746861742076616c7565000060648201526084015b60405180910390fd5b6001600160a01b0382166000908152601560205260409020805460ff191682158015919091179091556200073757608051604051632ad4cab760e01b81526001600160a01b0384811660048301526001602483015290911690632ad4cab790604401600060405180830381600087803b1580156200071d57600080fd5b505af115801562000732573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6000546001600160a01b03610100909104163314620007c45760405162461bcd60e51b8152602060048201819052602482015260008051602062006d11833981519152604482015260640162000697565b6001600160a01b03821660009081526014602052604090205460ff16151581151514156200084d5760405162461bcd60e51b815260206004820152602f60248201527f415341503a206163636f756e7420697320616c72656164792073657420746f2060448201526e72657175657374656420737461746560881b606482015260840162000697565b6001600160a01b038216600081815260146020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000546001600160a01b03610100909104163314620008fd5760405162461bcd60e51b8152602060048201819052602482015260008051602062006d11833981519152604482015260640162000697565b6001600160a01b0382166000818152601d6020908152604091829020805460ff191685151517905590519182527fedfc0254a9e21630ff8103538705e5f5101e7bd04293ed55755d5d1aaab4583291015b60405180910390a15050565b6000546001600160a01b03610100909104163314620009ab5760405162461bcd60e51b8152602060048201819052602482015260008051602062006d11833981519152604482015260640162000697565b6001600160a01b0382166000818152601e6020908152604091829020805460ff191685151517905590519182527f60349a996898548db500578ca4112f4cdf4ed9f91ec6f1d2303f7ba21c2c375191016200094e565b6001600160a01b03821662000a595760405162461bcd60e51b815260206004820152601e60248201527f415341503a206d696e7420746f20746865207a65726f20616464726573730000604482015260640162000697565b80600f600082825462000a6d919062000b26565b90915550506001600160a01b0382166000908152601260205260408120805483929062000a9c90849062000b26565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b611dd28062004f3f83390190565b60006020828403121562000b0757600080fd5b81516001600160a01b038116811462000b1f57600080fd5b9392505050565b6000821982111562000b4857634e487b7160e01b600052601160045260246000fd5b500190565b60805161436d62000bd26000396000818161088701528181610e2c01528181610ed801528181610f2b01528181611281015281816115bb01528181611b5601528181611c5801528181611fb0015281816120a401528181612849015281816131c00152818161326d015281816135730152818161363c01526138f9015261436d6000f3fe6080604052600436106104405760003560e01c8063744d159111610234578063b62496f51161012e578063d4c989d3116100b6578063f1b234ad1161007a578063f1b234ad14610d7f578063f2fde38b14610d9f578063f4571c4914610dbf578063f54afa7814610ddf578063f69e204614610df557600080fd5b8063d4c989d314610cc3578063dd62ed3e14610ce3578063e01af92c14610d29578063e2f4560514610d49578063e4956ce214610d5f57600080fd5b8063c947b5b3116100fd578063c947b5b314610c4c578063c9567bf914610c62578063cc2ffe7c14610c77578063ccda7f7314610c8d578063d2fcc00114610ca357600080fd5b8063b62496f514610bbc578063c024666814610bec578063c3033aeb14610c0c578063c6af580b14610c2c57600080fd5b806398767425116101bc578063a9059cbb11610180578063a9059cbb14610b30578063aa4e8c4a14610b50578063ad76d68614610b70578063ae0db62714610b90578063b53264b114610ba657600080fd5b80639876742514610a905780639a7a23d614610ab05780639e252f0014610ad0578063a457c2d714610af0578063a680e0bc14610b1057600080fd5b80638456cb59116102035780638456cb59146109ea578063870bd30b146109ff5780638da5cb5b14610a1f57806395d89b4114610a4257806396f9e9be14610a6f57600080fd5b8063744d15911461094c5780637b510fe81461096257806382c2ef34146109b45780638357d0bb146109ca57600080fd5b806333f3d628116103455780635c975abb116102cd5780636bcb411a116102915780636bcb411a146108755780636dd3d39f146108a95780636ddd1713146108e257806370a0823114610901578063715018a61461093757600080fd5b80635c975abb146107ce5780635e4cb02f146107e6578063658c27a9146107fc57806365b8dbc01461083557806368c51e351461085557600080fd5b806349bd5a5e1161031457806349bd5a5e1461072a5780634e71d92d1461074a5780634fbee1931461075f578063537df3b61461079857806357777d31146107b857600080fd5b806333f3d628146106b557806339509351146106d55780633f4ba83a146106f55780634838d1651461070a57600080fd5b80631b00166f116103c85780632ad4cab7116103975780632ad4cab7146106215780632f4504ae14610641578063313ce5671461066357806332fa2df41461067f57806333beafc01461069f57600080fd5b80631b00166f146105a95780631d865c30146105bf57806323b872dd146105e157806325519cf21461060157600080fd5b80630dd871571161040f5780630dd87157146105105780630e832273146105265780631694505e1461054657806318160ddd1461057e5780631a8145bb1461059357600080fd5b806305b3ccb41461044c57806306fdde031461047f578063095ea7b3146104c05780630c70754e146104f057600080fd5b3661044757005b600080fd5b34801561045857600080fd5b5061046c610467366004613d41565b610e0a565b6040519081526020015b60405180910390f35b34801561048b57600080fd5b5060408051808201909152600f81526e105cd85c0814db9a5c195c88109bdd608a1b60208201525b6040516104769190613d65565b3480156104cc57600080fd5b506104e06104db366004613dba565b610ea0565b6040519015158152602001610476565b3480156104fc57600080fd5b5061046c61050b366004613d41565b610eb6565b34801561051c57600080fd5b5061046c600d5481565b34801561053257600080fd5b506104e0610541366004613d41565b610f09565b34801561055257600080fd5b50601854610566906001600160a01b031681565b6040516001600160a01b039091168152602001610476565b34801561058a57600080fd5b50600f5461046c565b34801561059f57600080fd5b5061046c600a5481565b3480156105b557600080fd5b5061046c60015481565b3480156105cb57600080fd5b506105df6105da366004613de6565b610f98565b005b3480156105ed57600080fd5b506104e06105fc366004613e12565b611092565b34801561060d57600080fd5b506105df61061c366004613de6565b611142565b34801561062d57600080fd5b506105df61063c366004613e61565b61122a565b34801561064d57600080fd5b50600e546104e090640100000000900460ff1681565b34801561066f57600080fd5b5060405160128152602001610476565b34801561068b57600080fd5b506105df61069a366004613e9a565b6112e2565b3480156106ab57600080fd5b5061046c60025481565b3480156106c157600080fd5b506105df6106d0366004613dba565b61136a565b3480156106e157600080fd5b506104e06106f0366004613dba565b611453565b34801561070157600080fd5b506105df61148a565b34801561071657600080fd5b506105df610725366004613d41565b6114c4565b34801561073657600080fd5b50601954610566906001600160a01b031681565b34801561075657600080fd5b506105df6115b1565b34801561076b57600080fd5b506104e061077a366004613d41565b6001600160a01b031660009081526014602052604090205460ff1690565b3480156107a457600080fd5b506105df6107b3366004613d41565b61164e565b3480156107c457600080fd5b5061046c601a5481565b3480156107da57600080fd5b5060005460ff166104e0565b3480156107f257600080fd5b5061046c60045481565b34801561080857600080fd5b506104e0610817366004613d41565b6001600160a01b03166000908152601d602052604090205460ff1690565b34801561084157600080fd5b506105df610850366004613d41565b611737565b34801561086157600080fd5b506105df610870366004613eb7565b611a44565b34801561088157600080fd5b506105667f000000000000000000000000000000000000000000000000000000000000000081565b3480156108b557600080fd5b506104e06108c4366004613d41565b6001600160a01b03166000908152601e602052604090205460ff1690565b3480156108ee57600080fd5b50600e546104e090610100900460ff1681565b34801561090d57600080fd5b5061046c61091c366004613d41565b6001600160a01b031660009081526012602052604090205490565b34801561094357600080fd5b506105df611b12565b34801561095857600080fd5b5061046c601b5481565b34801561096e57600080fd5b5061098261097d366004613d41565b611b4c565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610476565b3480156109c057600080fd5b5061046c60065481565b3480156109d657600080fd5b506105df6109e5366004613ed0565b611c02565b3480156109f657600080fd5b506105df611c87565b348015610a0b57600080fd5b50600e546104e09062010000900460ff1681565b348015610a2b57600080fd5b5060005461010090046001600160a01b0316610566565b348015610a4e57600080fd5b506040805180820190915260048152630415341560e41b60208201526104b3565b348015610a7b57600080fd5b50600e546104e0906301000000900460ff1681565b348015610a9c57600080fd5b506105df610aab366004613ef5565b611cbf565b348015610abc57600080fd5b506105df610acb366004613e61565b611d62565b348015610adc57600080fd5b506105df610aeb366004613eb7565b611e08565b348015610afc57600080fd5b506104e0610b0b366004613dba565b611ef5565b348015610b1c57600080fd5b5061046c610b2b366004613d41565b611f8e565b348015610b3c57600080fd5b506104e0610b4b366004613dba565b611fe1565b348015610b5c57600080fd5b506105df610b6b366004613eb7565b611fee565b348015610b7c57600080fd5b5061046c610b8b366004613d41565b612082565b348015610b9c57600080fd5b5061046c60085481565b348015610bb257600080fd5b5061046c60075481565b348015610bc857600080fd5b506104e0610bd7366004613d41565b60156020526000908152604090205460ff1681565b348015610bf857600080fd5b506105df610c07366004613e61565b6120d5565b348015610c1857600080fd5b506105df610c27366004613f4d565b6121eb565b348015610c3857600080fd5b506105df610c47366004613e9a565b612261565b348015610c5857600080fd5b5061046c60035481565b348015610c6e57600080fd5b506105df6122dc565b348015610c8357600080fd5b5061046c60095481565b348015610c9957600080fd5b5061046c60055481565b348015610caf57600080fd5b506105df610cbe366004613e61565b612344565b348015610ccf57600080fd5b506105df610cde366004613e61565b6123c9565b348015610cef57600080fd5b5061046c610cfe366004614012565b6001600160a01b03918216600090815260136020908152604080832093909416825291909152205490565b348015610d3557600080fd5b506105df610d44366004613e9a565b61244e565b348015610d5557600080fd5b5061046c600c5481565b348015610d6b57600080fd5b506105df610d7a366004613e9a565b6124c7565b348015610d8b57600080fd5b506105df610d9a366004614012565b612546565b348015610dab57600080fd5b506105df610dba366004613d41565b6126c2565b348015610dcb57600080fd5b506105df610dda366004613f4d565b612760565b348015610deb57600080fd5b5061046c600b5481565b348015610e0157600080fd5b506105df6127d6565b60405163016cf32d60e21b81526001600160a01b0382811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906305b3ccb4906024015b602060405180830381865afa158015610e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9a9190614040565b92915050565b6000610ead3384846128ed565b50600192915050565b6040516306383aa760e11b81526001600160a01b0382811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690630c70754e90602401610e59565b604051630e83227360e01b81526001600160a01b0382811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690630e83227390602401602060405180830381865afa158015610f74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9a9190614059565b6000546001600160a01b03610100909104163314610fd15760405162461bcd60e51b8152600401610fc890614076565b60405180910390fd5b60058390556006829055600781905580610feb83856140c1565b610ff591906140c1565b6008819055611388101561104b5760405162461bcd60e51b815260206004820152601b60248201527f546f74616c2073656c6c2066656520697320746f6f206c6172676500000000006044820152606401610fc8565b60408051848152602081018490529081018290527fcb5f36df892836a2eaedc349de29a7581176990398ee185d16eaa8f6c1abd8f1906060015b60405180910390a1505050565b600061109f848484612a10565b6001600160a01b0384166000908152601360209081526040808320338452909152902054828110156111235760405162461bcd60e51b815260206004820152602760248201527f415341503a207472616e7366657220616d6f756e74206578636565647320616c6044820152666c6f77616e636560c81b6064820152608401610fc8565b611137853361113286856140d9565b6128ed565b506001949350505050565b6000546001600160a01b036101009091041633146111725760405162461bcd60e51b8152600401610fc890614076565b6001839055600282905560038190558061118c83856140c1565b61119691906140c1565b600481905561138810156111ec5760405162461bcd60e51b815260206004820152601a60248201527f546f74616c206275792066656520697320746f6f206c617267650000000000006044820152606401610fc8565b60408051848152602081018490529081018290527f38513c502b0ab4834ac1df9502b76f75dcf7092469782cfd0db7fe664388e25e90606001611085565b6000546001600160a01b0361010090910416331461125a5760405162461bcd60e51b8152600401610fc890614076565b604051632ad4cab760e01b81526001600160a01b03838116600483015282151560248301527f00000000000000000000000000000000000000000000000000000000000000001690632ad4cab7906044015b600060405180830381600087803b1580156112c657600080fd5b505af11580156112da573d6000803e3d6000fd5b505050505050565b6000546001600160a01b036101009091041633146113125760405162461bcd60e51b8152600401610fc890614076565b600e805482151563010000000263ff000000199091161790556040517fc7d978b78e876fea3ff1cb54617b34636eafef663e201877549e8644ae29495f9061135f90831515815260200190565b60405180910390a150565b6000546001600160a01b0361010090910416331461139a5760405162461bcd60e51b8152600401610fc890614076565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156113e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140b9190614059565b50604080516001600160a01b0384168152602081018390527fe82be315ba1a0d0362d09d5cf59781f214b53a74eb978c35b76ad687099c670c91015b60405180910390a15050565b3360008181526013602090815260408083206001600160a01b03871684529091528120549091610ead9185906111329086906140c1565b6000546001600160a01b036101009091041633146114ba5760405162461bcd60e51b8152600401610fc890614076565b6114c2613324565b565b6000546001600160a01b036101009091041633146114f45760405162461bcd60e51b8152600401610fc890614076565b6001600160a01b03811660009081526017602052604090205460ff161561155d5760405162461bcd60e51b815260206004820152601860248201527f7573657220616c726561647920626c61636b6c697374656400000000000000006044820152606401610fc8565b6001600160a01b038116600081815260176020908152604091829020805460ff1916600117905590519182527f571f7b497ee6f6b62bf6238259f34ef72ad585355587cf9feed80bb4a2b5ce93910161135f565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663807ab4f7336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af1158015611627573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164b9190614059565b50565b6000546001600160a01b0361010090910416331461167e5760405162461bcd60e51b8152600401610fc890614076565b6001600160a01b03811660009081526017602052604090205460ff166116e65760405162461bcd60e51b815260206004820152601860248201527f7573657220616c72656164792077686974656c697374656400000000000000006044820152606401610fc8565b6001600160a01b038116600081815260176020908152604091829020805460ff1916905590519182527fbcad3e56607b6406d740aa2cdbeedb8fa353e7e935f3cfabd5eece16cf9ee8f0910161135f565b6000546001600160a01b036101009091041633146117675760405162461bcd60e51b8152600401610fc890614076565b6001600160a01b0381166117ce5760405162461bcd60e51b815260206004820152602860248201527f756e69737761705632526f757465722063616e206e6f74206265207a65726f20604482015267616464726573732160c01b6064820152608401610fc8565b6018546001600160a01b03828116911614156118475760405162461bcd60e51b815260206004820152603260248201527f415341503a2074686520726f7574657220697320616c72656164792073657420604482015271746f20746865206e6577206164647265737360701b6064820152608401610fc8565b6018546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3601880546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290516000929163c45a01559160048083019260209291908290030181865afa1580156118de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190291906140f0565b6001600160a01b031663c9c6539630601860009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611964573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198891906140f0565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156119d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f991906140f0565b601980546001600160a01b0319166001600160a01b0383161790556040519091507f65e020d47f9723e11541e9849e67ac83525347abf23f28544c73dcce1797308390600090a15050565b6000546001600160a01b03610100909104163314611a745760405162461bcd60e51b8152600401610fc890614076565b60af8110158015611a8757506127108111155b611add5760405162461bcd60e51b815260206004820152602160248201527f425053206d757374206265206265747765656e2031373520616e6420313030306044820152600360fc1b6064820152608401610fc8565b601b8190556040518181527fd046239846396c4c17ddd6f1645b9f5e494ad30ef422414dd6ed27cfa0a2cbd49060200161135f565b6000546001600160a01b03610100909104163314611b425760405162461bcd60e51b8152600401610fc890614076565b6114c260006133b7565b60008060008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637b510fe8876040518263ffffffff1660e01b8152600401611baf91906001600160a01b0391909116815260200190565b60a060405180830381865afa158015611bcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf0919061410d565b939a9299509097509550909350915050565b6000546001600160a01b03610100909104163314611c325760405162461bcd60e51b8152600401610fc890614076565b604051638357d0bb60e01b8152600481018390526001600160a01b0382811660248301527f00000000000000000000000000000000000000000000000000000000000000001690638357d0bb906044016112ac565b6000546001600160a01b03610100909104163314611cb75760405162461bcd60e51b8152600401610fc890614076565b6114c2613410565b6000546001600160a01b03610100909104163314611cef5760405162461bcd60e51b8152600401610fc890614076565b600e8054600c84905561ffff1916610100851515810260ff19169190911783151517918290556040805160ff92840483161515815260208101869052919092161515918101919091527f5309c183b0187b150ceb52ccf719557640a34f4bcf9d4b3edc70c3f3f27e18f590606001611085565b6000546001600160a01b03610100909104163314611d925760405162461bcd60e51b8152600401610fc890614076565b6019546001600160a01b0383811691161415611dfa5760405162461bcd60e51b815260206004820152602160248201527f415341503a2044455820706169722063616e206e6f742062652072656d6f76656044820152601960fa1b6064820152608401610fc8565b611e04828261348b565b5050565b6000546001600160a01b03610100909104163314611e385760405162461bcd60e51b8152600401610fc890614076565b604051600090339083908381818185875af1925050503d8060008114611e7a576040519150601f19603f3d011682016040523d82523d6000602084013e611e7f565b606091505b5050905080611ec55760405162461bcd60e51b815260206004820152601260248201527122aa24103932b9b1bab2903330b4b632b21760711b6044820152606401610fc8565b6040518281527f2935defdd9ec65bb02dc9049597c404aae26083909722b8e4ecd474eea640a9090602001611447565b3360009081526013602090815260408083206001600160a01b038616845290915281205482811015611f755760405162461bcd60e51b8152602060048201526024808201527f415341503a2064656372656173656420616c6c6f77616e63652062656c6f77206044820152637a65726f60e01b6064820152608401610fc8565b611f84338561113286856140d9565b5060019392505050565b6040516329a0382f60e21b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063a680e0bc90602401610e59565b6000610ead338484612a10565b6000546001600160a01b0361010090910416331461201e5760405162461bcd60e51b8152600401610fc890614076565b604b811015801561203157506127108111155b61207d5760405162461bcd60e51b815260206004820181905260248201527f425053206d757374206265206265747765656e20373520616e642031303030306044820152606401610fc8565b601a55565b6040516356bb6b4360e11b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063ad76d68690602401610e59565b6000546001600160a01b036101009091041633146121055760405162461bcd60e51b8152600401610fc890614076565b6001600160a01b03821660009081526014602052604090205460ff161515811515141561218c5760405162461bcd60e51b815260206004820152602f60248201527f415341503a206163636f756e7420697320616c72656164792073657420746f2060448201526e72657175657374656420737461746560881b6064820152608401610fc8565b6001600160a01b038216600081815260146020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000546001600160a01b0361010090910416331461221b5760405162461bcd60e51b8152600401610fc890614076565b60005b81518160ff161015611e045761224f828260ff168151811061224257612242614156565b60200260200101516114c4565b806122598161416c565b91505061221e565b6000546001600160a01b036101009091041633146122915760405162461bcd60e51b8152600401610fc890614076565b600e8054821515620100000262ff0000199091161790556040517f5bb2376cf656637e70e36c01d3da25685bf3b353f18681b8a5e48c7b2effe1339061135f90831515815260200190565b6000546001600160a01b0361010090910416331461230c5760405162461bcd60e51b8152600401610fc890614076565b601c805460ff191660011790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b6000546001600160a01b036101009091041633146123745760405162461bcd60e51b8152600401610fc890614076565b6001600160a01b0382166000818152601e6020908152604091829020805460ff191685151517905590519182527f60349a996898548db500578ca4112f4cdf4ed9f91ec6f1d2303f7ba21c2c37519101611447565b6000546001600160a01b036101009091041633146123f95760405162461bcd60e51b8152600401610fc890614076565b6001600160a01b0382166000818152601d6020908152604091829020805460ff191685151517905590519182527fedfc0254a9e21630ff8103538705e5f5101e7bd04293ed55755d5d1aaab458329101611447565b6000546001600160a01b0361010090910416331461247e5760405162461bcd60e51b8152600401610fc890614076565b600e80548215156101000261ff00199091161790556040517fb9bbb15e341600c8d067a0cadeba219905d5ba6d422b193c9c32265d26fc51c89061135f90831515815260200190565b6000546001600160a01b036101009091041633146124f75760405162461bcd60e51b8152600401610fc890614076565b600e80548215156401000000000264ff00000000199091161790556040517f341322866a3a2c26c27efa4c270c5ba86f6963257118897dd8196f224c002d439061135f90831515815260200190565b6000546001600160a01b036101009091041633146125765760405162461bcd60e51b8152600401610fc890614076565b6001600160a01b0381166125de5760405162461bcd60e51b815260206004820152602960248201527f5f6c697175696469747957616c6c65742063616e206e6f74206265207a65726f60448201526820616464726573732160b81b6064820152608401610fc8565b6001600160a01b0382166126455760405162461bcd60e51b815260206004820152602860248201527f5f747265617375727957616c6c65742063616e206e6f74206265207a65726f20604482015267616464726573732160c01b6064820152608401610fc8565b6010805462010000600160b01b031916620100006001600160a01b0385811682029290921792839055601180546001600160a01b0319168584169081179091556040805192909404909216815260208101919091527f0f37c6733428a3a65d46b7f1853a5ce4bfa3cf92d25322507a50bf23a0b5a0a89101611447565b6000546001600160a01b036101009091041633146126f25760405162461bcd60e51b8152600401610fc890614076565b6001600160a01b0381166127575760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610fc8565b61164b816133b7565b6000546001600160a01b036101009091041633146127905760405162461bcd60e51b8152600401610fc890614076565b60005b81518160ff161015611e04576127c4828260ff16815181106127b7576127b7614156565b602002602001015161164e565b806127ce8161416c565b915050612793565b600e54640100000000900460ff166128305760405162461bcd60e51b815260206004820181905260248201527f415341503a20636f6d706f756e64696e67206973206e6f7420656e61626c65646044820152606401610fc8565b6010805461ff0019166101001790556001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016636de1a5a96128753390565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af11580156128bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128df9190614059565b506010805461ff0019169055565b6001600160a01b03831661294f5760405162461bcd60e51b815260206004820152602360248201527f415341503a20617070726f76652066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610fc8565b6001600160a01b0382166129af5760405162461bcd60e51b815260206004820152602160248201527f415341503a20617070726f766520746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610fc8565b6001600160a01b0383811660008181526013602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b601c5460ff1680612a3357506000546001600160a01b0384811661010090920416145b80612a5057506000546001600160a01b0383811661010090920416145b80612a7357506001600160a01b03831660009081526016602052604090205460ff165b80612a9657506001600160a01b03821660009081526016602052604090205460ff165b612acd5760405162461bcd60e51b81526020600482015260086024820152672737ba1027b832b760c11b6044820152606401610fc8565b6001600160a01b03831660009081526017602052604090205460ff1615612b365760405162461bcd60e51b815260206004820152601b60248201527f415341503a2053656e64657220697320626c61636b6c697374656400000000006044820152606401610fc8565b6001600160a01b03821660009081526017602052604090205460ff1615612b9f5760405162461bcd60e51b815260206004820152601e60248201527f415341503a20526563697069656e7420697320626c61636b6c697374656400006044820152606401610fc8565b6001600160a01b038316612bc55760405162461bcd60e51b8152600401610fc89061418c565b6001600160a01b038216612beb5760405162461bcd60e51b8152600401610fc8906141d0565b6000612710601a54612bfc600f5490565b612c069190614212565b612c109190614231565b90506000612710601b54612c23600f5490565b612c2d9190614212565b612c379190614231565b90508183111580612c6057506001600160a01b0385166000908152601d602052604090205460ff165b612ca05760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610fc8565b6000546001600160a01b038681166101009092041614801590612ccc57506001600160a01b0384163014155b8015612ce357506001600160a01b03841661dead14155b8015612cfd57506019546001600160a01b03858116911614155b15612d9a576001600160a01b038416600090815260126020908152604080832054601e9092529091205460ff1680612d3e575081612d3b85836140c1565b11155b612d985760405162461bcd60e51b815260206004820152602560248201527f57616c6c657420686f6c6420746f6f206c6172676520616d6f756e74206f66206044820152643a37b5b2b760d91b6064820152608401610fc8565b505b6001600160a01b03851660009081526012602052604090205483811015612dd35760405162461bcd60e51b8152600401610fc890614253565b30600090815260126020526040902054600c54600e54479183101590610100900460ff168015612e005750805b8015612e0f575060105460ff16155b8015612e3457506001600160a01b03891660009081526015602052604090205460ff16155b8015612e4e57506018546001600160a01b038a8116911614155b8015612e6d57506000546001600160a01b038a81166101009092041614155b8015612e8c57506000546001600160a01b038981166101009092041614155b15612ec7576010805460ff19166001179055600e5460ff16612eae57600c5492505b612eb8838361360c565b42600d556010805460ff191690555b6019546000906001600160a01b038b811691161480612ef357506019546001600160a01b038a81169116145b80612f1657506001600160a01b03891660009081526015602052604090205460ff165b80612f3957506001600160a01b038a1660009081526015602052604090205460ff165b80612f4d5750600e546301000000900460ff165b15612f56575060015b6001600160a01b038a1660009081526014602052604090205460ff1680612f9557506001600160a01b03891660009081526014602052604090205460ff165b15612f9e575060005b60105460ff1680612fb65750601054610100900460ff165b80612fca5750600e5462010000900460ff16155b15612fd3575060005b80156131b3576001600160a01b03891660009081526015602052604081205460ff16801561300357506000600854115b156130bc576127106008548a6130199190614212565b6130239190614231565b9050600854600554826130369190614212565b6130409190614231565b6009600082825461305191906140c1565b90915550506008546007546130669083614212565b6130709190614231565b600b600082825461308191906140c1565b90915550506008546006546130969083614212565b6130a09190614231565b600a60008282546130b191906140c1565b9091555061319a9050565b6001600160a01b038b1660009081526015602052604090205460ff1680156130e657506000600454115b1561319a576127106004548a6130fc9190614212565b6131069190614231565b9050600454600154826131199190614212565b6131239190614231565b6009600082825461313491906140c1565b90915550506004546003546131499083614212565b6131539190614231565b600b600082825461316491906140c1565b90915550506004546002546131799083614212565b6131839190614231565b600a600082825461319491906140c1565b90915550505b6131a4818a6140d9565b98506131b18b3083613a25565b505b6131be8a8a8a613a25565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e30443bc8b61320d8d6001600160a01b031660009081526012602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561325357600080fd5b505af1158015613267573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e30443bc8a6132ba8c6001600160a01b031660009081526012602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561330057600080fd5b505af1158015613314573d6000803e3d6000fd5b5050505050505050505050505050565b60005460ff1661336d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610fc8565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b60005460ff16156134565760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610fc8565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861339a3390565b6001600160a01b03821660009081526015602052604090205460ff16151581151514156135205760405162461bcd60e51b815260206004820152603e60248201527f415341503a206175746f6d61746564206d61726b6574206d616b65722070616960448201527f7220697320616c72656164792073657420746f20746861742076616c756500006064820152608401610fc8565b6001600160a01b0382166000908152601560205260409020805460ff191682158015919091179091556135d057604051632ad4cab760e01b81526001600160a01b038381166004830152600160248301527f00000000000000000000000000000000000000000000000000000000000000001690632ad4cab790604401600060405180830381600087803b1580156135b757600080fd5b505af11580156135cb573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60008211613618575050565b6010546000906201000090046001600160a01b03161561363757506009545b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136bc9190614040565b11156136c75750600b545b60006002600a546136d89190614231565b9050600081600a546136ea91906140d9565b90506000826136f986866140c1565b61370391906140c1565b90504761370f82613b44565b60008761371c83476140d9565b61372691906140c1565b60006009819055600b819055600a819055909150836137458984614212565b61374f9190614231565b905060008461375e8985614212565b6137689190614231565b905060008161377784866140d9565b61378191906140d9565b905082156138a4576010546040516000916201000090046001600160a01b03169085908381818185875af1925050503d80600081146137dc576040519150601f19603f3d011682016040523d82523d6000602084013e6137e1565b606091505b50509050801561382957604080518c8152602081018690527f16fe3128da7f457b9a8ebcf69ba3f90f7399ca9cb49d8a0692f9a79aef3b535e910160405180910390a16138a2565b7f551303dd5f39cbfe6daba6b3e27754b8a7d72f519756a2cde2b92c2bbde159a76040516138999060208082526028908201527f57616c6c6574206661696c656420746f207265636569766520747265617375726040820152677920746f6b656e7360c01b606082015260800190565b60405180910390a15b505b6138ae8782613c68565b60408051898152602081018390529081018890527fb63dc6f50047533abe2d6adf180d38d524c8d98e55ad199aac8d6b9801bbe24a9060600160405180910390a18115613a175760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168360405160006040518083038185875af1925050503d8060008114613962576040519150601f19603f3d011682016040523d82523d6000602084013e613967565b606091505b5050905080156139af57604080518b8152602081018590527f18b842f7f2fd53a18468357f784d74cf54958b0c6d27dd5cfbb8f5f9c7bdfd5b910160405180910390a1613a15565b7f551303dd5f39cbfe6daba6b3e27754b8a7d72f519756a2cde2b92c2bbde159a7604051613a0c906020808252818101527f547261636b6572206661696c656420746f207265636569766520746f6b656e73604082015260600190565b60405180910390a15b505b505050505050505050505050565b6001600160a01b038316613a4b5760405162461bcd60e51b8152600401610fc89061418c565b6001600160a01b038216613a715760405162461bcd60e51b8152600401610fc8906141d0565b6001600160a01b03831660009081526012602052604090205481811015613aaa5760405162461bcd60e51b8152600401610fc890614253565b613ab482826140d9565b6001600160a01b038086166000908152601260205260408082209390935590851681529081208054849290613aea9084906140c1565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613b3691815260200190565b60405180910390a350505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613b7957613b79614156565b6001600160a01b03928316602091820292909201810191909152601854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bf691906140f0565b81600181518110613c0957613c09614156565b6001600160a01b039283166020918202929092010152601854613c2f91309116846128ed565b60185460405163791ac94760e01b81526001600160a01b039091169063791ac947906112ac908590600090869030904290600401614298565b601854613c809030906001600160a01b0316846128ed565b60185460115460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613cf0573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613d159190614309565b5050505050565b6001600160a01b038116811461164b57600080fd5b8035613d3c81613d1c565b919050565b600060208284031215613d5357600080fd5b8135613d5e81613d1c565b9392505050565b600060208083528351808285015260005b81811015613d9257858101830151858201604001528201613d76565b81811115613da4576000604083870101525b50601f01601f1916929092016040019392505050565b60008060408385031215613dcd57600080fd5b8235613dd881613d1c565b946020939093013593505050565b600080600060608486031215613dfb57600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215613e2757600080fd5b8335613e3281613d1c565b92506020840135613e4281613d1c565b929592945050506040919091013590565b801515811461164b57600080fd5b60008060408385031215613e7457600080fd5b8235613e7f81613d1c565b91506020830135613e8f81613e53565b809150509250929050565b600060208284031215613eac57600080fd5b8135613d5e81613e53565b600060208284031215613ec957600080fd5b5035919050565b60008060408385031215613ee357600080fd5b823591506020830135613e8f81613d1c565b600080600060608486031215613f0a57600080fd5b8335613f1581613e53565b9250602084013591506040840135613f2c81613e53565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215613f6057600080fd5b823567ffffffffffffffff80821115613f7857600080fd5b818501915085601f830112613f8c57600080fd5b813581811115613f9e57613f9e613f37565b8060051b604051601f19603f83011681018181108582111715613fc357613fc3613f37565b604052918252848201925083810185019188831115613fe157600080fd5b938501935b8285101561400657613ff785613d31565b84529385019392850192613fe6565b98975050505050505050565b6000806040838503121561402557600080fd5b823561403081613d1c565b91506020830135613e8f81613d1c565b60006020828403121561405257600080fd5b5051919050565b60006020828403121561406b57600080fd5b8151613d5e81613e53565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156140d4576140d46140ab565b500190565b6000828210156140eb576140eb6140ab565b500390565b60006020828403121561410257600080fd5b8151613d5e81613d1c565b600080600080600060a0868803121561412557600080fd5b855161413081613d1c565b602087015160408801516060890151608090990151929a91995097965090945092505050565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff811415614183576141836140ab565b60010192915050565b60208082526024908201527f415341503a207472616e736665722066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526022908201527f415341503a207472616e7366657220746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b600081600019048311821515161561422c5761422c6140ab565b500290565b60008261424e57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f415341503a207472616e7366657220616d6f756e7420657863656564732062616040820152646c616e636560d81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156142e85784516001600160a01b0316835293830193918301916001016142c3565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561431e57600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212205ce68fc4276d4327c4c82dbf3a1b7456af7498983aaff2be53b34381ae70c61264736f6c634300080a003360e06040523480156200001157600080fd5b5060405162001dd238038062001dd28339810160408190526200003491620000d0565b6200003f3362000063565b670de0b6b3a764000060a0526001600160a01b0391821660c0521660805262000108565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620000cb57600080fd5b919050565b60008060408385031215620000e457600080fd5b620000ef83620000b3565b9150620000ff60208401620000b3565b90509250929050565b60805160a05160c051611c7062000162600039600081816104ad0152818161090601528181610fbf01528181611025015261115801526000818161054d015281816109770152610d5001526000610ef40152611c706000f3fe6080604052600436106101d15760003560e01c8063807ab4f7116100f7578063ad76d68611610095578063eb53e21411610064578063eb53e214146105aa578063ee172546146105c0578063f2fde38b146105d6578063f82f235f146105f657600080fd5b8063ad76d68614610505578063c25907091461053b578063dd62ed3e1461056f578063e30443bc1461058a57600080fd5b806395d89b41116100d157806395d89b41146102185780639d76ea581461049b578063a680e0bc146104cf578063a9059cbb1461025957600080fd5b8063807ab4f7146104295780638357d0bb146104495780638da5cb5b1461046957600080fd5b80632ad4cab71161016f5780636f4a2cd01161013e5780636f4a2cd01461038457806370a082311461038c578063715018a6146103c25780637b510fe8146103d757600080fd5b80632ad4cab7146103125780633009a60914610332578063313ce567146103485780636de1a5a91461036457600080fd5b80630c70754e116101ab5780630c70754e146102895780630e832273146102a957806318160ddd146102e257806323b872dd146102f757600080fd5b806305b3ccb4146101e557806306fdde0314610218578063095ea7b31461025957600080fd5b366101e0576101de610626565b005b600080fd5b3480156101f157600080fd5b506102056102003660046117f1565b6106f4565b6040519081526020015b60405180910390f35b34801561022457600080fd5b50604080518082018252601281527120a9a0a82fa932bbb0b9322a3930b1b5b2b960711b6020820152905161020f9190611815565b34801561026557600080fd5b5061027961027436600461186a565b610758565b604051901515815260200161020f565b34801561029557600080fd5b506102056102a43660046117f1565b6107b6565b3480156102b557600080fd5b506102796102c43660046117f1565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156102ee57600080fd5b50600254610205565b34801561030357600080fd5b50610279610274366004611896565b34801561031e57600080fd5b506101de61032d3660046118d7565b6107e8565b34801561033e57600080fd5b5061020560015481565b34801561035457600080fd5b506040516012815260200161020f565b34801561037057600080fd5b5061027961037f3660046117f1565b610a01565b6101de610626565b34801561039857600080fd5b506102056103a73660046117f1565b6001600160a01b031660009081526003602052604090205490565b3480156103ce57600080fd5b506101de610aac565b3480156103e357600080fd5b506103f76103f23660046117f1565b610ae0565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a00161020f565b34801561043557600080fd5b506102796104443660046117f1565b610b88565b34801561045557600080fd5b506101de610464366004611915565b610c2d565b34801561047557600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161020f565b3480156104a757600080fd5b506104837f000000000000000000000000000000000000000000000000000000000000000081565b3480156104db57600080fd5b506102056104ea3660046117f1565b6001600160a01b03166000908152600a602052604090205490565b34801561051157600080fd5b506102056105203660046117f1565b6001600160a01b031660009081526009602052604090205490565b34801561054757600080fd5b506102057f000000000000000000000000000000000000000000000000000000000000000081565b34801561057b57600080fd5b5061020561027436600461193a565b34801561059657600080fd5b506101de6105a536600461186a565b610cff565b3480156105b657600080fd5b5061020560065481565b3480156105cc57600080fd5b5061020560055481565b3480156105e257600080fd5b506101de6105f13660046117f1565b610d8e565b34801561060257600080fd5b506102796106113660046117f1565b60076020526000908152604090205460ff1681565b6000600254116106745760405162461bcd60e51b8152602060048201526014602482015273151bdd185b081cdd5c1c1b1e481a5b9d985b1a5960621b60448201526064015b60405180910390fd5b34156106f25760025461068b600160801b3461197e565b610695919061199d565b6004546106a291906119bf565b60045560405134815233907fdf29796aad820e4bb192f3a8d631b76519bcd2cbe77cc85af20e9df53cece0869060200160405180910390a234600560008282546106ec91906119bf565b90915550505b565b6001600160a01b038116600090815260036020526040812054600454829161071b9161197e565b6001600160a01b038416600090815260086020526040902054909150600160801b61074682846119d7565b610750919061199d565b949350505050565b60405162461bcd60e51b815260206004820152602a60248201527f415341505f526577617264547261636b65723a206d6574686f64206e6f7420696044820152691b5c1b195b595b9d195960b21b606482015260009060840161066b565b6001600160a01b0381166000908152600960205260408120546107d8836106f4565b6107e29190611a18565b92915050565b6000546001600160a01b031633146108125760405162461bcd60e51b815260040161066b90611a2f565b6001600160a01b03821660009081526007602052604090205460ff16151581151514156108a75760405162461bcd60e51b815260206004820152603a60248201527f415341505f526577617264547261636b65723a206163636f756e7420616c726560448201527f6164792073657420746f20726571756573746564207374617465000000000000606482015260840161066b565b6001600160a01b0382166000908152600760205260409020805460ff191682158015919091179091556108e4576108df826000610e29565b6109b8565b6040516370a0823160e01b81526001600160a01b0383811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa15801561094f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109739190611a64565b90507f000000000000000000000000000000000000000000000000000000000000000081106109ab576109a68382610e29565b6109b6565b6109b6836000610e29565b505b816001600160a01b03167facf40045c9516ed93201cbb27e9656cc33f8636b026b0e20b4f6ddcfccf404aa826040516109f5911515815260200190565b60405180910390a25050565b600080546001600160a01b03163314610a2c5760405162461bcd60e51b815260040161066b90611a2f565b600080610a3884610e87565b90925090508115610aa2576001600160a01b0384166000818152600a602090815260409182902042905581518581529081018490527f0e311a2c6dbfb0153ec3a8a5bdca09070b3e5f60768fdc10a20453f38d186873910160405180910390a25060019392505050565b5060009392505050565b6000546001600160a01b03163314610ad65760405162461bcd60e51b815260040161066b90611a2f565b6106f260006112e6565b6000806000806000610b1c604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b6001600160a01b0387168152610b31876107b6565b6020820152610b3f876106f4565b60408281019182526001600160a01b03989098166000908152600a6020908152989020546060830181905282519890920151905160065498999198909750919550909350915050565b600080546001600160a01b03163314610bb35760405162461bcd60e51b815260040161066b90611a2f565b6000610bbe83611336565b90508015610c24576001600160a01b0383166000818152600a602052604090819020429055517f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d490610c139084815260200190565b60405180910390a250600192915050565b50600092915050565b6000546001600160a01b03163314610c575760405162461bcd60e51b815260040161066b90611a2f565b4760006001600160a01b03831684610c6f5782610c71565b845b604051600081818185875af1925050503d8060008114610cad576040519150601f19603f3d011682016040523d82523d6000602084013e610cb2565b606091505b5050905080610cf95760405162461bcd60e51b815260206004820152601360248201527226b0b73ab0b61039b2b732103330b4b632b21760691b604482015260640161066b565b50505050565b6000546001600160a01b03163314610d295760405162461bcd60e51b815260040161066b90611a2f565b6001600160a01b03821660009081526007602052604090205460ff1615610d4e575050565b7f00000000000000000000000000000000000000000000000000000000000000008110610d8357610d7f8282610e29565b5050565b610d7f826000610e29565b6000546001600160a01b03163314610db85760405162461bcd60e51b815260040161066b90611a2f565b6001600160a01b038116610e1d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161066b565b610e26816112e6565b50565b6001600160a01b03821660009081526003602052604090205480821115610e62576000610e568284611a18565b9050610cf984826114dd565b80821015610e82576000610e768383611a18565b9050610cf9848261161e565b505050565b6000806000610e95846107b6565b905080156112da576001600160a01b03841660009081526009602052604081208054839290610ec59084906119bf565b925050819055508060066000828254610ede91906119bf565b90915550506040805160028082526060820183527f0000000000000000000000000000000000000000000000000000000000000000926000929190602083019080368337019050509050816001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8a9190611a7d565b81600081518110610f9d57610f9d611a9a565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ff157610ff1611a9a565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b81528782166004820152600091829182917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561106c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110909190611a64565b9050846001600160a01b031663b6f9de95876000878d426040518663ffffffff1660e01b81526004016110c69493929190611ab0565b6000604051808303818588803b1580156110df57600080fd5b505af1935050505080156110f1575060015b611133576110fd611b1a565b806308c379a014156111275750611112611b71565b8061111d5750611129565b60009350506111d2565b505b3d6000803e3d6000fd5b6040516370a0823160e01b81526001600160a01b038a811660048301526001945082917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156111a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c59190611a64565b6111cf9190611a18565b91505b82611288576001600160a01b038916600090815260096020526040812080548892906111ff908490611a18565b9250508190555085600660008282546112189190611a18565b90915550506040517f551303dd5f39cbfe6daba6b3e27754b8a7d72f519756a2cde2b92c2bbde159a79061126f906020808252600f908201526e15da5d1a191c985dc819985a5b1959608a1b604082015260600190565b60405180910390a1506000988998509650505050505050565b886001600160a01b03167f1d3eee4ca001cff39eec6ec7615aacf2f2bd61791273830728ba00ccbd6e1337876040516112c391815260200190565b60405180910390a250939793965092945050505050565b50600093849350915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080611342836107b6565b90508015610c24576001600160a01b038316600090815260096020526040812080548392906113729084906119bf565b92505081905550806006600082825461138b91906119bf565b90915550506040516000906001600160a01b0385169083908381818185875af1925050503d80600081146113db576040519150601f19603f3d011682016040523d82523d6000602084013e6113e0565b606091505b5050905080611493576001600160a01b03841660009081526009602052604081208054849290611411908490611a18565b92505081905550816006600082825461142a9190611a18565b90915550506040517f551303dd5f39cbfe6daba6b3e27754b8a7d72f519756a2cde2b92c2bbde159a790611481906020808252600f908201526e15da5d1a191c985dc819985a5b1959608a1b604082015260600190565b60405180910390a15060009392505050565b836001600160a01b03167f1d3eee4ca001cff39eec6ec7615aacf2f2bd61791273830728ba00ccbd6e1337836040516114ce91815260200190565b60405180910390a25092915050565b6001600160a01b0382166115485760405162461bcd60e51b815260206004820152602c60248201527f415341505f526577617264547261636b65723a206d696e7420746f207468652060448201526b7a65726f206164647265737360a01b606482015260840161066b565b806002600082825461155a91906119bf565b90915550506001600160a01b038216600090815260036020526040812080548392906115879084906119bf565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3806004546115db919061197e565b6001600160a01b0383166000908152600860205260409020546115fe9190611bfb565b6001600160a01b0390921660009081526008602052604090209190915550565b6001600160a01b03821661168b5760405162461bcd60e51b815260206004820152602e60248201527f415341505f526577617264547261636b65723a206275726e2066726f6d20746860448201526d65207a65726f206164647265737360901b606482015260840161066b565b6001600160a01b0382166000908152600360205260409020548181101561170c5760405162461bcd60e51b815260206004820152602f60248201527f415341505f526577617264547261636b65723a206275726e20616d6f756e742060448201526e657863656564732062616c616e636560881b606482015260840161066b565b6117168282611a18565b6001600160a01b03841660009081526003602052604081209190915560028054849290611744908490611a18565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a381600454611798919061197e565b6001600160a01b0384166000908152600860205260409020546117bb91906119d7565b6001600160a01b039093166000908152600860205260409020929092555050565b6001600160a01b0381168114610e2657600080fd5b60006020828403121561180357600080fd5b813561180e816117dc565b9392505050565b600060208083528351808285015260005b8181101561184257858101830151858201604001528201611826565b81811115611854576000604083870101525b50601f01601f1916929092016040019392505050565b6000806040838503121561187d57600080fd5b8235611888816117dc565b946020939093013593505050565b6000806000606084860312156118ab57600080fd5b83356118b6816117dc565b925060208401356118c6816117dc565b929592945050506040919091013590565b600080604083850312156118ea57600080fd5b82356118f5816117dc565b91506020830135801515811461190a57600080fd5b809150509250929050565b6000806040838503121561192857600080fd5b82359150602083013561190a816117dc565b6000806040838503121561194d57600080fd5b8235611958816117dc565b9150602083013561190a816117dc565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561199857611998611968565b500290565b6000826119ba57634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156119d2576119d2611968565b500190565b600080821280156001600160ff1b03849003851316156119f9576119f9611968565b600160ff1b8390038412811615611a1257611a12611968565b50500190565b600082821015611a2a57611a2a611968565b500390565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611a7657600080fd5b5051919050565b600060208284031215611a8f57600080fd5b815161180e816117dc565b634e487b7160e01b600052603260045260246000fd5b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015611afa5784516001600160a01b031683529383019391830191600101611ad5565b50506001600160a01b039690961660408501525050506060015292915050565b600060033d1115611b335760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff81118282101715611b6a57634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d1015611b7f5790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715611baf57505050505090565b8285019150815181811115611bc75750505050505090565b843d8701016020828501011115611be15750505050505090565b611bf060208286010187611b36565b509095945050505050565b60008083128015600160ff1b850184121615611c1957611c19611968565b6001600160ff1b0384018313811615611c3457611c34611968565b5050039056fea2646970667358221220a18b13526ddf22c13a701dfc008abbc31ee9150a5c7f87e507f2ff8c0c7a052f64736f6c634300080a00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x6080604052600436106104405760003560e01c8063744d159111610234578063b62496f51161012e578063d4c989d3116100b6578063f1b234ad1161007a578063f1b234ad14610d7f578063f2fde38b14610d9f578063f4571c4914610dbf578063f54afa7814610ddf578063f69e204614610df557600080fd5b8063d4c989d314610cc3578063dd62ed3e14610ce3578063e01af92c14610d29578063e2f4560514610d49578063e4956ce214610d5f57600080fd5b8063c947b5b3116100fd578063c947b5b314610c4c578063c9567bf914610c62578063cc2ffe7c14610c77578063ccda7f7314610c8d578063d2fcc00114610ca357600080fd5b8063b62496f514610bbc578063c024666814610bec578063c3033aeb14610c0c578063c6af580b14610c2c57600080fd5b806398767425116101bc578063a9059cbb11610180578063a9059cbb14610b30578063aa4e8c4a14610b50578063ad76d68614610b70578063ae0db62714610b90578063b53264b114610ba657600080fd5b80639876742514610a905780639a7a23d614610ab05780639e252f0014610ad0578063a457c2d714610af0578063a680e0bc14610b1057600080fd5b80638456cb59116102035780638456cb59146109ea578063870bd30b146109ff5780638da5cb5b14610a1f57806395d89b4114610a4257806396f9e9be14610a6f57600080fd5b8063744d15911461094c5780637b510fe81461096257806382c2ef34146109b45780638357d0bb146109ca57600080fd5b806333f3d628116103455780635c975abb116102cd5780636bcb411a116102915780636bcb411a146108755780636dd3d39f146108a95780636ddd1713146108e257806370a0823114610901578063715018a61461093757600080fd5b80635c975abb146107ce5780635e4cb02f146107e6578063658c27a9146107fc57806365b8dbc01461083557806368c51e351461085557600080fd5b806349bd5a5e1161031457806349bd5a5e1461072a5780634e71d92d1461074a5780634fbee1931461075f578063537df3b61461079857806357777d31146107b857600080fd5b806333f3d628146106b557806339509351146106d55780633f4ba83a146106f55780634838d1651461070a57600080fd5b80631b00166f116103c85780632ad4cab7116103975780632ad4cab7146106215780632f4504ae14610641578063313ce5671461066357806332fa2df41461067f57806333beafc01461069f57600080fd5b80631b00166f146105a95780631d865c30146105bf57806323b872dd146105e157806325519cf21461060157600080fd5b80630dd871571161040f5780630dd87157146105105780630e832273146105265780631694505e1461054657806318160ddd1461057e5780631a8145bb1461059357600080fd5b806305b3ccb41461044c57806306fdde031461047f578063095ea7b3146104c05780630c70754e146104f057600080fd5b3661044757005b600080fd5b34801561045857600080fd5b5061046c610467366004613d41565b610e0a565b6040519081526020015b60405180910390f35b34801561048b57600080fd5b5060408051808201909152600f81526e105cd85c0814db9a5c195c88109bdd608a1b60208201525b6040516104769190613d65565b3480156104cc57600080fd5b506104e06104db366004613dba565b610ea0565b6040519015158152602001610476565b3480156104fc57600080fd5b5061046c61050b366004613d41565b610eb6565b34801561051c57600080fd5b5061046c600d5481565b34801561053257600080fd5b506104e0610541366004613d41565b610f09565b34801561055257600080fd5b50601854610566906001600160a01b031681565b6040516001600160a01b039091168152602001610476565b34801561058a57600080fd5b50600f5461046c565b34801561059f57600080fd5b5061046c600a5481565b3480156105b557600080fd5b5061046c60015481565b3480156105cb57600080fd5b506105df6105da366004613de6565b610f98565b005b3480156105ed57600080fd5b506104e06105fc366004613e12565b611092565b34801561060d57600080fd5b506105df61061c366004613de6565b611142565b34801561062d57600080fd5b506105df61063c366004613e61565b61122a565b34801561064d57600080fd5b50600e546104e090640100000000900460ff1681565b34801561066f57600080fd5b5060405160128152602001610476565b34801561068b57600080fd5b506105df61069a366004613e9a565b6112e2565b3480156106ab57600080fd5b5061046c60025481565b3480156106c157600080fd5b506105df6106d0366004613dba565b61136a565b3480156106e157600080fd5b506104e06106f0366004613dba565b611453565b34801561070157600080fd5b506105df61148a565b34801561071657600080fd5b506105df610725366004613d41565b6114c4565b34801561073657600080fd5b50601954610566906001600160a01b031681565b34801561075657600080fd5b506105df6115b1565b34801561076b57600080fd5b506104e061077a366004613d41565b6001600160a01b031660009081526014602052604090205460ff1690565b3480156107a457600080fd5b506105df6107b3366004613d41565b61164e565b3480156107c457600080fd5b5061046c601a5481565b3480156107da57600080fd5b5060005460ff166104e0565b3480156107f257600080fd5b5061046c60045481565b34801561080857600080fd5b506104e0610817366004613d41565b6001600160a01b03166000908152601d602052604090205460ff1690565b34801561084157600080fd5b506105df610850366004613d41565b611737565b34801561086157600080fd5b506105df610870366004613eb7565b611a44565b34801561088157600080fd5b506105667f0000000000000000000000007c7aa99027892c5647d8733c8e0f0b3fde4147bc81565b3480156108b557600080fd5b506104e06108c4366004613d41565b6001600160a01b03166000908152601e602052604090205460ff1690565b3480156108ee57600080fd5b50600e546104e090610100900460ff1681565b34801561090d57600080fd5b5061046c61091c366004613d41565b6001600160a01b031660009081526012602052604090205490565b34801561094357600080fd5b506105df611b12565b34801561095857600080fd5b5061046c601b5481565b34801561096e57600080fd5b5061098261097d366004613d41565b611b4c565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610476565b3480156109c057600080fd5b5061046c60065481565b3480156109d657600080fd5b506105df6109e5366004613ed0565b611c02565b3480156109f657600080fd5b506105df611c87565b348015610a0b57600080fd5b50600e546104e09062010000900460ff1681565b348015610a2b57600080fd5b5060005461010090046001600160a01b0316610566565b348015610a4e57600080fd5b506040805180820190915260048152630415341560e41b60208201526104b3565b348015610a7b57600080fd5b50600e546104e0906301000000900460ff1681565b348015610a9c57600080fd5b506105df610aab366004613ef5565b611cbf565b348015610abc57600080fd5b506105df610acb366004613e61565b611d62565b348015610adc57600080fd5b506105df610aeb366004613eb7565b611e08565b348015610afc57600080fd5b506104e0610b0b366004613dba565b611ef5565b348015610b1c57600080fd5b5061046c610b2b366004613d41565b611f8e565b348015610b3c57600080fd5b506104e0610b4b366004613dba565b611fe1565b348015610b5c57600080fd5b506105df610b6b366004613eb7565b611fee565b348015610b7c57600080fd5b5061046c610b8b366004613d41565b612082565b348015610b9c57600080fd5b5061046c60085481565b348015610bb257600080fd5b5061046c60075481565b348015610bc857600080fd5b506104e0610bd7366004613d41565b60156020526000908152604090205460ff1681565b348015610bf857600080fd5b506105df610c07366004613e61565b6120d5565b348015610c1857600080fd5b506105df610c27366004613f4d565b6121eb565b348015610c3857600080fd5b506105df610c47366004613e9a565b612261565b348015610c5857600080fd5b5061046c60035481565b348015610c6e57600080fd5b506105df6122dc565b348015610c8357600080fd5b5061046c60095481565b348015610c9957600080fd5b5061046c60055481565b348015610caf57600080fd5b506105df610cbe366004613e61565b612344565b348015610ccf57600080fd5b506105df610cde366004613e61565b6123c9565b348015610cef57600080fd5b5061046c610cfe366004614012565b6001600160a01b03918216600090815260136020908152604080832093909416825291909152205490565b348015610d3557600080fd5b506105df610d44366004613e9a565b61244e565b348015610d5557600080fd5b5061046c600c5481565b348015610d6b57600080fd5b506105df610d7a366004613e9a565b6124c7565b348015610d8b57600080fd5b506105df610d9a366004614012565b612546565b348015610dab57600080fd5b506105df610dba366004613d41565b6126c2565b348015610dcb57600080fd5b506105df610dda366004613f4d565b612760565b348015610deb57600080fd5b5061046c600b5481565b348015610e0157600080fd5b506105df6127d6565b60405163016cf32d60e21b81526001600160a01b0382811660048301526000917f0000000000000000000000007c7aa99027892c5647d8733c8e0f0b3fde4147bc909116906305b3ccb4906024015b602060405180830381865afa158015610e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9a9190614040565b92915050565b6000610ead3384846128ed565b50600192915050565b6040516306383aa760e11b81526001600160a01b0382811660048301526000917f0000000000000000000000007c7aa99027892c5647d8733c8e0f0b3fde4147bc90911690630c70754e90602401610e59565b604051630e83227360e01b81526001600160a01b0382811660048301526000917f0000000000000000000000007c7aa99027892c5647d8733c8e0f0b3fde4147bc90911690630e83227390602401602060405180830381865afa158015610f74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9a9190614059565b6000546001600160a01b03610100909104163314610fd15760405162461bcd60e51b8152600401610fc890614076565b60405180910390fd5b60058390556006829055600781905580610feb83856140c1565b610ff591906140c1565b6008819055611388101561104b5760405162461bcd60e51b815260206004820152601b60248201527f546f74616c2073656c6c2066656520697320746f6f206c6172676500000000006044820152606401610fc8565b60408051848152602081018490529081018290527fcb5f36df892836a2eaedc349de29a7581176990398ee185d16eaa8f6c1abd8f1906060015b60405180910390a1505050565b600061109f848484612a10565b6001600160a01b0384166000908152601360209081526040808320338452909152902054828110156111235760405162461bcd60e51b815260206004820152602760248201527f415341503a207472616e7366657220616d6f756e74206578636565647320616c6044820152666c6f77616e636560c81b6064820152608401610fc8565b611137853361113286856140d9565b6128ed565b506001949350505050565b6000546001600160a01b036101009091041633146111725760405162461bcd60e51b8152600401610fc890614076565b6001839055600282905560038190558061118c83856140c1565b61119691906140c1565b600481905561138810156111ec5760405162461bcd60e51b815260206004820152601a60248201527f546f74616c206275792066656520697320746f6f206c617267650000000000006044820152606401610fc8565b60408051848152602081018490529081018290527f38513c502b0ab4834ac1df9502b76f75dcf7092469782cfd0db7fe664388e25e90606001611085565b6000546001600160a01b0361010090910416331461125a5760405162461bcd60e51b8152600401610fc890614076565b604051632ad4cab760e01b81526001600160a01b03838116600483015282151560248301527f0000000000000000000000007c7aa99027892c5647d8733c8e0f0b3fde4147bc1690632ad4cab7906044015b600060405180830381600087803b1580156112c657600080fd5b505af11580156112da573d6000803e3d6000fd5b505050505050565b6000546001600160a01b036101009091041633146113125760405162461bcd60e51b8152600401610fc890614076565b600e805482151563010000000263ff000000199091161790556040517fc7d978b78e876fea3ff1cb54617b34636eafef663e201877549e8644ae29495f9061135f90831515815260200190565b60405180910390a150565b6000546001600160a01b0361010090910416331461139a5760405162461bcd60e51b8152600401610fc890614076565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156113e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140b9190614059565b50604080516001600160a01b0384168152602081018390527fe82be315ba1a0d0362d09d5cf59781f214b53a74eb978c35b76ad687099c670c91015b60405180910390a15050565b3360008181526013602090815260408083206001600160a01b03871684529091528120549091610ead9185906111329086906140c1565b6000546001600160a01b036101009091041633146114ba5760405162461bcd60e51b8152600401610fc890614076565b6114c2613324565b565b6000546001600160a01b036101009091041633146114f45760405162461bcd60e51b8152600401610fc890614076565b6001600160a01b03811660009081526017602052604090205460ff161561155d5760405162461bcd60e51b815260206004820152601860248201527f7573657220616c726561647920626c61636b6c697374656400000000000000006044820152606401610fc8565b6001600160a01b038116600081815260176020908152604091829020805460ff1916600117905590519182527f571f7b497ee6f6b62bf6238259f34ef72ad585355587cf9feed80bb4a2b5ce93910161135f565b6001600160a01b037f0000000000000000000000007c7aa99027892c5647d8733c8e0f0b3fde4147bc1663807ab4f7336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af1158015611627573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164b9190614059565b50565b6000546001600160a01b0361010090910416331461167e5760405162461bcd60e51b8152600401610fc890614076565b6001600160a01b03811660009081526017602052604090205460ff166116e65760405162461bcd60e51b815260206004820152601860248201527f7573657220616c72656164792077686974656c697374656400000000000000006044820152606401610fc8565b6001600160a01b038116600081815260176020908152604091829020805460ff1916905590519182527fbcad3e56607b6406d740aa2cdbeedb8fa353e7e935f3cfabd5eece16cf9ee8f0910161135f565b6000546001600160a01b036101009091041633146117675760405162461bcd60e51b8152600401610fc890614076565b6001600160a01b0381166117ce5760405162461bcd60e51b815260206004820152602860248201527f756e69737761705632526f757465722063616e206e6f74206265207a65726f20604482015267616464726573732160c01b6064820152608401610fc8565b6018546001600160a01b03828116911614156118475760405162461bcd60e51b815260206004820152603260248201527f415341503a2074686520726f7574657220697320616c72656164792073657420604482015271746f20746865206e6577206164647265737360701b6064820152608401610fc8565b6018546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3601880546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290516000929163c45a01559160048083019260209291908290030181865afa1580156118de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190291906140f0565b6001600160a01b031663c9c6539630601860009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611964573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198891906140f0565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156119d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f991906140f0565b601980546001600160a01b0319166001600160a01b0383161790556040519091507f65e020d47f9723e11541e9849e67ac83525347abf23f28544c73dcce1797308390600090a15050565b6000546001600160a01b03610100909104163314611a745760405162461bcd60e51b8152600401610fc890614076565b60af8110158015611a8757506127108111155b611add5760405162461bcd60e51b815260206004820152602160248201527f425053206d757374206265206265747765656e2031373520616e6420313030306044820152600360fc1b6064820152608401610fc8565b601b8190556040518181527fd046239846396c4c17ddd6f1645b9f5e494ad30ef422414dd6ed27cfa0a2cbd49060200161135f565b6000546001600160a01b03610100909104163314611b425760405162461bcd60e51b8152600401610fc890614076565b6114c260006133b7565b60008060008060007f0000000000000000000000007c7aa99027892c5647d8733c8e0f0b3fde4147bc6001600160a01b0316637b510fe8876040518263ffffffff1660e01b8152600401611baf91906001600160a01b0391909116815260200190565b60a060405180830381865afa158015611bcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf0919061410d565b939a9299509097509550909350915050565b6000546001600160a01b03610100909104163314611c325760405162461bcd60e51b8152600401610fc890614076565b604051638357d0bb60e01b8152600481018390526001600160a01b0382811660248301527f0000000000000000000000007c7aa99027892c5647d8733c8e0f0b3fde4147bc1690638357d0bb906044016112ac565b6000546001600160a01b03610100909104163314611cb75760405162461bcd60e51b8152600401610fc890614076565b6114c2613410565b6000546001600160a01b03610100909104163314611cef5760405162461bcd60e51b8152600401610fc890614076565b600e8054600c84905561ffff1916610100851515810260ff19169190911783151517918290556040805160ff92840483161515815260208101869052919092161515918101919091527f5309c183b0187b150ceb52ccf719557640a34f4bcf9d4b3edc70c3f3f27e18f590606001611085565b6000546001600160a01b03610100909104163314611d925760405162461bcd60e51b8152600401610fc890614076565b6019546001600160a01b0383811691161415611dfa5760405162461bcd60e51b815260206004820152602160248201527f415341503a2044455820706169722063616e206e6f742062652072656d6f76656044820152601960fa1b6064820152608401610fc8565b611e04828261348b565b5050565b6000546001600160a01b03610100909104163314611e385760405162461bcd60e51b8152600401610fc890614076565b604051600090339083908381818185875af1925050503d8060008114611e7a576040519150601f19603f3d011682016040523d82523d6000602084013e611e7f565b606091505b5050905080611ec55760405162461bcd60e51b815260206004820152601260248201527122aa24103932b9b1bab2903330b4b632b21760711b6044820152606401610fc8565b6040518281527f2935defdd9ec65bb02dc9049597c404aae26083909722b8e4ecd474eea640a9090602001611447565b3360009081526013602090815260408083206001600160a01b038616845290915281205482811015611f755760405162461bcd60e51b8152602060048201526024808201527f415341503a2064656372656173656420616c6c6f77616e63652062656c6f77206044820152637a65726f60e01b6064820152608401610fc8565b611f84338561113286856140d9565b5060019392505050565b6040516329a0382f60e21b81526001600160a01b0382811660048301526000917f0000000000000000000000007c7aa99027892c5647d8733c8e0f0b3fde4147bc9091169063a680e0bc90602401610e59565b6000610ead338484612a10565b6000546001600160a01b0361010090910416331461201e5760405162461bcd60e51b8152600401610fc890614076565b604b811015801561203157506127108111155b61207d5760405162461bcd60e51b815260206004820181905260248201527f425053206d757374206265206265747765656e20373520616e642031303030306044820152606401610fc8565b601a55565b6040516356bb6b4360e11b81526001600160a01b0382811660048301526000917f0000000000000000000000007c7aa99027892c5647d8733c8e0f0b3fde4147bc9091169063ad76d68690602401610e59565b6000546001600160a01b036101009091041633146121055760405162461bcd60e51b8152600401610fc890614076565b6001600160a01b03821660009081526014602052604090205460ff161515811515141561218c5760405162461bcd60e51b815260206004820152602f60248201527f415341503a206163636f756e7420697320616c72656164792073657420746f2060448201526e72657175657374656420737461746560881b6064820152608401610fc8565b6001600160a01b038216600081815260146020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000546001600160a01b0361010090910416331461221b5760405162461bcd60e51b8152600401610fc890614076565b60005b81518160ff161015611e045761224f828260ff168151811061224257612242614156565b60200260200101516114c4565b806122598161416c565b91505061221e565b6000546001600160a01b036101009091041633146122915760405162461bcd60e51b8152600401610fc890614076565b600e8054821515620100000262ff0000199091161790556040517f5bb2376cf656637e70e36c01d3da25685bf3b353f18681b8a5e48c7b2effe1339061135f90831515815260200190565b6000546001600160a01b0361010090910416331461230c5760405162461bcd60e51b8152600401610fc890614076565b601c805460ff191660011790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b6000546001600160a01b036101009091041633146123745760405162461bcd60e51b8152600401610fc890614076565b6001600160a01b0382166000818152601e6020908152604091829020805460ff191685151517905590519182527f60349a996898548db500578ca4112f4cdf4ed9f91ec6f1d2303f7ba21c2c37519101611447565b6000546001600160a01b036101009091041633146123f95760405162461bcd60e51b8152600401610fc890614076565b6001600160a01b0382166000818152601d6020908152604091829020805460ff191685151517905590519182527fedfc0254a9e21630ff8103538705e5f5101e7bd04293ed55755d5d1aaab458329101611447565b6000546001600160a01b0361010090910416331461247e5760405162461bcd60e51b8152600401610fc890614076565b600e80548215156101000261ff00199091161790556040517fb9bbb15e341600c8d067a0cadeba219905d5ba6d422b193c9c32265d26fc51c89061135f90831515815260200190565b6000546001600160a01b036101009091041633146124f75760405162461bcd60e51b8152600401610fc890614076565b600e80548215156401000000000264ff00000000199091161790556040517f341322866a3a2c26c27efa4c270c5ba86f6963257118897dd8196f224c002d439061135f90831515815260200190565b6000546001600160a01b036101009091041633146125765760405162461bcd60e51b8152600401610fc890614076565b6001600160a01b0381166125de5760405162461bcd60e51b815260206004820152602960248201527f5f6c697175696469747957616c6c65742063616e206e6f74206265207a65726f60448201526820616464726573732160b81b6064820152608401610fc8565b6001600160a01b0382166126455760405162461bcd60e51b815260206004820152602860248201527f5f747265617375727957616c6c65742063616e206e6f74206265207a65726f20604482015267616464726573732160c01b6064820152608401610fc8565b6010805462010000600160b01b031916620100006001600160a01b0385811682029290921792839055601180546001600160a01b0319168584169081179091556040805192909404909216815260208101919091527f0f37c6733428a3a65d46b7f1853a5ce4bfa3cf92d25322507a50bf23a0b5a0a89101611447565b6000546001600160a01b036101009091041633146126f25760405162461bcd60e51b8152600401610fc890614076565b6001600160a01b0381166127575760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610fc8565b61164b816133b7565b6000546001600160a01b036101009091041633146127905760405162461bcd60e51b8152600401610fc890614076565b60005b81518160ff161015611e04576127c4828260ff16815181106127b7576127b7614156565b602002602001015161164e565b806127ce8161416c565b915050612793565b600e54640100000000900460ff166128305760405162461bcd60e51b815260206004820181905260248201527f415341503a20636f6d706f756e64696e67206973206e6f7420656e61626c65646044820152606401610fc8565b6010805461ff0019166101001790556001600160a01b037f0000000000000000000000007c7aa99027892c5647d8733c8e0f0b3fde4147bc16636de1a5a96128753390565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af11580156128bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128df9190614059565b506010805461ff0019169055565b6001600160a01b03831661294f5760405162461bcd60e51b815260206004820152602360248201527f415341503a20617070726f76652066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610fc8565b6001600160a01b0382166129af5760405162461bcd60e51b815260206004820152602160248201527f415341503a20617070726f766520746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610fc8565b6001600160a01b0383811660008181526013602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b601c5460ff1680612a3357506000546001600160a01b0384811661010090920416145b80612a5057506000546001600160a01b0383811661010090920416145b80612a7357506001600160a01b03831660009081526016602052604090205460ff165b80612a9657506001600160a01b03821660009081526016602052604090205460ff165b612acd5760405162461bcd60e51b81526020600482015260086024820152672737ba1027b832b760c11b6044820152606401610fc8565b6001600160a01b03831660009081526017602052604090205460ff1615612b365760405162461bcd60e51b815260206004820152601b60248201527f415341503a2053656e64657220697320626c61636b6c697374656400000000006044820152606401610fc8565b6001600160a01b03821660009081526017602052604090205460ff1615612b9f5760405162461bcd60e51b815260206004820152601e60248201527f415341503a20526563697069656e7420697320626c61636b6c697374656400006044820152606401610fc8565b6001600160a01b038316612bc55760405162461bcd60e51b8152600401610fc89061418c565b6001600160a01b038216612beb5760405162461bcd60e51b8152600401610fc8906141d0565b6000612710601a54612bfc600f5490565b612c069190614212565b612c109190614231565b90506000612710601b54612c23600f5490565b612c2d9190614212565b612c379190614231565b90508183111580612c6057506001600160a01b0385166000908152601d602052604090205460ff165b612ca05760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610fc8565b6000546001600160a01b038681166101009092041614801590612ccc57506001600160a01b0384163014155b8015612ce357506001600160a01b03841661dead14155b8015612cfd57506019546001600160a01b03858116911614155b15612d9a576001600160a01b038416600090815260126020908152604080832054601e9092529091205460ff1680612d3e575081612d3b85836140c1565b11155b612d985760405162461bcd60e51b815260206004820152602560248201527f57616c6c657420686f6c6420746f6f206c6172676520616d6f756e74206f66206044820152643a37b5b2b760d91b6064820152608401610fc8565b505b6001600160a01b03851660009081526012602052604090205483811015612dd35760405162461bcd60e51b8152600401610fc890614253565b30600090815260126020526040902054600c54600e54479183101590610100900460ff168015612e005750805b8015612e0f575060105460ff16155b8015612e3457506001600160a01b03891660009081526015602052604090205460ff16155b8015612e4e57506018546001600160a01b038a8116911614155b8015612e6d57506000546001600160a01b038a81166101009092041614155b8015612e8c57506000546001600160a01b038981166101009092041614155b15612ec7576010805460ff19166001179055600e5460ff16612eae57600c5492505b612eb8838361360c565b42600d556010805460ff191690555b6019546000906001600160a01b038b811691161480612ef357506019546001600160a01b038a81169116145b80612f1657506001600160a01b03891660009081526015602052604090205460ff165b80612f3957506001600160a01b038a1660009081526015602052604090205460ff165b80612f4d5750600e546301000000900460ff165b15612f56575060015b6001600160a01b038a1660009081526014602052604090205460ff1680612f9557506001600160a01b03891660009081526014602052604090205460ff165b15612f9e575060005b60105460ff1680612fb65750601054610100900460ff165b80612fca5750600e5462010000900460ff16155b15612fd3575060005b80156131b3576001600160a01b03891660009081526015602052604081205460ff16801561300357506000600854115b156130bc576127106008548a6130199190614212565b6130239190614231565b9050600854600554826130369190614212565b6130409190614231565b6009600082825461305191906140c1565b90915550506008546007546130669083614212565b6130709190614231565b600b600082825461308191906140c1565b90915550506008546006546130969083614212565b6130a09190614231565b600a60008282546130b191906140c1565b9091555061319a9050565b6001600160a01b038b1660009081526015602052604090205460ff1680156130e657506000600454115b1561319a576127106004548a6130fc9190614212565b6131069190614231565b9050600454600154826131199190614212565b6131239190614231565b6009600082825461313491906140c1565b90915550506004546003546131499083614212565b6131539190614231565b600b600082825461316491906140c1565b90915550506004546002546131799083614212565b6131839190614231565b600a600082825461319491906140c1565b90915550505b6131a4818a6140d9565b98506131b18b3083613a25565b505b6131be8a8a8a613a25565b7f0000000000000000000000007c7aa99027892c5647d8733c8e0f0b3fde4147bc6001600160a01b031663e30443bc8b61320d8d6001600160a01b031660009081526012602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561325357600080fd5b505af1158015613267573d6000803e3d6000fd5b505050507f0000000000000000000000007c7aa99027892c5647d8733c8e0f0b3fde4147bc6001600160a01b031663e30443bc8a6132ba8c6001600160a01b031660009081526012602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561330057600080fd5b505af1158015613314573d6000803e3d6000fd5b5050505050505050505050505050565b60005460ff1661336d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610fc8565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b60005460ff16156134565760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610fc8565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861339a3390565b6001600160a01b03821660009081526015602052604090205460ff16151581151514156135205760405162461bcd60e51b815260206004820152603e60248201527f415341503a206175746f6d61746564206d61726b6574206d616b65722070616960448201527f7220697320616c72656164792073657420746f20746861742076616c756500006064820152608401610fc8565b6001600160a01b0382166000908152601560205260409020805460ff191682158015919091179091556135d057604051632ad4cab760e01b81526001600160a01b038381166004830152600160248301527f0000000000000000000000007c7aa99027892c5647d8733c8e0f0b3fde4147bc1690632ad4cab790604401600060405180830381600087803b1580156135b757600080fd5b505af11580156135cb573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60008211613618575050565b6010546000906201000090046001600160a01b03161561363757506009545b6000807f0000000000000000000000007c7aa99027892c5647d8733c8e0f0b3fde4147bc6001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136bc9190614040565b11156136c75750600b545b60006002600a546136d89190614231565b9050600081600a546136ea91906140d9565b90506000826136f986866140c1565b61370391906140c1565b90504761370f82613b44565b60008761371c83476140d9565b61372691906140c1565b60006009819055600b819055600a819055909150836137458984614212565b61374f9190614231565b905060008461375e8985614212565b6137689190614231565b905060008161377784866140d9565b61378191906140d9565b905082156138a4576010546040516000916201000090046001600160a01b03169085908381818185875af1925050503d80600081146137dc576040519150601f19603f3d011682016040523d82523d6000602084013e6137e1565b606091505b50509050801561382957604080518c8152602081018690527f16fe3128da7f457b9a8ebcf69ba3f90f7399ca9cb49d8a0692f9a79aef3b535e910160405180910390a16138a2565b7f551303dd5f39cbfe6daba6b3e27754b8a7d72f519756a2cde2b92c2bbde159a76040516138999060208082526028908201527f57616c6c6574206661696c656420746f207265636569766520747265617375726040820152677920746f6b656e7360c01b606082015260800190565b60405180910390a15b505b6138ae8782613c68565b60408051898152602081018390529081018890527fb63dc6f50047533abe2d6adf180d38d524c8d98e55ad199aac8d6b9801bbe24a9060600160405180910390a18115613a175760007f0000000000000000000000007c7aa99027892c5647d8733c8e0f0b3fde4147bc6001600160a01b03168360405160006040518083038185875af1925050503d8060008114613962576040519150601f19603f3d011682016040523d82523d6000602084013e613967565b606091505b5050905080156139af57604080518b8152602081018590527f18b842f7f2fd53a18468357f784d74cf54958b0c6d27dd5cfbb8f5f9c7bdfd5b910160405180910390a1613a15565b7f551303dd5f39cbfe6daba6b3e27754b8a7d72f519756a2cde2b92c2bbde159a7604051613a0c906020808252818101527f547261636b6572206661696c656420746f207265636569766520746f6b656e73604082015260600190565b60405180910390a15b505b505050505050505050505050565b6001600160a01b038316613a4b5760405162461bcd60e51b8152600401610fc89061418c565b6001600160a01b038216613a715760405162461bcd60e51b8152600401610fc8906141d0565b6001600160a01b03831660009081526012602052604090205481811015613aaa5760405162461bcd60e51b8152600401610fc890614253565b613ab482826140d9565b6001600160a01b038086166000908152601260205260408082209390935590851681529081208054849290613aea9084906140c1565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613b3691815260200190565b60405180910390a350505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613b7957613b79614156565b6001600160a01b03928316602091820292909201810191909152601854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bf691906140f0565b81600181518110613c0957613c09614156565b6001600160a01b039283166020918202929092010152601854613c2f91309116846128ed565b60185460405163791ac94760e01b81526001600160a01b039091169063791ac947906112ac908590600090869030904290600401614298565b601854613c809030906001600160a01b0316846128ed565b60185460115460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613cf0573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613d159190614309565b5050505050565b6001600160a01b038116811461164b57600080fd5b8035613d3c81613d1c565b919050565b600060208284031215613d5357600080fd5b8135613d5e81613d1c565b9392505050565b600060208083528351808285015260005b81811015613d9257858101830151858201604001528201613d76565b81811115613da4576000604083870101525b50601f01601f1916929092016040019392505050565b60008060408385031215613dcd57600080fd5b8235613dd881613d1c565b946020939093013593505050565b600080600060608486031215613dfb57600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215613e2757600080fd5b8335613e3281613d1c565b92506020840135613e4281613d1c565b929592945050506040919091013590565b801515811461164b57600080fd5b60008060408385031215613e7457600080fd5b8235613e7f81613d1c565b91506020830135613e8f81613e53565b809150509250929050565b600060208284031215613eac57600080fd5b8135613d5e81613e53565b600060208284031215613ec957600080fd5b5035919050565b60008060408385031215613ee357600080fd5b823591506020830135613e8f81613d1c565b600080600060608486031215613f0a57600080fd5b8335613f1581613e53565b9250602084013591506040840135613f2c81613e53565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215613f6057600080fd5b823567ffffffffffffffff80821115613f7857600080fd5b818501915085601f830112613f8c57600080fd5b813581811115613f9e57613f9e613f37565b8060051b604051601f19603f83011681018181108582111715613fc357613fc3613f37565b604052918252848201925083810185019188831115613fe157600080fd5b938501935b8285101561400657613ff785613d31565b84529385019392850192613fe6565b98975050505050505050565b6000806040838503121561402557600080fd5b823561403081613d1c565b91506020830135613e8f81613d1c565b60006020828403121561405257600080fd5b5051919050565b60006020828403121561406b57600080fd5b8151613d5e81613e53565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156140d4576140d46140ab565b500190565b6000828210156140eb576140eb6140ab565b500390565b60006020828403121561410257600080fd5b8151613d5e81613d1c565b600080600080600060a0868803121561412557600080fd5b855161413081613d1c565b602087015160408801516060890151608090990151929a91995097965090945092505050565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff811415614183576141836140ab565b60010192915050565b60208082526024908201527f415341503a207472616e736665722066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526022908201527f415341503a207472616e7366657220746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b600081600019048311821515161561422c5761422c6140ab565b500290565b60008261424e57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f415341503a207472616e7366657220616d6f756e7420657863656564732062616040820152646c616e636560d81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156142e85784516001600160a01b0316835293830193918301916001016142c3565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561431e57600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212205ce68fc4276d4327c4c82dbf3a1b7456af7498983aaff2be53b34381ae70c61264736f6c634300080a0033

Deployed Bytecode Sourcemap

18191:25897:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40032:178;;;;;;;;;;-1:-1:-1;40032:178:0;;;;;:::i;:::-;;:::i;:::-;;;687:25:1;;;675:2;660:18;40032:178:0;;;;;;;;23172:83;;;;;;;;;;-1:-1:-1;23242:5:0;;;;;;;;;;;;-1:-1:-1;;;23242:5:0;;;;23172:83;;;;;;;:::i;23952:210::-;;;;;;;;;;-1:-1:-1;23952:210:0;;;;;:::i;:::-;;:::i;:::-;;;1810:14:1;;1803:22;1785:41;;1773:2;1758:18;23952:210:0;1645:187:1;39698:178:0;;;;;;;;;;-1:-1:-1;39698:178:0;;;;;:::i;:::-;;:::i;19133:27::-;;;;;;;;;;;;;;;;36229:145;;;;;;;;;;-1:-1:-1;36229:145:0;;;;;:::i;:::-;;:::i;21478:41::-;;;;;;;;;;-1:-1:-1;21478:41:0;;;;-1:-1:-1;;;;;21478:41:0;;;;;;-1:-1:-1;;;;;2027:32:1;;;2009:51;;1997:2;1982:18;21478:41:0;1837:229:1;23442:108:0;;;;;;;;;;-1:-1:-1;23530:12:0;;23442:108;;18993:33;;;;;;;;;;;;;;;;18594:38;;;;;;;;;;;;;;;;37684:491;;;;;;;;;;-1:-1:-1;37684:491:0;;;;;:::i;:::-;;:::i;:::-;;25116:488;;;;;;;;;;-1:-1:-1;25116:488:0;;;;;:::i;:::-;;:::i;37193:483::-;;;;;;;;;;-1:-1:-1;37193:483:0;;;;;:::i;:::-;;:::i;36051:170::-;;;;;;;;;;-1:-1:-1;36051:170:0;;;;;:::i;:::-;;:::i;19318:37::-;;;;;;;;;;-1:-1:-1;19318:37:0;;;;;;;;;;;23358:76;;;;;;;;;;-1:-1:-1;23358:76:0;;23424:2;3505:36:1;;3493:2;3478:18;23358:76:0;3363:184:1;40935:157:0;;;;;;;;;;-1:-1:-1;40935:157:0;;;;;:::i;:::-;;:::i;18639:39::-;;;;;;;;;;;;;;;;42861:183;;;;;;;;;;-1:-1:-1;42861:183:0;;;;;:::i;:::-;;:::i;24170:280::-;;;;;;;;;;-1:-1:-1;24170:280:0;;;;;:::i;:::-;;:::i;25795:65::-;;;;;;;;;;;;;:::i;43281:207::-;;;;;;;;;;-1:-1:-1;43281:207:0;;;;;:::i;:::-;;:::i;21528:28::-;;;;;;;;;;-1:-1:-1;21528:28:0;;;;-1:-1:-1;;;;;21528:28:0;;;39353:94;;;;;;;;;;;;;:::i;35744:126::-;;;;;;;;;;-1:-1:-1;35744:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;35834:28:0;35810:4;35834:28;;;:19;:28;;;;;;;;;35744:126;43496:217;;;;;;;;;;-1:-1:-1;43496:217:0;;;;;:::i;:::-;;:::i;21565:28::-;;;;;;;;;;;;;;;;7662:86;;;;;;;;;;-1:-1:-1;7709:4:0;7733:7;;;7662:86;;18728:35;;;;;;;;;;;;;;;;42061:128;;;;;;;;;;-1:-1:-1;42061:128:0;;;;;:::i;:::-;-1:-1:-1;;;;;42152:29:0;42128:4;42152:29;;;:20;:29;;;;;;;;;42061:128;38632:713;;;;;;;;;;-1:-1:-1;38632:713:0;;;;;:::i;:::-;;:::i;42197:254::-;;;;;;;;;;-1:-1:-1;42197:254:0;;;;;:::i;:::-;;:::i;21427:44::-;;;;;;;;;;;;;;;42685:168;;;;;;;;;;-1:-1:-1;42685:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;42812:33:0;42783:4;42812:33;;;:24;:33;;;;;;;;;42685:168;19200:30;;;;;;;;;;-1:-1:-1;19200:30:0;;;;;;;;;;;23558:177;;;;;;;;;;-1:-1:-1;23558:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;23709:18:0;23677:7;23709:18;;;:9;:18;;;;;;;23558:177;5765:103;;;;;;;;;;;;;:::i;21600:33::-;;;;;;;;;;;;;;;;40218:278;;;;;;;;;;-1:-1:-1;40218:278:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4706:32:1;;;4688:51;;4770:2;4755:18;;4748:34;;;;4798:18;;;4791:34;;;;4856:2;4841:18;;4834:34;4899:3;4884:19;;4877:35;4675:3;4660:19;40218:278:0;4429:489:1;18818:40:0;;;;;;;;;;;;;;;;35878:165;;;;;;;;;;-1:-1:-1;35878:165:0;;;;;:::i;:::-;;:::i;25726:61::-;;;;;;;;;;;;;:::i;19237:29::-;;;;;;;;;;-1:-1:-1;19237:29:0;;;;;;;;;;;5114:87;;;;;;;;;;-1:-1:-1;5160:7:0;5187:6;;;;-1:-1:-1;;;;;5187:6:0;5114:87;;23263;;;;;;;;;;-1:-1:-1;23335:7:0;;;;;;;;;;;;-1:-1:-1;;;23335:7:0;;;;23263:87;;19273:38;;;;;;;;;;-1:-1:-1;19273:38:0;;;;;;;;;;;41265:422;;;;;;;;;;-1:-1:-1;41265:422:0;;;;;:::i;:::-;;:::i;36944:241::-;;;;;;;;;;-1:-1:-1;36944:241:0;;;;;:::i;:::-;;:::i;43052:221::-;;;;;;;;;;-1:-1:-1;43052:221:0;;;;;:::i;:::-;;:::i;24458:426::-;;;;;;;;;;-1:-1:-1;24458:426:0;;;;;:::i;:::-;;:::i;40504:138::-;;;;;;;;;;-1:-1:-1;40504:138:0;;;;;:::i;:::-;;:::i;24892:216::-;;;;;;;;;;-1:-1:-1;24892:216:0;;;;;:::i;:::-;;:::i;41695:167::-;;;;;;;;;;-1:-1:-1;41695:167:0;;;;;:::i;:::-;;:::i;39884:140::-;;;;;;;;;;-1:-1:-1;39884:140:0;;;;;:::i;:::-;;:::i;18909:36::-;;;;;;;;;;;;;;;;18865:37;;;;;;;;;;;;;;;;19708:57;;;;;;;;;;-1:-1:-1;19708:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;35406:330;;;;;;;;;;-1:-1:-1;35406:330:0;;;;;:::i;:::-;;:::i;43721:172::-;;;;;;;;;;-1:-1:-1;43721:172:0;;;;;:::i;:::-;;:::i;40794:133::-;;;;;;;;;;-1:-1:-1;40794:133:0;;;;;:::i;:::-;;:::i;18685:36::-;;;;;;;;;;;;;;;;25612:106;;;;;;;;;;;;;:::i;18954:32::-;;;;;;;;;;;;;;;;18772:39;;;;;;;;;;;;;;;;42459:218;;;;;;;;;;-1:-1:-1;42459:218:0;;;;;:::i;:::-;;:::i;41870:183::-;;;;;;;;;;-1:-1:-1;41870:183:0;;;;;:::i;:::-;;:::i;23743:201::-;;;;;;;;;;-1:-1:-1;23743:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;23909:18:0;;;23877:7;23909:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;23743:201;40650:136;;;;;;;;;;-1:-1:-1;40650:136:0;;;;;:::i;:::-;;:::i;19073:53::-;;;;;;;;;;;;;;;;41100:157;;;;;;;;;;-1:-1:-1;41100:157:0;;;;;:::i;:::-;;:::i;36382:554::-;;;;;;;;;;-1:-1:-1;36382:554:0;;;;;:::i;:::-;;:::i;6023:238::-;;;;;;;;;;-1:-1:-1;6023:238:0;;;;;:::i;:::-;;:::i;43901:184::-;;;;;;;;;;-1:-1:-1;43901:184:0;;;;;:::i;:::-;;:::i;19033:31::-;;;;;;;;;;;;;;;;39455:235;;;;;;;;;;;;;:::i;40032:178::-;40159:43;;-1:-1:-1;;;40159:43:0;;-1:-1:-1;;;;;2027:32:1;;;40159:43:0;;;2009:51:1;40127:7:0;;40159:13;:34;;;;;;1982:18:1;;40159:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40152:50;40032:178;-1:-1:-1;;40032:178:0:o;23952:210::-;24071:4;24093:39;4036:10;24116:7;24125:6;24093:8;:39::i;:::-;-1:-1:-1;24150:4:0;23952:210;;;;:::o;39698:178::-;39825:43;;-1:-1:-1;;;39825:43:0;;-1:-1:-1;;;;;2027:32:1;;;39825:43:0;;;2009:51:1;39793:7:0;;39825:13;:34;;;;;;1982:18:1;;39825:43:0;1837:229:1;36229:145:0;36322:44;;-1:-1:-1;;;36322:44:0;;-1:-1:-1;;;;;2027:32:1;;;36322:44:0;;;2009:51:1;36298:4:0;;36322:13;:35;;;;;;1982:18:1;;36322:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37684:491::-;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;;;;;;;;;37833:18:::1;:33:::0;;;37877:19:::1;:35:::0;;;37923:16:::1;:29:::0;;;37942:10;37981:28:::1;37899:13:::0;37854:12;37981:28:::1;:::i;:::-;:41;;;;:::i;:::-;37963:15;:59:::0;;;38060:4:::1;-1:-1:-1::0;38041:23:0::1;38033:63;;;::::0;-1:-1:-1;;;38033:63:0;;9019:2:1;38033:63:0::1;::::0;::::1;9001:21:1::0;9058:2;9038:18;;;9031:30;9097:29;9077:18;;;9070:57;9144:18;;38033:63:0::1;8817:351:1::0;38033:63:0::1;38112:55;::::0;;9375:25:1;;;9431:2;9416:18;;9409:34;;;9459:18;;;9452:34;;;38112:55:0::1;::::0;9363:2:1;9348:18;38112:55:0::1;;;;;;;;37684:491:::0;;;:::o;25116:488::-;25256:4;25273:36;25283:6;25291:9;25302:6;25273:9;:36::i;:::-;-1:-1:-1;;;;;25347:19:0;;25320:24;25347:19;;;:11;:19;;;;;;;;4036:10;25347:33;;;;;;;;25413:26;;;;25391:115;;;;-1:-1:-1;;;25391:115:0;;9699:2:1;25391:115:0;;;9681:21:1;9738:2;9718:18;;;9711:30;9777:34;9757:18;;;9750:62;-1:-1:-1;;;9828:18:1;;;9821:37;9875:19;;25391:115:0;9497:403:1;25391:115:0;25517:57;25526:6;4036:10;25548:25;25567:6;25548:16;:25;:::i;:::-;25517:8;:57::i;:::-;-1:-1:-1;25592:4:0;;25116:488;-1:-1:-1;;;;25116:488:0:o;37193:483::-;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;37341:17:::1;:32:::0;;;37384:18:::1;:34:::0;;;37429:15:::1;:28:::0;;;37447:10;37485:28:::1;37405:13:::0;37361:12;37485:28:::1;:::i;:::-;:41;;;;:::i;:::-;37468:14;:58:::0;;;37563:4:::1;-1:-1:-1::0;37545:22:0::1;37537:61;;;::::0;-1:-1:-1;;;37537:61:0;;10237:2:1;37537:61:0::1;::::0;::::1;10219:21:1::0;10276:2;10256:18;;;10249:30;10315:28;10295:18;;;10288:56;10361:18;;37537:61:0::1;10035:350:1::0;37537:61:0::1;37614:54;::::0;;9375:25:1;;;9431:2;9416:18;;9409:34;;;9459:18;;;9452:34;;;37614:54:0::1;::::0;9363:2:1;9348:18;37614:54:0::1;9173:319:1::0;36051:170:0;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;36162:51:::1;::::0;-1:-1:-1;;;36162:51:0;;-1:-1:-1;;;;;10576:32:1;;;36162:51:0::1;::::0;::::1;10558::1::0;10652:14;;10645:22;10625:18;;;10618:50;36162:13:0::1;:32;::::0;::::1;::::0;10531:18:1;;36162:51:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;36051:170:::0;;:::o;40935:157::-;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;41011:18:::1;:29:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;41011:29:0;;::::1;;::::0;;41056:28:::1;::::0;::::1;::::0;::::1;::::0;41032:8;1810:14:1;1803:22;1785:41;;1773:2;1758:18;;1645:187;41056:28:0::1;;;;;;;;40935:157:::0;:::o;42861:183::-;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;42945:44:::1;::::0;-1:-1:-1;;;42945:44:0;;42969:10:::1;42945:44;::::0;::::1;10853:51:1::0;10920:18;;;10913:34;;;-1:-1:-1;;;;;42945:23:0;::::1;::::0;::::1;::::0;10826:18:1;;42945:44:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;43007:29:0::1;::::0;;-1:-1:-1;;;;;10871:32:1;;10853:51;;10935:2;10920:18;;10913:34;;;43007:29:0::1;::::0;10826:18:1;43007:29:0::1;;;;;;;;42861:183:::0;;:::o;24170:280::-;4036:10;24268:4;24362:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;24362:34:0;;;;;;;;;;24268:4;;24290:130;;24340:7;;24362:47;;24399:10;;24362:47;:::i;25795:65::-;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;25842:10:::1;:8;:10::i;:::-;25795:65::o:0;43281:207::-;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43352:20:0;::::1;;::::0;;;:13:::1;:20;::::0;;;;;::::1;;43351:21;43343:58;;;::::0;-1:-1:-1;;;43343:58:0;;11160:2:1;43343:58:0::1;::::0;::::1;11142:21:1::0;11199:2;11179:18;;;11172:30;11238:26;11218:18;;;11211:54;11282:18;;43343:58:0::1;10958:348:1::0;43343:58:0::1;-1:-1:-1::0;;;;;43412:20:0;::::1;;::::0;;;:13:::1;:20;::::0;;;;;;;;:27;;-1:-1:-1;;43412:27:0::1;43435:4;43412:27;::::0;;43455:25;;2009:51:1;;;43455:25:0::1;::::0;1982:18:1;43455:25:0::1;1837:229:1::0;39353:94:0;-1:-1:-1;;;;;39388:13:0;:28;;4036:10;39388:51;;-1:-1:-1;;;;;;39388:51:0;;;;;;;-1:-1:-1;;;;;2027:32:1;;;39388:51:0;;;2009::1;1982:18;;39388:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39353:94::o;43496:217::-;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43576:20:0;::::1;;::::0;;;:13:::1;:20;::::0;;;;;::::1;;43568:57;;;::::0;-1:-1:-1;;;43568:57:0;;11737:2:1;43568:57:0::1;::::0;::::1;11719:21:1::0;11776:2;11756:18;;;11749:30;11815:26;11795:18;;;11788:54;11859:18;;43568:57:0::1;11535:348:1::0;43568:57:0::1;-1:-1:-1::0;;;;;43636:20:0;::::1;43659:5;43636:20:::0;;;:13:::1;:20;::::0;;;;;;;;:28;;-1:-1:-1;;43636:28:0::1;::::0;;43680:25;;2009:51:1;;;43680:25:0::1;::::0;1982:18:1;43680:25:0::1;1837:229:1::0;38632:713:0;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38733:24:0;::::1;38711:114;;;::::0;-1:-1:-1;;;38711:114:0;;12090:2:1;38711:114:0::1;::::0;::::1;12072:21:1::0;12129:2;12109:18;;;12102:30;12168:34;12148:18;;;12141:62;-1:-1:-1;;;12219:18:1;;;12212:38;12267:19;;38711:114:0::1;11888:404:1::0;38711:114:0::1;38880:15;::::0;-1:-1:-1;;;;;38858:38:0;;::::1;38880:15:::0;::::1;38858:38;;38836:138;;;::::0;-1:-1:-1;;;38836:138:0;;12499:2:1;38836:138:0::1;::::0;::::1;12481:21:1::0;12538:2;12518:18;;;12511:30;12577:34;12557:18;;;12550:62;-1:-1:-1;;;12628:18:1;;;12621:48;12686:19;;38836:138:0::1;12297:414:1::0;38836:138:0::1;39034:15;::::0;38992:59:::1;::::0;-1:-1:-1;;;;;39034:15:0;;::::1;::::0;38992:59;::::1;::::0;::::1;::::0;39034:15:::1;::::0;38992:59:::1;39062:15;:48:::0;;-1:-1:-1;;;;;;39062:48:0::1;-1:-1:-1::0;;;;;39062:48:0;::::1;::::0;;::::1;::::0;;;39164:25:::1;::::0;;-1:-1:-1;;;39164:25:0;;;;-1:-1:-1;;39062:48:0;39164:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;39062:48;39164:25:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39146:69:0::1;;39224:4;39231:15;;;;;;;;;-1:-1:-1::0;;;;;39231:15:0::1;-1:-1:-1::0;;;;;39231:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39146:108;::::0;-1:-1:-1;;;;;;39146:108:0::1;::::0;;;;;;-1:-1:-1;;;;;13202:15:1;;;39146:108:0::1;::::0;::::1;13184:34:1::0;13254:15;;13234:18;;;13227:43;13119:18;;39146:108:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39265:13;:30:::0;;-1:-1:-1;;;;;;39265:30:0::1;-1:-1:-1::0;;;;;39265:30:0;::::1;;::::0;;39313:24:::1;::::0;39265:30;;-1:-1:-1;39313:24:0::1;::::0;-1:-1:-1;;39313:24:0::1;38700:645;38632:713:::0;:::o;42197:254::-;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;42294:3:::1;42287;:10;;:26;;;;;42308:5;42301:3;:12;;42287:26;42265:109;;;::::0;-1:-1:-1;;;42265:109:0;;13483:2:1;42265:109:0::1;::::0;::::1;13465:21:1::0;13522:2;13502:18;;;13495:30;13561:34;13541:18;;;13534:62;-1:-1:-1;;;13612:18:1;;;13605:31;13653:19;;42265:109:0::1;13281:397:1::0;42265:109:0::1;42385:12;:18:::0;;;42419:24:::1;::::0;687:25:1;;;42419:24:0::1;::::0;675:2:1;660:18;42419:24:0::1;541:177:1::0;5765:103:0;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;5830:30:::1;5857:1;5830:18;:30::i;40218:278::-:0;40321:7;40343;40365;40387;40409;40451:13;-1:-1:-1;;;;;40451:28:0;;40480:7;40451:37;;;;;;;;;;;;;;-1:-1:-1;;;;;2027:32:1;;;;2009:51;;1997:2;1982:18;;1837:229;40451:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40444:44;;;;-1:-1:-1;40444:44:0;;-1:-1:-1;40444:44:0;-1:-1:-1;40444:44:0;;-1:-1:-1;40218:278:0;-1:-1:-1;;40218:278:0:o;35878:165::-;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;35989:46:::1;::::0;-1:-1:-1;;;35989:46:0;;::::1;::::0;::::1;14359:25:1::0;;;-1:-1:-1;;;;;14420:32:1;;;14400:18;;;14393:60;35989:13:0::1;:30;::::0;::::1;::::0;14332:18:1;;35989:46:0::1;14185:274:1::0;25726:61:0;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;25771:8:::1;:6;:8::i;41265:422::-:0;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;41427:11:::1;:26:::0;;41464:18:::1;:40:::0;;;-1:-1:-1;;41515:28:0;41427:26:::1;::::0;::::1;;::::0;::::1;-1:-1:-1::0;;41515:28:0;;;;;;::::1;;;::::0;;;;41561:118:::1;::::0;;41427:26:::1;41597:11:::0;;::::1;::::0;::::1;14679:14:1::0;14672:22;14654:41;;14726:2;14711:18;;14704:34;;;41656:12:0;;;::::1;14781:14:1::0;14774:22;14754:18;;;14747:50;;;;41561:118:0::1;::::0;14642:2:1;14627:18;41561:118:0::1;14464:339:1::0;36944:241:0;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;37074:13:::1;::::0;-1:-1:-1;;;;;37066:21:0;;::::1;37074:13:::0;::::1;37066:21;;37058:67;;;::::0;-1:-1:-1;;;37058:67:0;;15010:2:1;37058:67:0::1;::::0;::::1;14992:21:1::0;15049:2;15029:18;;;15022:30;15088:34;15068:18;;;15061:62;-1:-1:-1;;;15139:18:1;;;15132:31;15180:19;;37058:67:0::1;14808:397:1::0;37058:67:0::1;37136:41;37165:4;37171:5;37136:28;:41::i;:::-;36944:241:::0;;:::o;43052:221::-;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;43137:44:::1;::::0;43119:12:::1;::::0;43145:10:::1;::::0;43169:7;;43119:12;43137:44;43119:12;43137:44;43169:7;43145:10;43137:44:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43118:63;;;43200:7;43192:38;;;::::0;-1:-1:-1;;;43192:38:0;;15622:2:1;43192:38:0::1;::::0;::::1;15604:21:1::0;15661:2;15641:18;;;15634:30;-1:-1:-1;;;15680:18:1;;;15673:48;15738:18;;43192:38:0::1;15420:342:1::0;43192:38:0::1;43246:19;::::0;687:25:1;;;43246:19:0::1;::::0;675:2:1;660:18;43246:19:0::1;541:177:1::0;24458:426:0;4036:10;24561:4;24610:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;24610:34:0;;;;;;;;;;24677:35;;;;24655:121;;;;-1:-1:-1;;;24655:121:0;;15969:2:1;24655:121:0;;;15951:21:1;16008:2;15988:18;;;15981:30;16047:34;16027:18;;;16020:62;-1:-1:-1;;;16098:18:1;;;16091:34;16142:19;;24655:121:0;15767:400:1;24655:121:0;24787:67;4036:10;24810:7;24819:34;24838:15;24819:16;:34;:::i;24787:67::-;-1:-1:-1;24872:4:0;;24458:426;-1:-1:-1;;;24458:426:0:o;40504:138::-;40595:39;;-1:-1:-1;;;40595:39:0;;-1:-1:-1;;;;;2027:32:1;;;40595:39:0;;;2009:51:1;40568:7:0;;40595:13;:30;;;;;;1982:18:1;;40595:39:0;1837:229:1;24892:216:0;25014:4;25036:42;4036:10;25060:9;25071:6;25036:9;:42::i;41695:167::-;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;41774:2:::1;41767:3;:9;;:25;;;;;41787:5;41780:3;:12;;41767:25;41759:70;;;::::0;-1:-1:-1;;;41759:70:0;;16374:2:1;41759:70:0::1;::::0;::::1;16356:21:1::0;;;16393:18;;;16386:30;16452:34;16432:18;;;16425:62;16504:18;;41759:70:0::1;16172:356:1::0;41759:70:0::1;41840:8;:14:::0;41695:167::o;39884:140::-;39976:40;;-1:-1:-1;;;39976:40:0;;-1:-1:-1;;;;;2027:32:1;;;39976:40:0;;;2009:51:1;39949:7:0;;39976:13;:31;;;;;;1982:18:1;;39976:40:0;1837:229:1;35406:330:0;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35513:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;:40;;::::0;::::1;;;;35491:137;;;::::0;-1:-1:-1;;;35491:137:0;;16735:2:1;35491:137:0::1;::::0;::::1;16717:21:1::0;16774:2;16754:18;;;16747:30;16813:34;16793:18;;;16786:62;-1:-1:-1;;;16864:18:1;;;16857:45;16919:19;;35491:137:0::1;16533:411:1::0;35491:137:0::1;-1:-1:-1::0;;;;;35639:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;35639:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;35694:34;;1785:41:1;;;35694:34:0::1;::::0;1758:18:1;35694:34:0::1;;;;;;;35406:330:::0;;:::o;43721:172::-;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;43802:7:::1;43797:89;43819:6;:13;43815:1;:17;;;43797:89;;;43854:20;43864:6;43871:1;43864:9;;;;;;;;;;:::i;:::-;;;;;;;43854;:20::i;:::-;43834:3:::0;::::1;::::0;::::1;:::i;:::-;;;;43797:89;;40794:133:::0;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;40862:10:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;40862:21:0;;::::1;;::::0;;40899:20:::1;::::0;::::1;::::0;::::1;::::0;40875:8;1810:14:1;1803:22;1785:41;;1773:2;1758:18;;1645:187;25612:106:0;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;25665:6:::1;:13:::0;;-1:-1:-1;;25665:13:0::1;25674:4;25665:13;::::0;;25694:16:::1;::::0;::::1;::::0;25665:6:::1;::::0;25694:16:::1;25612:106::o:0;42459:218::-;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42572:33:0;::::1;;::::0;;;:24:::1;:33;::::0;;;;;;;;:44;;-1:-1:-1;;42572:44:0::1;::::0;::::1;;;::::0;;42632:37;;2009:51:1;;;42632:37:0::1;::::0;1982:18:1;42632:37:0::1;1837:229:1::0;41870:183:0;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41956:29:0;::::1;;::::0;;;:20:::1;:29;::::0;;;;;;;;:40;;-1:-1:-1;;41956:40:0::1;::::0;::::1;;;::::0;;42012:33;;2009:51:1;;;42012:33:0::1;::::0;1982:18:1;42012:33:0::1;1837:229:1::0;40650:136:0;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;40719:11:::1;:22:::0;;;::::1;;;;-1:-1:-1::0;;40719:22:0;;::::1;;::::0;;40757:21:::1;::::0;::::1;::::0;::::1;::::0;40733:8;1810:14:1;1803:22;1785:41;;1773:2;1758:18;;1645:187;41100:157:0;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;41176:18:::1;:29:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;41176:29:0;;::::1;;::::0;;41221:28:::1;::::0;::::1;::::0;::::1;::::0;41197:8;1810:14:1;1803:22;1785:41;;1773:2;1758:18;;1645:187;36382:554:0;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36545:30:0;::::1;36523:121;;;::::0;-1:-1:-1;;;36523:121:0;;17463:2:1;36523:121:0::1;::::0;::::1;17445:21:1::0;17502:2;17482:18;;;17475:30;17541:34;17521:18;;;17514:62;-1:-1:-1;;;17592:18:1;;;17585:39;17641:19;;36523:121:0::1;17261:405:1::0;36523:121:0::1;-1:-1:-1::0;;;;;36677:29:0;::::1;36655:119;;;::::0;-1:-1:-1;;;36655:119:0;;17873:2:1;36655:119:0::1;::::0;::::1;17855:21:1::0;17912:2;17892:18;;;17885:30;17951:34;17931:18;;;17924:62;-1:-1:-1;;;18002:18:1;;;17995:38;18050:19;;36655:119:0::1;17671:404:1::0;36655:119:0::1;36787:14;:32:::0;;-1:-1:-1;;;;;;36787:32:0::1;::::0;-1:-1:-1;;;;;36787:32:0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;36830:15:::1;:34:::0;;-1:-1:-1;;;;;;36830:34:0::1;::::0;;::::1;::::0;;::::1;::::0;;;36882:46:::1;::::0;;36896:14;;;::::1;::::0;;::::1;13184:34:1::0;;13249:2;13234:18;;13227:43;;;;36882:46:0::1;::::0;13119:18:1;36882:46:0::1;12972:304:1::0;6023:238:0;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6126:22:0;::::1;6104:110;;;::::0;-1:-1:-1;;;6104:110:0;;18282:2:1;6104:110:0::1;::::0;::::1;18264:21:1::0;18321:2;18301:18;;;18294:30;18360:34;18340:18;;;18333:62;-1:-1:-1;;;18411:18:1;;;18404:36;18457:19;;6104:110:0::1;18080:402:1::0;6104:110:0::1;6225:28;6244:8;6225:18;:28::i;43901:184::-:0;5160:7;5187:6;-1:-1:-1;;;;;5187:6:0;;;;;4036:10;5334:23;5326:68;;;;-1:-1:-1;;;5326:68:0;;;;;;;:::i;:::-;43984:7:::1;43979:99;44001:6;:13;43997:1;:17;;;43979:99;;;44036:30;44056:6;44063:1;44056:9;;;;;;;;;;:::i;:::-;;;;;;;44036:19;:30::i;:::-;44016:3:::0;::::1;::::0;::::1;:::i;:::-;;;;43979:99;;39455:235:::0;39501:18;;;;;;;39493:63;;;;-1:-1:-1;;;39493:63:0;;18689:2:1;39493:63:0;;;18671:21:1;;;18708:18;;;18701:30;18767:34;18747:18;;;18740:62;18819:18;;39493:63:0;18487:356:1;39493:63:0;39567:13;:20;;-1:-1:-1;;39567:20:0;;;;;-1:-1:-1;;;;;39598:13:0;:29;;39636:12;4036:10;;3956:98;39636:12;39598:52;;-1:-1:-1;;;;;;39598:52:0;;;;;;;-1:-1:-1;;;;;2027:32:1;;;39598:52:0;;;2009:51:1;1982:18;;39598:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;39661:13:0;:21;;-1:-1:-1;;39661:21:0;;;39455:235::o;30957:367::-;-1:-1:-1;;;;;31084:19:0;;31076:67;;;;-1:-1:-1;;;31076:67:0;;19050:2:1;31076:67:0;;;19032:21:1;19089:2;19069:18;;;19062:30;19128:34;19108:18;;;19101:62;-1:-1:-1;;;19179:18:1;;;19172:33;19222:19;;31076:67:0;18848:399:1;31076:67:0;-1:-1:-1;;;;;31162:21:0;;31154:67;;;;-1:-1:-1;;;31154:67:0;;19454:2:1;31154:67:0;;;19436:21:1;19493:2;19473:18;;;19466:30;19532:34;19512:18;;;19505:62;-1:-1:-1;;;19583:18:1;;;19576:31;19624:19;;31154:67:0;19252:397:1;31154:67:0;-1:-1:-1;;;;;31232:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;31284:32;;687:25:1;;;31284:32:0;;660:18:1;31284:32:0;;;;;;;30957:367;;;:::o;25868:4467::-;26014:6;;;;;:44;;-1:-1:-1;5160:7:0;5187:6;-1:-1:-1;;;;;26041:17:0;;;5187:6;;;;;26041:17;26014:44;:85;;;-1:-1:-1;5160:7:0;5187:6;-1:-1:-1;;;;;26079:20:0;;;5187:6;;;;;26079:20;26014:85;:124;;;-1:-1:-1;;;;;;26120:18:0;;;;;;:10;:18;;;;;;;;26014:124;:166;;;-1:-1:-1;;;;;;26159:21:0;;;;;;:10;:21;;;;;;;;26014:166;25992:224;;;;-1:-1:-1;;;25992:224:0;;19856:2:1;25992:224:0;;;19838:21:1;19895:1;19875:18;;;19868:29;-1:-1:-1;;;19913:18:1;;;19906:38;19961:18;;25992:224:0;19654:331:1;25992:224:0;-1:-1:-1;;;;;26238:21:0;;;;;;:13;:21;;;;;;;;26237:22;26229:62;;;;-1:-1:-1;;;26229:62:0;;20192:2:1;26229:62:0;;;20174:21:1;20231:2;20211:18;;;20204:30;20270:29;20250:18;;;20243:57;20317:18;;26229:62:0;19990:351:1;26229:62:0;-1:-1:-1;;;;;26311:24:0;;;;;;:13;:24;;;;;;;;26310:25;26302:68;;;;-1:-1:-1;;;26302:68:0;;20548:2:1;26302:68:0;;;20530:21:1;20587:2;20567:18;;;20560:30;20626:32;20606:18;;;20599:60;20676:18;;26302:68:0;20346:354:1;26302:68:0;-1:-1:-1;;;;;26391:20:0;;26383:69;;;;-1:-1:-1;;;26383:69:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26471:23:0;;26463:70;;;;-1:-1:-1;;;26463:70:0;;;;;;;:::i;:::-;26546:20;26598:5;26586:8;;26570:13;23530:12;;;23442:108;26570:13;:24;;;;:::i;:::-;26569:34;;;;:::i;:::-;26546:57;;26614:18;26668:5;26652:12;;26636:13;23530:12;;;23442:108;26636:13;:28;;;;:::i;:::-;26635:38;;;;:::i;:::-;26614:59;;26716:12;26706:6;:22;;:54;;;-1:-1:-1;;;;;;26732:28:0;;;;;;:20;:28;;;;;;;;26706:54;26684:121;;;;-1:-1:-1;;;26684:121:0;;22110:2:1;26684:121:0;;;22092:21:1;22149:2;22129:18;;;22122:30;-1:-1:-1;;;22168:18:1;;;22161:47;22225:18;;26684:121:0;21908:341:1;26684:121:0;5160:7;5187:6;-1:-1:-1;;;;;26836:17:0;;;5187:6;;;;;26836:17;;;;:60;;-1:-1:-1;;;;;;26870:26:0;;26891:4;26870:26;;26836:60;:103;;;;-1:-1:-1;;;;;;26913:26:0;;18365:42;26913:26;;26836:103;:146;;;;-1:-1:-1;26969:13:0;;-1:-1:-1;;;;;26956:26:0;;;26969:13;;26956:26;;26836:146;26818:461;;;-1:-1:-1;;;;;23709:18:0;;27009:22;23709:18;;;:9;:18;;;;;;;;;27095:24;:35;;;;;;;;;;:99;;-1:-1:-1;27183:10:0;27156:23;27173:6;27156:14;:23;:::i;:::-;:37;;27095:99;27069:198;;;;-1:-1:-1;;;27069:198:0;;22456:2:1;27069:198:0;;;22438:21:1;22495:2;22475:18;;;22468:30;22534:34;22514:18;;;22507:62;-1:-1:-1;;;22585:18:1;;;22578:35;22630:19;;27069:198:0;22254:401:1;27069:198:0;26994:285;26818:461;-1:-1:-1;;;;;27315:17:0;;27291:21;27315:17;;;:9;:17;;;;;;27365:23;;;;27343:110;;;;-1:-1:-1;;;27343:110:0;;;;;;;:::i;:::-;27515:4;27466:28;23709:18;;;:9;:18;;;;;;27637;;27686:11;;27564:21;;27613:42;;;;27686:11;;;;;:43;;;;;27722:7;27686:43;:77;;;;-1:-1:-1;27755:8:0;;;;27754:9;27686:77;:158;;;;-1:-1:-1;;;;;;27811:33:0;;;;;;:25;:33;;;;;;;;27810:34;27686:158;:258;;;;-1:-1:-1;27928:15:0;;-1:-1:-1;;;;;27910:34:0;;;27928:15;;27910:34;;27686:258;:330;;;;-1:-1:-1;5160:7:0;5187:6;-1:-1:-1;;;;;27999:17:0;;;5187:6;;;;;27999:17;;27686:330;:367;;;;-1:-1:-1;5160:7:0;5187:6;-1:-1:-1;;;;;28033:20:0;;;5187:6;;;;;28033:20;;27686:367;27668:700;;;28080:8;:15;;-1:-1:-1;;28080:15:0;28091:4;28080:15;;;28117:12;;28080:15;28117:12;28112:95;;28173:18;;28150:41;;28112:95;28221:57;28234:20;28256:21;28221:12;:57::i;:::-;28310:15;28295:12;:30;28340:8;:16;;-1:-1:-1;;28340:16:0;;;27668:700;28441:13;;28380:12;;-1:-1:-1;;;;;28423:32:0;;;28441:13;;28423:32;;:84;;-1:-1:-1;28493:13:0;;-1:-1:-1;;;;;28472:35:0;;;28493:13;;28472:35;28423:84;:137;;;-1:-1:-1;;;;;;28524:36:0;;;;;;:25;:36;;;;;;;;28423:137;:187;;;-1:-1:-1;;;;;;28577:33:0;;;;;;:25;:33;;;;;;;;28423:187;:222;;;-1:-1:-1;28627:18:0;;;;;;;28423:222;28405:293;;;-1:-1:-1;28682:4:0;28405:293;-1:-1:-1;;;;;28714:27:0;;;;;;:19;:27;;;;;;;;;:61;;-1:-1:-1;;;;;;28745:30:0;;;;;;:19;:30;;;;;;;;28714:61;28710:109;;;-1:-1:-1;28802:5:0;28710:109;28835:8;;;;;:25;;-1:-1:-1;28847:13:0;;;;;;;28835:25;:40;;;-1:-1:-1;28865:10:0;;;;;;;28864:11;28835:40;28831:88;;;-1:-1:-1;28902:5:0;28831:88;28935:7;28931:1191;;;-1:-1:-1;;;;;29014:36:0;;28959:12;29014:36;;;:25;:36;;;;;;;;:59;;;;;29072:1;29054:15;;:19;29014:59;29010:1012;;;29130:5;29111:15;;29102:6;:24;;;;:::i;:::-;29101:34;;;;:::i;:::-;29094:41;;29247:15;;29204:18;;29197:4;:25;;;;:::i;:::-;29196:66;;;;:::i;:::-;29154:17;;:108;;;;;;;:::i;:::-;;;;-1:-1:-1;;29329:15:0;;29309:16;;29302:23;;:4;:23;:::i;:::-;29301:43;;;;:::i;:::-;29281:16;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;29458:15:0;;29414:19;;29407:26;;:4;:26;:::i;:::-;29406:67;;;;:::i;:::-;29363:18;;:110;;;;;;;:::i;:::-;;;;-1:-1:-1;29010:1012:0;;-1:-1:-1;29010:1012:0;;-1:-1:-1;;;;;29517:33:0;;;;;;:25;:33;;;;;;;;:55;;;;;29571:1;29554:14;;:18;29517:55;29495:527;;;29669:5;29651:14;;29642:6;:23;;;;:::i;:::-;29641:33;;;;:::i;:::-;29634:40;;29785:14;;29743:17;;29736:4;:24;;;;:::i;:::-;29735:64;;;;:::i;:::-;29693:17;;:106;;;;;;;:::i;:::-;;;;-1:-1:-1;;29865:14:0;;29846:15;;29839:22;;:4;:22;:::i;:::-;29838:41;;;;:::i;:::-;29818:16;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;29992:14:0;;29949:18;;29942:25;;:4;:25;:::i;:::-;29941:65;;;;:::i;:::-;29898:18;;:108;;;;;;;:::i;:::-;;;;-1:-1:-1;;29495:527:0;30036:14;30046:4;30036:14;;:::i;:::-;;;30065:45;30082:6;30098:4;30105;30065:16;:45::i;:::-;28944:1178;28931:1191;30134:43;30151:6;30159:9;30170:6;30134:16;:43::i;:::-;30190:13;-1:-1:-1;;;;;30190:24:0;;30223:6;30232:17;30242:6;-1:-1:-1;;;;;23709:18:0;23677:7;23709:18;;;:9;:18;;;;;;;23558:177;30232:17;30190:60;;-1:-1:-1;;;;;;30190:60:0;;;;;;;-1:-1:-1;;;;;10871:32:1;;;30190:60:0;;;10853:51:1;10920:18;;;10913:34;10826:18;;30190:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30261:13;-1:-1:-1;;;;;30261:24:0;;30294:9;30306:20;30316:9;-1:-1:-1;;;;;23709:18:0;23677:7;23709:18;;;:9;:18;;;;;;;23558:177;30306:20;30261:66;;-1:-1:-1;;;;;;30261:66:0;;;;;;;-1:-1:-1;;;;;10871:32:1;;;30261:66:0;;;10853:51:1;10920:18;;;10913:34;10826:18;;30261:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25981:4354;;;;;;;25868:4467;;;:::o;8721:120::-;7709:4;7733:7;;;8257:41;;;;-1:-1:-1;;;8257:41:0;;23563:2:1;8257:41:0;;;23545:21:1;23602:2;23582:18;;;23575:30;-1:-1:-1;;;23621:18:1;;;23614:50;23681:18;;8257:41:0;23361:344:1;8257:41:0;8790:5:::1;8780:15:::0;;-1:-1:-1;;8780:15:0::1;::::0;;8811:22:::1;4036:10:::0;8820:12:::1;8811:22;::::0;-1:-1:-1;;;;;2027:32:1;;;2009:51;;1997:2;1982:18;8811:22:0::1;;;;;;;8721:120::o:0;6421:191::-;6495:16;6514:6;;-1:-1:-1;;;;;6531:17:0;;;6514:6;6531:17;;;-1:-1:-1;;;;;;6531:17:0;;;;;6564:40;;6514:6;;;;;;;6531:17;;6514:6;;6564:40;;;6484:128;6421:191;:::o;8462:118::-;7709:4;7733:7;;;7987:9;7979:38;;;;-1:-1:-1;;;7979:38:0;;23912:2:1;7979:38:0;;;23894:21:1;23951:2;23931:18;;;23924:30;-1:-1:-1;;;23970:18:1;;;23963:46;24026:18;;7979:38:0;23710:340:1;7979:38:0;8522:7:::1;:14:::0;;-1:-1:-1;;8522:14:0::1;8532:4;8522:14;::::0;;8552:20:::1;8559:12;4036:10:::0;;3956:98;38183:441;-1:-1:-1;;;;;38288:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;38266:152;;;;-1:-1:-1;;;38266:152:0;;24257:2:1;38266:152:0;;;24239:21:1;24296:2;24276:18;;;24269:30;24335:34;24315:18;;;24308:62;24406:32;24386:18;;;24379:60;24456:19;;38266:152:0;24055:426:1;38266:152:0;-1:-1:-1;;;;;38429:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;38429:39:0;;;;;;;;;;;;38479:82;;38505:44;;-1:-1:-1;;;38505:44:0;;-1:-1:-1;;;;;10576:32:1;;;38505:44:0;;;10558:51:1;38544:4:0;10625:18:1;;;10618:50;38505:13:0;:32;;;;10531:18:1;;38505:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38479:82;38576:40;;;;;;-1:-1:-1;;;;;38576:40:0;;;;;;;;38183:441;;:::o;33114:2284::-;33201:1;33191:6;:11;33187:50;;33114:2284;;:::o;33187:50::-;33298:14;;33249:26;;33298:14;;;-1:-1:-1;;;;;33298:14:0;33290:37;33286:108;;-1:-1:-1;33365:17:0;;33286:108;33406:25;33476:1;33446:13;-1:-1:-1;;;;;33446:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:31;33442:100;;;-1:-1:-1;33514:16:0;;33442:100;33554:27;33605:1;33584:18;;:22;;;;:::i;:::-;33554:52;;33617:26;33667:19;33646:18;;:40;;;;:::i;:::-;33617:69;-1:-1:-1;33697:23:0;33790:19;33723:51;33756:18;33723:17;:51;:::i;:::-;:86;;;;:::i;:::-;33697:112;-1:-1:-1;33846:21:0;33878:36;33697:112;33878:19;:36::i;:::-;33925:21;34004:6;33950:37;33974:13;33950:21;:37;:::i;:::-;33949:61;;;;:::i;:::-;34043:1;34023:17;:21;;;34055:16;:20;;;34086:18;:22;;;33925:85;;-1:-1:-1;34198:15:0;34147:34;34163:18;33925:85;34147:34;:::i;:::-;34146:67;;;;:::i;:::-;34121:92;-1:-1:-1;34224:21:0;34299:15;34249:33;34265:17;34249:13;:33;:::i;:::-;34248:66;;;;:::i;:::-;34224:90;-1:-1:-1;34325:23:0;34224:90;34351:43;34380:14;34351:13;:43;:::i;:::-;:72;;;;:::i;:::-;34325:98;-1:-1:-1;34440:18:0;;34436:376;;34502:14;;34494:87;;34476:12;;34502:14;;;-1:-1:-1;;;;;34502:14:0;;34548;;34476:12;34494:87;34476:12;34494:87;34548:14;34502;34494:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34475:106;;;34600:7;34596:205;;;34633:48;;;24660:25:1;;;24716:2;24701:18;;24694:34;;;34633:48:0;;24633:18:1;34633:48:0;;;;;;;34596:205;;;34727:58;;;;;24941:2:1;24923:21;;;24980:2;24960:18;;;24953:30;25019:34;25014:2;24999:18;;24992:62;-1:-1:-1;;;25085:2:1;25070:18;;25063:38;25133:3;25118:19;;24739:404;34727:58:0;;;;;;;;34596:205;34460:352;34436:376;34824:49;34837:18;34857:15;34824:12;:49::i;:::-;34889:127;;;9375:25:1;;;9431:2;9416:18;;9409:34;;;9459:18;;;9452:34;;;34889:127:0;;9363:2:1;9348:18;34889:127:0;;;;;;;35033:17;;35029:362;;35068:12;35094:13;-1:-1:-1;;;;;35086:27:0;35139:13;35086:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35067:104;;;35190:7;35186:194;;;35223:45;;;24660:25:1;;;24716:2;24701:18;;24694:34;;;35223:45:0;;24633:18:1;35223:45:0;;;;;;;35186:194;;;35314:50;;;;;25350:2:1;25332:21;;;25369:18;;;25362:30;25428:34;25423:2;25408:18;;25401:62;25495:2;25480:18;;25148:356;35314:50:0;;;;;;;;35186:194;35052:339;35029:362;33176:2222;;;;;;;;;;33114:2284;;:::o;30343:606::-;-1:-1:-1;;;;;30481:20:0;;30473:69;;;;-1:-1:-1;;;30473:69:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30561:23:0;;30553:70;;;;-1:-1:-1;;;30553:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30658:17:0;;30634:21;30658:17;;;:9;:17;;;;;;30708:23;;;;30686:110;;;;-1:-1:-1;;;30686:110:0;;;;;;;:::i;:::-;30827:22;30843:6;30827:13;:22;:::i;:::-;-1:-1:-1;;;;;30807:17:0;;;;;;;:9;:17;;;;;;:42;;;;30860:20;;;;;;;;:30;;30884:6;;30807:17;30860:30;;30884:6;;30860:30;:::i;:::-;;;;;;;;30923:9;-1:-1:-1;;;;;30906:35:0;30915:6;-1:-1:-1;;;;;30906:35:0;;30934:6;30906:35;;;;687:25:1;;675:2;660:18;;541:177;30906:35:0;;;;;;;;30462:487;30343:606;;;:::o;32029:490::-;32117:16;;;32131:1;32117:16;;;;;;;;32093:21;;32117:16;;;;;;;;;;-1:-1:-1;32117:16:0;32093:40;;32162:4;32144;32149:1;32144:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32144:23:0;;;:7;;;;;;;;;;:23;;;;32188:15;;:22;;;-1:-1:-1;;;32188:22:0;;;;:15;;;;;:20;;:22;;;;;32144:7;;32188:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32178:4;32183:1;32178:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32178:32:0;;;:7;;;;;;;;;:32;32253:15;;32221:57;;32238:4;;32253:15;32271:6;32221:8;:57::i;:::-;32289:15;;:222;;-1:-1:-1;;;32289:222:0;;-1:-1:-1;;;;;32289:15:0;;;;:66;;:222;;32370:6;;32289:15;;32438:4;;32465;;32485:15;;32289:222;;;:::i;32527:395::-;32632:15;;32600:57;;32617:4;;-1:-1:-1;;;;;32632:15:0;32650:6;32600:8;:57::i;:::-;32668:15;;32858;;32668:246;;-1:-1:-1;;;32668:246:0;;32737:4;32668:246;;;26835:34:1;26885:18;;;26878:34;;;32668:15:0;26928:18:1;;;26921:34;;;26971:18;;;26964:34;-1:-1:-1;;;;;32858:15:0;;;27014:19:1;;;27007:44;32888:15:0;27067:19:1;;;27060:35;32668:15:0;;;:31;;32707:6;;26769:19:1;;32668:246:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;32527:395;;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:134;218:20;;247:31;218:20;247:31;:::i;:::-;150:134;;;:::o;289:247::-;348:6;401:2;389:9;380:7;376:23;372:32;369:52;;;417:1;414;407:12;369:52;456:9;443:23;475:31;500:5;475:31;:::i;:::-;525:5;289:247;-1:-1:-1;;;289:247:1:o;723:597::-;835:4;864:2;893;882:9;875:21;925:6;919:13;968:6;963:2;952:9;948:18;941:34;993:1;1003:140;1017:6;1014:1;1011:13;1003:140;;;1112:14;;;1108:23;;1102:30;1078:17;;;1097:2;1074:26;1067:66;1032:10;;1003:140;;;1161:6;1158:1;1155:13;1152:91;;;1231:1;1226:2;1217:6;1206:9;1202:22;1198:31;1191:42;1152:91;-1:-1:-1;1304:2:1;1283:15;-1:-1:-1;;1279:29:1;1264:45;;;;1311:2;1260:54;;723:597;-1:-1:-1;;;723:597:1:o;1325:315::-;1393:6;1401;1454:2;1442:9;1433:7;1429:23;1425:32;1422:52;;;1470:1;1467;1460:12;1422:52;1509:9;1496:23;1528:31;1553:5;1528:31;:::i;:::-;1578:5;1630:2;1615:18;;;;1602:32;;-1:-1:-1;;;1325:315:1:o;2071:316::-;2148:6;2156;2164;2217:2;2205:9;2196:7;2192:23;2188:32;2185:52;;;2233:1;2230;2223:12;2185:52;-1:-1:-1;;2256:23:1;;;2326:2;2311:18;;2298:32;;-1:-1:-1;2377:2:1;2362:18;;;2349:32;;2071:316;-1:-1:-1;2071:316:1:o;2392:456::-;2469:6;2477;2485;2538:2;2526:9;2517:7;2513:23;2509:32;2506:52;;;2554:1;2551;2544:12;2506:52;2593:9;2580:23;2612:31;2637:5;2612:31;:::i;:::-;2662:5;-1:-1:-1;2719:2:1;2704:18;;2691:32;2732:33;2691:32;2732:33;:::i;:::-;2392:456;;2784:7;;-1:-1:-1;;;2838:2:1;2823:18;;;;2810:32;;2392:456::o;2853:118::-;2939:5;2932:13;2925:21;2918:5;2915:32;2905:60;;2961:1;2958;2951:12;2976:382;3041:6;3049;3102:2;3090:9;3081:7;3077:23;3073:32;3070:52;;;3118:1;3115;3108:12;3070:52;3157:9;3144:23;3176:31;3201:5;3176:31;:::i;:::-;3226:5;-1:-1:-1;3283:2:1;3268:18;;3255:32;3296:30;3255:32;3296:30;:::i;:::-;3345:7;3335:17;;;2976:382;;;;;:::o;3552:241::-;3608:6;3661:2;3649:9;3640:7;3636:23;3632:32;3629:52;;;3677:1;3674;3667:12;3629:52;3716:9;3703:23;3735:28;3757:5;3735:28;:::i;4006:180::-;4065:6;4118:2;4106:9;4097:7;4093:23;4089:32;4086:52;;;4134:1;4131;4124:12;4086:52;-1:-1:-1;4157:23:1;;4006:180;-1:-1:-1;4006:180:1:o;4923:315::-;4991:6;4999;5052:2;5040:9;5031:7;5027:23;5023:32;5020:52;;;5068:1;5065;5058:12;5020:52;5104:9;5091:23;5081:33;;5164:2;5153:9;5149:18;5136:32;5177:31;5202:5;5177:31;:::i;5243:444::-;5314:6;5322;5330;5383:2;5371:9;5362:7;5358:23;5354:32;5351:52;;;5399:1;5396;5389:12;5351:52;5438:9;5425:23;5457:28;5479:5;5457:28;:::i;:::-;5504:5;-1:-1:-1;5556:2:1;5541:18;;5528:32;;-1:-1:-1;5612:2:1;5597:18;;5584:32;5625:30;5584:32;5625:30;:::i;:::-;5674:7;5664:17;;;5243:444;;;;;:::o;5692:127::-;5753:10;5748:3;5744:20;5741:1;5734:31;5784:4;5781:1;5774:15;5808:4;5805:1;5798:15;5824:1121;5908:6;5939:2;5982;5970:9;5961:7;5957:23;5953:32;5950:52;;;5998:1;5995;5988:12;5950:52;6038:9;6025:23;6067:18;6108:2;6100:6;6097:14;6094:34;;;6124:1;6121;6114:12;6094:34;6162:6;6151:9;6147:22;6137:32;;6207:7;6200:4;6196:2;6192:13;6188:27;6178:55;;6229:1;6226;6219:12;6178:55;6265:2;6252:16;6287:2;6283;6280:10;6277:36;;;6293:18;;:::i;:::-;6339:2;6336:1;6332:10;6371:2;6365:9;6434:2;6430:7;6425:2;6421;6417:11;6413:25;6405:6;6401:38;6489:6;6477:10;6474:22;6469:2;6457:10;6454:18;6451:46;6448:72;;;6500:18;;:::i;:::-;6536:2;6529:22;6586:18;;;6620:15;;;;-1:-1:-1;6662:11:1;;;6658:20;;;6690:19;;;6687:39;;;6722:1;6719;6712:12;6687:39;6746:11;;;;6766:148;6782:6;6777:3;6774:15;6766:148;;;6848:23;6867:3;6848:23;:::i;:::-;6836:36;;6799:12;;;;6892;;;;6766:148;;;6933:6;5824:1121;-1:-1:-1;;;;;;;;5824:1121:1:o;6950:388::-;7018:6;7026;7079:2;7067:9;7058:7;7054:23;7050:32;7047:52;;;7095:1;7092;7085:12;7047:52;7134:9;7121:23;7153:31;7178:5;7153:31;:::i;:::-;7203:5;-1:-1:-1;7260:2:1;7245:18;;7232:32;7273:33;7232:32;7273:33;:::i;7752:184::-;7822:6;7875:2;7863:9;7854:7;7850:23;7846:32;7843:52;;;7891:1;7888;7881:12;7843:52;-1:-1:-1;7914:16:1;;7752:184;-1:-1:-1;7752:184:1:o;7941:245::-;8008:6;8061:2;8049:9;8040:7;8036:23;8032:32;8029:52;;;8077:1;8074;8067:12;8029:52;8109:9;8103:16;8128:28;8150:5;8128:28;:::i;8191:356::-;8393:2;8375:21;;;8412:18;;;8405:30;8471:34;8466:2;8451:18;;8444:62;8538:2;8523:18;;8191:356::o;8552:127::-;8613:10;8608:3;8604:20;8601:1;8594:31;8644:4;8641:1;8634:15;8668:4;8665:1;8658:15;8684:128;8724:3;8755:1;8751:6;8748:1;8745:13;8742:39;;;8761:18;;:::i;:::-;-1:-1:-1;8797:9:1;;8684:128::o;9905:125::-;9945:4;9973:1;9970;9967:8;9964:34;;;9978:18;;:::i;:::-;-1:-1:-1;10015:9:1;;9905:125::o;12716:251::-;12786:6;12839:2;12827:9;12818:7;12814:23;12810:32;12807:52;;;12855:1;12852;12845:12;12807:52;12887:9;12881:16;12906:31;12931:5;12906:31;:::i;13683:497::-;13789:6;13797;13805;13813;13821;13874:3;13862:9;13853:7;13849:23;13845:33;13842:53;;;13891:1;13888;13881:12;13842:53;13923:9;13917:16;13942:31;13967:5;13942:31;:::i;:::-;14037:2;14022:18;;14016:25;14081:2;14066:18;;14060:25;14125:2;14110:18;;14104:25;14169:3;14154:19;;;14148:26;13992:5;;14016:25;;-1:-1:-1;14060:25:1;14104;-1:-1:-1;14148:26:1;;-1:-1:-1;13683:497:1;-1:-1:-1;;;13683:497:1:o;16949:127::-;17010:10;17005:3;17001:20;16998:1;16991:31;17041:4;17038:1;17031:15;17065:4;17062:1;17055:15;17081:175;17118:3;17162:4;17155:5;17151:16;17191:4;17182:7;17179:17;17176:43;;;17199:18;;:::i;:::-;17248:1;17235:15;;17081:175;-1:-1:-1;;17081:175:1:o;20705:400::-;20907:2;20889:21;;;20946:2;20926:18;;;20919:30;20985:34;20980:2;20965:18;;20958:62;-1:-1:-1;;;21051:2:1;21036:18;;21029:34;21095:3;21080:19;;20705:400::o;21110:398::-;21312:2;21294:21;;;21351:2;21331:18;;;21324:30;21390:34;21385:2;21370:18;;21363:62;-1:-1:-1;;;21456:2:1;21441:18;;21434:32;21498:3;21483:19;;21110:398::o;21513:168::-;21553:7;21619:1;21615;21611:6;21607:14;21604:1;21601:21;21596:1;21589:9;21582:17;21578:45;21575:71;;;21626:18;;:::i;:::-;-1:-1:-1;21666:9:1;;21513:168::o;21686:217::-;21726:1;21752;21742:132;;21796:10;21791:3;21787:20;21784:1;21777:31;21831:4;21828:1;21821:15;21859:4;21856:1;21849:15;21742:132;-1:-1:-1;21888:9:1;;21686:217::o;22660:401::-;22862:2;22844:21;;;22901:2;22881:18;;;22874:30;22940:34;22935:2;22920:18;;22913:62;-1:-1:-1;;;23006:2:1;22991:18;;22984:35;23051:3;23036:19;;22660:401::o;25509:980::-;25771:4;25819:3;25808:9;25804:19;25850:6;25839:9;25832:25;25876:2;25914:6;25909:2;25898:9;25894:18;25887:34;25957:3;25952:2;25941:9;25937:18;25930:31;25981:6;26016;26010:13;26047:6;26039;26032:22;26085:3;26074:9;26070:19;26063:26;;26124:2;26116:6;26112:15;26098:29;;26145:1;26155:195;26169:6;26166:1;26163:13;26155:195;;;26234:13;;-1:-1:-1;;;;;26230:39:1;26218:52;;26325:15;;;;26290:12;;;;26266:1;26184:9;26155:195;;;-1:-1:-1;;;;;;;26406:32:1;;;;26401:2;26386:18;;26379:60;-1:-1:-1;;;26470:3:1;26455:19;26448:35;26367:3;25509:980;-1:-1:-1;;;25509:980:1:o;27106:306::-;27194:6;27202;27210;27263:2;27251:9;27242:7;27238:23;27234:32;27231:52;;;27279:1;27276;27269:12;27231:52;27308:9;27302:16;27292:26;;27358:2;27347:9;27343:18;27337:25;27327:35;;27402:2;27391:9;27387:18;27381:25;27371:35;;27106:306;;;;;:::o

Swarm Source

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