ETH Price: $2,974.53 (-1.12%)
Gas: 2 Gwei

Token

dOOr (dOOr)
 

Overview

Max Total Supply

1,000,000,000,000 dOOr

Holders

65

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
96,061,544.253096987655685618 dOOr

Value
$0.00
0x310e0565b3d000ca4bb4c81cb548f132a35a053d
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Door

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-10
*/

// SPDX-License-Identifier: MIT
/*                                                            
                                                 
                ,----..       ,----..             
                /   /   \     /   /   \            
        ,---,  /   .     :   /   .     :           
        ,---.'| .   /   ;.  \ .   /   ;.  \  __  ,-. 
        |   | :.   ;   /  ` ;.   ;   /  ` ;,' ,'/ /| 
        |   | |;   |  ; \ ; |;   |  ; \ ; |'  | |' | 
    ,--.__| ||   :  | ; | '|   :  | ; | '|  |   ,' 
    /   ,'   |.   |  ' ' ' :.   |  ' ' ' :'  :  /   
    .   '  /  |'   ;  \; /  |'   ;  \; /  ||  | '    
    '   ; |:  | \   \  ',  /  \   \  ',  / ;  : |    
    |   | '/  '  ;   :    /    ;   :    /  |  , ;    
    |   :    :|   \   \ .'      \   \ .'    ---'     
    \   \  /      `---`         `---`               
    `----'                                         
                                                                                                     
*/


pragma solidity 0.8.13;

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

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

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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        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
    );
}

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(
            currentAllowance >= amount,
            "ERC20: transfer amount exceeds allowance"
        );
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

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

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

        return true;
    }

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

        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    function _createInitialSupply(address account, uint256 amount)
        internal
        virtual
    {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

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

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
}

contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

interface ILpPair {
    function sync() external;
}

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

    function WETH() external pure returns (address);

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        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 addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

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

interface IDexFactory {
    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);
}

contract Door is ERC20, Ownable {
    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxWallet;

    IDexRouter public dexRouter;
    address public lpPair;

    bool private swapping;
    uint256 public swapTokensAtAmount;

    address public theDoorAddress;
    address public treasuryAddress;

    uint256 public tradingActiveBlock = 0; // 0 means trading is not active
    uint256 public blockForPenaltyEnd;
    mapping(address => bool) public boughtEarly;
    address[] public earlyBuyers;
    uint256 public botsCaught;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    // Investor sell limit variables
    mapping(address => uint256) public nextInvestorSellDate;
    uint256 public timeBetweenBuys = 360 minutes; // 6 hours
    uint256 public privateSaleCooldown = 1 minutes; // 1 minutes

    // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

    uint256 public buyTotalFees;
    uint256 public buyDoorFee;
    uint256 public buyLiquidityFee;
    uint256 public buyTreasuryFee;

    uint256 private originalSellDoorFee;
    uint256 private originalSellLiquidityFee;
    uint256 private originalSellTreasuryFee;

    uint256 public sellTotalFees;
    uint256 public sellDoorFee;
    uint256 public sellLiquidityFee;
    uint256 public sellTreasuryFee;

    uint256 public tokensForTheDoor;
    uint256 public tokensForLiquidity;
    uint256 public tokensForTreasury;

    /******************/

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

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping(address => bool) public automatedMarketMakerPairs;

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event EnabledTrading();

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event UpdatedMaxBuyAmount(uint256 newAmount);

    event UpdatedMaxSellAmount(uint256 newAmount);

    event UpdatedMaxWalletAmount(uint256 newAmount);

    event UpdatedTheDoorAddress(address indexed newWallet);

    event UpdatedTreasuryAddress(address indexed newWallet);

    event MaxTransactionExclusion(address _address, bool excluded);

    event OwnerForcedSwapBack(uint256 timestamp);

    event CaughtEarlyBuyer(address sniper);

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

    event TransferForeignToken(address token, uint256 amount);

    event UpdatedPrivateMaxSell(uint256 amount);

    constructor() payable ERC20("dOOr", "dOOr") {
        address newOwner = msg.sender; // Deployer is the owner

        // initialize router
        IDexRouter _dexRouter = IDexRouter(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        dexRouter = _dexRouter;

        lpPair = IDexFactory(dexRouter.factory()).createPair(
            address(this),
            dexRouter.WETH()
        );
        _excludeFromMaxTransaction(address(lpPair), true);
        _setAutomatedMarketMakerPair(address(lpPair), true);

        uint256 totalSupply = 1 * 1e12 * 1e18; // 1 trillion

        maxBuyAmount = (totalSupply * 5) / 1000; // 0.5%
        maxSellAmount = (totalSupply * 5) / 1000; // 0.5%
        maxWallet = (totalSupply * 1) / 100; // 2%
        swapTokensAtAmount = (totalSupply * 2) / 10000; // 0.02 %

        buyDoorFee = 3;
        buyLiquidityFee = 0;
        buyTreasuryFee = 0;
        buyTotalFees = buyDoorFee + buyLiquidityFee + buyTreasuryFee;

        originalSellDoorFee = 3;
        originalSellLiquidityFee = 0;
        originalSellTreasuryFee = 0;

        sellDoorFee = 3;
        sellLiquidityFee = 0;
        sellTreasuryFee = 0;
        sellTotalFees = sellDoorFee + sellLiquidityFee + sellTreasuryFee;

        theDoorAddress = address(0xDD2fa85B86e8E113379982AE1f4e1555a611D855);
        treasuryAddress = address(0x10fc18fF7b86C9747192F90C1B26b84d2274219F);

        _excludeFromMaxTransaction(newOwner, true);
        _excludeFromMaxTransaction(address(this), true);
        _excludeFromMaxTransaction(address(0xdead), true);
        _excludeFromMaxTransaction(address(theDoorAddress), true);
        _excludeFromMaxTransaction(address(treasuryAddress), true);

        excludeFromFees(newOwner, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        excludeFromFees(address(theDoorAddress), true);
        excludeFromFees(address(treasuryAddress), true);

        _createInitialSupply(newOwner, (totalSupply * 10) / 100);
        _createInitialSupply(address(0xdead), (totalSupply * 85) / 100);
        _createInitialSupply(address(this), (totalSupply * 5) / 100);

        transferOwnership(newOwner);
    }

    receive() external payable {}

    function enableTrading(uint256 blocksForPenalty) external onlyOwner {
        require(!tradingActive, "Cannot reenable trading");
        require(
            blocksForPenalty <= 10,
            "Cannot make penalty blocks more than 10"
        );
        tradingActive = true;
        swapEnabled = true;
        tradingActiveBlock = block.number;
        blockForPenaltyEnd = tradingActiveBlock + blocksForPenalty;
        emit EnabledTrading();
    }

    function getEarlyBuyers() external view returns (address[] memory) {
        return earlyBuyers;
    }

    function removeBoughtEarly(address wallet) external onlyOwner {
        require(boughtEarly[wallet], "Wallet is already not flagged.");
        boughtEarly[wallet] = false;
    }

    function emergencyUpdateRouter(address router) external onlyOwner {
        require(!tradingActive, "Cannot update after trading is functional");
        dexRouter = IDexRouter(router);
    }

    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner {
        transferDelayEnabled = false;
    }

    function updateMaxBuyAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 1) / 10000) / 1e18,
            "Cannot set max buy amount lower than 0.01%"
        );
        require(
            newNum <= ((totalSupply() * 2) / 100) / 1e18,
            "Cannot set max buy amount higher than 2%"
        );
        maxBuyAmount = newNum * (1e18);
        emit UpdatedMaxBuyAmount(maxBuyAmount);
    }

    function updateMaxSellAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 1) / 10000) / 1e18,
            "Cannot set max sell amount lower than 0.01%"
        );
        require(
            newNum <= ((totalSupply() * 2) / 100) / 1e18,
            "Cannot set max sell amount higher than 2%"
        );
        maxSellAmount = newNum * (1e18);
        emit UpdatedMaxSellAmount(maxSellAmount);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 5) / 1000) / 1e18,
            "Cannot set max wallet amount lower than 0.5%"
        );
        require(
            newNum <= ((totalSupply() * 3) / 100) / 1e18,
            "Cannot set max wallet amount higher than 3%"
        );
        maxWallet = newNum * (1e18);
        emit UpdatedMaxWalletAmount(maxWallet);
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner {
        require(
            newAmount >= (totalSupply() * 1) / 100000,
            "Swap amount cannot be lower than 0.001% total supply."
        );
        require(
            newAmount <= (totalSupply() * 1) / 1000,
            "Swap amount cannot be higher than 0.1% total supply."
        );
        swapTokensAtAmount = newAmount;
    }

    function updateTimeBetweenBuys(uint256 timeInMinutes) external onlyOwner {
        require(timeInMinutes > 0 && timeInMinutes <= 1440);
        timeBetweenBuys = timeInMinutes * 1 minutes;
    }

    function _excludeFromMaxTransaction(address updAds, bool isExcluded)
        private
    {
        _isExcludedMaxTransactionAmount[updAds] = isExcluded;
        emit MaxTransactionExclusion(updAds, isExcluded);
    }

    function airdropToWallets(
        address[] memory wallets,
        uint256[] memory amountsInTokens
    ) external onlyOwner {
        require(
            wallets.length == amountsInTokens.length,
            "arrays must be the same length"
        );
        require(
            wallets.length < 200,
            "Can only airdrop 200 wallets per txn due to gas limits"
        ); // allows for airdrop + launch at the same exact time, reducing delays and reducing sniper input.
        for (uint256 i = 0; i < wallets.length; i++) {
            address wallet = wallets[i];
            uint256 amount = amountsInTokens[i];
            super._transfer(msg.sender, wallet, amount);
        }
    }

    function excludeFromMaxTransaction(address updAds, bool isEx)
        external
        onlyOwner
    {
        if (!isEx) {
            require(
                updAds != lpPair,
                "Cannot remove uniswap pair from max txn"
            );
        }
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        external
        onlyOwner
    {
        require(
            pair != lpPair,
            "The pair cannot be removed from automatedMarketMakerPairs"
        );
        _setAutomatedMarketMakerPair(pair, value);
        emit SetAutomatedMarketMakerPair(pair, value);
    }

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

    function updateBuyFees(
        uint256 _doorFee,
        uint256 _liquidityFee,
        uint256 _treasuryFee
    ) external onlyOwner {
        buyDoorFee = _doorFee;
        buyLiquidityFee = _liquidityFee;
        buyTreasuryFee = _treasuryFee;
        buyTotalFees = buyDoorFee + buyLiquidityFee + buyTreasuryFee;
        require(buyTotalFees <= 15, "Must keep fees at 15% or less");
    }

    function updateSellFees(
        uint256 _doorFee,
        uint256 _liquidityFee,
        uint256 _treasuryFee
    ) external onlyOwner {
        sellDoorFee = _doorFee;
        sellLiquidityFee = _liquidityFee;
        sellTreasuryFee = _treasuryFee;
        sellTotalFees = sellDoorFee + sellLiquidityFee + sellTreasuryFee;
        require(sellTotalFees <= 20, "Must keep fees at 20% or less");
    }

    function restoreTaxes() external onlyOwner {
        sellDoorFee = originalSellDoorFee;
        sellLiquidityFee = originalSellLiquidityFee;
        sellTreasuryFee = originalSellTreasuryFee;
        sellTotalFees = sellDoorFee + sellLiquidityFee + sellTreasuryFee;
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

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

        if (!tradingActive) {
            require(
                _isExcludedFromFees[from] || _isExcludedFromFees[to],
                "Trading is not active."
            );
        }

        if (!earlyBuyPenaltyInEffect() && tradingActive) {
            require(
                !boughtEarly[from] || to == owner() || to == address(0xdead),
                "Bots cannot transfer tokens in or out except to owner or dead address."
            );
        }

        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0xdead) &&
                !_isExcludedFromFees[from] &&
                !_isExcludedFromFees[to]
            ) {
                if (transferDelayEnabled) {
                    if (to != address(dexRouter) && to != address(lpPair)) {
                        require(
                            _holderLastTransferTimestamp[tx.origin] <
                                block.number - 2 &&
                                _holderLastTransferTimestamp[to] <
                                block.number - 2,
                            "_transfer:: Transfer Delay enabled.  Try again later."
                        );
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                        _holderLastTransferTimestamp[to] = block.number;
                    }
                }

                //when buy
                if (
                    automatedMarketMakerPairs[from] &&
                    !_isExcludedMaxTransactionAmount[to]
                ) {
                    require(
                        amount <= maxBuyAmount,
                        "Buy transfer amount exceeds the max buy."
                    );
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max Wallet Exceeded"
                    );
                }
                //when sell
                else if (
                    automatedMarketMakerPairs[to] &&
                    !_isExcludedMaxTransactionAmount[from]
                ) {
                    require(
                        amount <= maxSellAmount,
                        "Sell transfer amount exceeds the max sell."
                    );
                } else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max Wallet Exceeded"
                    );
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            canSwap && swapEnabled && !swapping && automatedMarketMakerPairs[to]
        ) {
            swapping = true;
            swapBack();
            swapping = false;
        }

        bool takeFee = true;
        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            // bot/sniper penalty.
            if (
                (earlyBuyPenaltyInEffect() ||
                    (amount >= maxBuyAmount - .9 ether &&
                        blockForPenaltyEnd + 8 >= block.number)) &&
                automatedMarketMakerPairs[from] &&
                !automatedMarketMakerPairs[to] &&
                !_isExcludedFromFees[to] &&
                buyTotalFees > 0
            ) {
                if (!earlyBuyPenaltyInEffect()) {
                    // reduce by 1 wei per max buy over what Uniswap will allow to revert bots as best as possible to limit erroneously blacklisted wallets. First bot will get in and be blacklisted, rest will be reverted (*cross fingers*)
                    maxBuyAmount -= 1;
                }

                if (!boughtEarly[to]) {
                    boughtEarly[to] = true;
                    botsCaught += 1;
                    earlyBuyers.push(to);
                    emit CaughtEarlyBuyer(to);
                }

                fees = (amount * 99) / 100; // tax bots with 99% :)
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensForTheDoor += (fees * buyDoorFee) / buyTotalFees;
                tokensForTreasury += (fees * buyTreasuryFee) / buyTotalFees;
            }
            // on sell
            else if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = (amount * sellTotalFees) / 100;
                tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees;
                tokensForTheDoor += (fees * sellDoorFee) / sellTotalFees;
                tokensForTreasury += (fees * sellTreasuryFee) / sellTotalFees;
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = (amount * buyTotalFees) / 100;
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensForTheDoor += (fees * buyDoorFee) / buyTotalFees;
                tokensForTreasury += (fees * buyTreasuryFee) / buyTotalFees;
            }

            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }

            amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function earlyBuyPenaltyInEffect() public view returns (bool) {
        return block.number < blockForPenaltyEnd;
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dexRouter.WETH();

        _approve(address(this), address(dexRouter), tokenAmount);

        // make the swap
        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

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

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

    function swapBack() private {
        // Treasury receives tokens!
        if (
            tokensForTreasury > 0 &&
            balanceOf(address(this)) >= tokensForTreasury
        ) {
            super._transfer(
                address(this),
                address(treasuryAddress),
                tokensForTreasury
            );
        }
        tokensForTreasury = 0;

        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity +
            tokensForTheDoor +
            tokensForTreasury;

        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        if (contractBalance > swapTokensAtAmount * 10) {
            contractBalance = swapTokensAtAmount * 10;
        }

        bool success;

        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = (contractBalance * tokensForLiquidity) /
            totalTokensToSwap /
            2;

        swapTokensForEth(contractBalance - liquidityTokens);

        uint256 ethBalance = address(this).balance;
        uint256 ethForLiquidity = ethBalance;

        uint256 ethForTheDoor = (ethBalance * tokensForTheDoor) /
            (totalTokensToSwap - (tokensForLiquidity / 2));

        ethForLiquidity -= ethForTheDoor;

        tokensForLiquidity = 0;
        tokensForTheDoor = 0;

        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            addLiquidity(liquidityTokens, ethForLiquidity);
        }

        (success, ) = address(theDoorAddress).call{
            value: address(this).balance
        }("");
    }

    function transferForeignToken(address _token, address _to)
        external
        onlyOwner
        returns (bool _sent)
    {
        require(_token != address(0), "_token address cannot be 0");
        require(
            _token != address(this) || !tradingActive,
            "Can't withdraw native tokens while trading is active"
        );
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        _sent = IERC20(_token).transfer(_to, _contractBalance);
        emit TransferForeignToken(_token, _contractBalance);
    }

    // withdraw ETH if stuck or someone sends to the address
    function withdrawStuckETH() external onlyOwner {
        bool success;
        (success, ) = address(msg.sender).call{value: address(this).balance}(
            ""
        );
    }

    function setTheDoorAddress(address _theDoorAddress) external onlyOwner {
        require(
            _theDoorAddress != address(0),
            "_theDoorAddress address cannot be 0"
        );
        theDoorAddress = payable(_theDoorAddress);
        emit UpdatedTheDoorAddress(_theDoorAddress);
    }

    function setTreasuryAddress(address _treasuryAddress) external onlyOwner {
        require(
            _treasuryAddress != address(0),
            "_treasuryAddress address cannot be 0"
        );
        treasuryAddress = payable(_treasuryAddress);
        emit UpdatedTreasuryAddress(_treasuryAddress);
    }

    // force Swap back if slippage issues.
    function forceSwapBack() external onlyOwner {
        require(
            balanceOf(address(this)) >= swapTokensAtAmount,
            "Can only swap when token amount is at or higher than restriction"
        );
        swapping = true;
        swapBack();
        swapping = false;
        emit OwnerForcedSwapBack(block.timestamp);
    }

    function removeLimits() external onlyOwner {
        limitsInEffect = false;
    }

    function restoreLimits() external onlyOwner {
        limitsInEffect = true;
    }

    function launch(uint256 blocksForPenalty) external onlyOwner {
        require(!tradingActive, "Trading is already active, cannot relaunch.");
        require(
            blocksForPenalty < 10,
            "Cannot make penalty blocks more than 10"
        );

        //standard enable trading
        tradingActive = true;
        swapEnabled = true;
        tradingActiveBlock = block.number;
        blockForPenaltyEnd = tradingActiveBlock + blocksForPenalty;
        emit EnabledTrading();

        // add the liquidity
        require(
            address(this).balance > 0,
            "Must have ETH on contract to launch"
        );
        require(
            balanceOf(address(this)) > 0,
            "Must have Tokens on contract to launch"
        );

        _approve(address(this), address(dexRouter), balanceOf(address(this)));

        dexRouter.addLiquidityETH{value: address(this).balance}(
            address(this),
            balanceOf(address(this)),
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            msg.sender,
            block.timestamp
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sniper","type":"address"}],"name":"CaughtEarlyBuyer","type":"event"},{"anonymous":false,"inputs":[],"name":"EnabledTrading","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":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"MaxTransactionExclusion","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OwnerForcedSwapBack","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":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":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","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":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferForeignToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxBuyAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxSellAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxWalletAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UpdatedPrivateMaxSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedTheDoorAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedTreasuryAddress","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"amountsInTokens","type":"uint256[]"}],"name":"airdropToWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockForPenaltyEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"botsCaught","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"boughtEarly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDoorFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IDexRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earlyBuyPenaltyInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"earlyBuyers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"emergencyUpdateRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocksForPenalty","type":"uint256"}],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getEarlyBuyers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"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":"uint256","name":"blocksForPenalty","type":"uint256"}],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nextInvestorSellDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSaleCooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"removeBoughtEarly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restoreLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restoreTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDoorFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTreasuryFee","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":"address","name":"_theDoorAddress","type":"address"}],"name":"setTheDoorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddress","type":"address"}],"name":"setTreasuryAddress","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":"view","type":"function"},{"inputs":[],"name":"theDoorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeBetweenBuys","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForTheDoor","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":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActiveBlock","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":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferForeignToken","outputs":[{"internalType":"bool","name":"_sent","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":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_doorFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_doorFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timeInMinutes","type":"uint256"}],"name":"updateTimeBetweenBuys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6000600e556013805462ffffff19166001908117909155615460601555603c6016556018805460ff1916909117905560046080818152633227a7b960e11b60a081815261010060405260c084815260e092909252919290916200006691600391906200085d565b5080516200007c9060049060208401906200085d565b505050600062000091620004fa60201b60201c565b600580546001600160a01b0319166001600160a01b0383169081179091556040519192509060009060008051602062004a37833981519152908290a350600980546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b81529051339291829163c45a0155916004808201926020929091908290030181865afa15801562000138573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200015e919062000903565b6001600160a01b031663c9c6539630600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001e7919062000903565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025b919062000903565b600a80546001600160a01b0319166001600160a01b0392909216918217905562000287906001620004fe565b600a54620002a0906001600160a01b0316600162000561565b6c0c9f2c9cd04674edea400000006103e8620002be8260056200094b565b620002ca91906200096d565b6006556103e8620002dd8260056200094b565b620002e991906200096d565b6007556064620002fb8260016200094b565b6200030791906200096d565b6008556127106200031a8260026200094b565b6200032691906200096d565b600b556003601a8190556000601b819055601c819055906200034a90829062000990565b62000356919062000990565b6019556003601d8190556000601e819055601f819055602182905560228190556023819055906200038990829062000990565b62000395919062000990565b602055600c80546001600160a01b031990811673dd2fa85b86e8e113379982ae1f4e1555a611d85517909155600d80549091167310fc18ff7b86c9747192f90c1b26b84d2274219f179055620003ed836001620004fe565b620003fa306001620004fe565b6200040961dead6001620004fe565b600c5462000422906001600160a01b03166001620004fe565b600d546200043b906001600160a01b03166001620004fe565b62000448836001620005cd565b62000455306001620005cd565b6200046461dead6001620005cd565b600c546200047d906001600160a01b03166001620005cd565b600d5462000496906001600160a01b03166001620005cd565b620004bc836064620004aa84600a6200094b565b620004b691906200096d565b6200067b565b620004d261dead6064620004aa8460556200094b565b620004e6306064620004aa8460056200094b565b620004f18362000760565b505050620009e7565b3390565b6001600160a01b038216600081815260286020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6001600160a01b0382166000908152602960205260409020805460ff1916821515179055620005918282620004fe565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b031633146200061c5760405162461bcd60e51b8152602060048201819052602482015260008051602062004a1783398151915260448201526064015b60405180910390fd5b6001600160a01b038216600081815260276020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620006d35760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000613565b8060026000828254620006e7919062000990565b90915550506001600160a01b038216600090815260208190526040812080548392906200071690849062000990565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b03163314620007ab5760405162461bcd60e51b8152602060048201819052602482015260008051602062004a17833981519152604482015260640162000613565b6001600160a01b038116620008125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000613565b6005546040516001600160a01b0380841692169060008051602062004a3783398151915290600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b8280546200086b90620009ab565b90600052602060002090601f0160209004810192826200088f5760008555620008da565b82601f10620008aa57805160ff1916838001178555620008da565b82800160010185558215620008da579182015b82811115620008da578251825591602001919060010190620008bd565b50620008e8929150620008ec565b5090565b5b80821115620008e85760008155600101620008ed565b6000602082840312156200091657600080fd5b81516001600160a01b03811681146200092e57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161562000968576200096862000935565b500290565b6000826200098b57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115620009a657620009a662000935565b500190565b600181811c90821680620009c057607f821691505b602082108103620009e157634e487b7160e01b600052602260045260246000fd5b50919050565b61402080620009f76000396000f3fe60806040526004361061042a5760003560e01c806385b12c7c11610229578063c876d0b91161012e578063e2f45605116100b6578063f11a24d31161007a578063f11a24d314610c3c578063f2fde38b14610c52578063f5648a4f14610c72578063f637434214610c87578063f8b45b0514610c9d57600080fd5b8063e2f4560514610bc5578063e884f26014610bdb578063eb1e361514610bf0578063eb472fc414610c06578063ee40166e14610c2657600080fd5b8063d85ba063116100fd578063d85ba06314610b13578063db5281be14610b29578063dc3f0d0f14610b49578063dd62ed3e14610b69578063e1eed8f014610baf57600080fd5b8063c876d0b914610a96578063cc2ffe7c14610ab0578063d0d52b5d14610ac6578063d257b34f14610af357600080fd5b8063a457c2d7116101b1578063bbc0c74211610180578063bbc0c742146109f7578063c024666814610a16578063c17b5b8c14610a36578063c18bc19514610a56578063c5f956af14610a7657600080fd5b8063a457c2d714610971578063a62068ce14610991578063a9059cbb146109a7578063b62496f5146109c757600080fd5b80638e8467f1116101f85780638e8467f1146108e557806395d89b41146109055780639a5bd2dd1461091a5780639a7a23d61461093c578063a28e86d31461095c57600080fd5b806385b12c7c1461086157806385ecfd281461088157806388e765ff146108b15780638da5cb5b146108c757600080fd5b806358a6d5311161032f5780636b2fb124116102b7578063751039fc11610286578063751039fc146107cc5780637571336a146107e15780638095d5641461080157806382aa7c68146108215780638366e79a1461084157600080fd5b80636b2fb124146107615780636ddd17131461077757806370a0823114610797578063715018a6146107b757600080fd5b80636605bfda116102fe5780636605bfda146106e9578063661f2cd11461070957806366d602ae1461071f5780636a486a8e146107355780636b0a894c1461074b57600080fd5b806358a6d531146106875780635bb988c91461069e5780635c068a8c146106be5780635eed98e2146106d457600080fd5b806323b872dd116103b257806339509351116103815780633950935114610602578063452ed4f1146106225780634a62bb651461064257806350f4a5341461065c57806351f205e41461067257600080fd5b806323b872dd146105905780632be32b61146105b0578063313ce567146105d057806339075395146105ec57600080fd5b806310d5de53116103f957806310d5de53146104eb5780631805805b1461051b57806318160ddd1461053b5780631a8145bb1461055a5780632307b4411461057057600080fd5b806306fdde03146104365780630758d92414610461578063095ea7b31461049957806310c01979146104c957600080fd5b3661043157005b600080fd5b34801561044257600080fd5b5061044b610cb3565b6040516104589190613958565b60405180910390f35b34801561046d57600080fd5b50600954610481906001600160a01b031681565b6040516001600160a01b039091168152602001610458565b3480156104a557600080fd5b506104b96104b43660046139c5565b610d45565b6040519015158152602001610458565b3480156104d557600080fd5b506104e96104e43660046139f1565b610d5b565b005b3480156104f757600080fd5b506104b9610506366004613a0a565b60286020526000908152604090205460ff1681565b34801561052757600080fd5b506104e9610536366004613a0a565b610dba565b34801561054757600080fd5b506002545b604051908152602001610458565b34801561056657600080fd5b5061054c60255481565b34801561057c57600080fd5b506104e961058b366004613b04565b610e70565b34801561059c57600080fd5b506104b96105ab366004613bc6565b610fc8565b3480156105bc57600080fd5b506104e96105cb3660046139f1565b611072565b3480156105dc57600080fd5b5060405160128152602001610458565b3480156105f857600080fd5b5061054c60245481565b34801561060e57600080fd5b506104b961061d3660046139c5565b611213565b34801561062e57600080fd5b50600a54610481906001600160a01b031681565b34801561064e57600080fd5b506013546104b99060ff1681565b34801561066857600080fd5b5061054c60155481565b34801561067e57600080fd5b506104e961124f565b34801561069357600080fd5b50600f5443106104b9565b3480156106aa57600080fd5b506104e96106b9366004613a0a565b611358565b3480156106ca57600080fd5b5061054c601c5481565b3480156106e057600080fd5b506104e961140b565b3480156106f557600080fd5b506104e9610704366004613a0a565b611467565b34801561071557600080fd5b5061054c601a5481565b34801561072b57600080fd5b5061054c60075481565b34801561074157600080fd5b5061054c60205481565b34801561075757600080fd5b5061054c60125481565b34801561076d57600080fd5b5061054c60235481565b34801561078357600080fd5b506013546104b99062010000900460ff1681565b3480156107a357600080fd5b5061054c6107b2366004613a0a565b61153d565b3480156107c357600080fd5b506104e9611558565b3480156107d857600080fd5b506104e96115cc565b3480156107ed57600080fd5b506104e96107fc366004613c15565b611602565b34801561080d57600080fd5b506104e961081c366004613c4e565b6116ca565b34801561082d57600080fd5b506104e961083c3660046139f1565b61176d565b34801561084d57600080fd5b506104b961085c366004613c7a565b611861565b34801561086d57600080fd5b506104e961087c3660046139f1565b611a9b565b34801561088d57600080fd5b506104b961089c366004613a0a565b60106020526000908152604090205460ff1681565b3480156108bd57600080fd5b5061054c60065481565b3480156108d357600080fd5b506005546001600160a01b0316610481565b3480156108f157600080fd5b50600c54610481906001600160a01b031681565b34801561091157600080fd5b5061044b611d08565b34801561092657600080fd5b5061092f611d17565b6040516104589190613cec565b34801561094857600080fd5b506104e9610957366004613c15565b611d78565b34801561096857600080fd5b506104e9611e6c565b34801561097d57600080fd5b506104b961098c3660046139c5565b611ea5565b34801561099d57600080fd5b5061054c600f5481565b3480156109b357600080fd5b506104b96109c23660046139c5565b611f3e565b3480156109d357600080fd5b506104b96109e2366004613a0a565b60296020526000908152604090205460ff1681565b348015610a0357600080fd5b506013546104b990610100900460ff1681565b348015610a2257600080fd5b506104e9610a31366004613c15565b611f4b565b348015610a4257600080fd5b506104e9610a51366004613c4e565b611fd4565b348015610a6257600080fd5b506104e9610a713660046139f1565b612077565b348015610a8257600080fd5b50600d54610481906001600160a01b031681565b348015610aa257600080fd5b506018546104b99060ff1681565b348015610abc57600080fd5b5061054c60265481565b348015610ad257600080fd5b5061054c610ae1366004613a0a565b60146020526000908152604090205481565b348015610aff57600080fd5b506104e9610b0e3660046139f1565b612216565b348015610b1f57600080fd5b5061054c60195481565b348015610b3557600080fd5b506104e9610b44366004613a0a565b612361565b348015610b5557600080fd5b506104e9610b643660046139f1565b612437565b348015610b7557600080fd5b5061054c610b84366004613c7a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610bbb57600080fd5b5061054c60215481565b348015610bd157600080fd5b5061054c600b5481565b348015610be757600080fd5b506104e96125d3565b348015610bfc57600080fd5b5061054c60165481565b348015610c1257600080fd5b50610481610c213660046139f1565b612609565b348015610c3257600080fd5b5061054c600e5481565b348015610c4857600080fd5b5061054c601b5481565b348015610c5e57600080fd5b506104e9610c6d366004613a0a565b612633565b348015610c7e57600080fd5b506104e961271e565b348015610c9357600080fd5b5061054c60225481565b348015610ca957600080fd5b5061054c60085481565b606060038054610cc290613cff565b80601f0160208091040260200160405190810160405280929190818152602001828054610cee90613cff565b8015610d3b5780601f10610d1057610100808354040283529160200191610d3b565b820191906000526020600020905b815481529060010190602001808311610d1e57829003601f168201915b5050505050905090565b6000610d5233848461278a565b50600192915050565b6005546001600160a01b03163314610d8e5760405162461bcd60e51b8152600401610d8590613d39565b60405180910390fd5b600081118015610da057506105a08111155b610da957600080fd5b610db481603c613d84565b60155550565b6005546001600160a01b03163314610de45760405162461bcd60e51b8152600401610d8590613d39565b601354610100900460ff1615610e4e5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f74207570646174652061667465722074726164696e6720697320666044820152681d5b98dd1a5bdb985b60ba1b6064820152608401610d85565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610e9a5760405162461bcd60e51b8152600401610d8590613d39565b8051825114610eeb5760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610d85565b60c8825110610f5b5760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203230302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610d85565b60005b8251811015610fc3576000838281518110610f7b57610f7b613da3565b602002602001015190506000838381518110610f9957610f99613da3565b60200260200101519050610fae3383836128ae565b50508080610fbb90613db9565b915050610f5e565b505050565b6000610fd5848484612a03565b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101561105a5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610d85565b611067853385840361278a565b506001949350505050565b6005546001600160a01b0316331461109c5760405162461bcd60e51b8152600401610d8590613d39565b670de0b6b3a76400006127106110b160025490565b6110bc906001613d84565b6110c69190613dd2565b6110d09190613dd2565b8110156111325760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152697468616e20302e30312560b01b6064820152608401610d85565b670de0b6b3a7640000606461114660025490565b611151906002613d84565b61115b9190613dd2565b6111659190613dd2565b8111156111c55760405162461bcd60e51b815260206004820152602860248201527f43616e6e6f7420736574206d61782062757920616d6f756e7420686967686572604482015267207468616e20322560c01b6064820152608401610d85565b6111d781670de0b6b3a7640000613d84565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610d5291859061124a908690613df4565b61278a565b6005546001600160a01b031633146112795760405162461bcd60e51b8152600401610d8590613d39565b600b546112853061153d565b10156112fb576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610d85565b600a805460ff60a01b1916600160a01b17905561131661351a565b600a805460ff60a01b191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb329060200160405180910390a1565b6005546001600160a01b031633146113825760405162461bcd60e51b8152600401610d8590613d39565b6001600160a01b03811660009081526010602052604090205460ff166113ea5760405162461bcd60e51b815260206004820152601e60248201527f57616c6c657420697320616c7265616479206e6f7420666c61676765642e00006044820152606401610d85565b6001600160a01b03166000908152601060205260409020805460ff19169055565b6005546001600160a01b031633146114355760405162461bcd60e51b8152600401610d8590613d39565b601d546021819055601e546022819055601f546023819055916114589190613df4565b6114629190613df4565b602055565b6005546001600160a01b031633146114915760405162461bcd60e51b8152600401610d8590613d39565b6001600160a01b0381166114f35760405162461bcd60e51b8152602060048201526024808201527f5f74726561737572794164647265737320616464726573732063616e6e6f74206044820152630626520360e41b6064820152608401610d85565b600d80546001600160a01b0319166001600160a01b0383169081179091556040517f2e1e696cfb265fa16e1170d24ef04cb2262772bde00ecf34d80bae6722487b7f90600090a250565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146115825760405162461bcd60e51b8152600401610d8590613d39565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146115f65760405162461bcd60e51b8152600401610d8590613d39565b6013805460ff19169055565b6005546001600160a01b0316331461162c5760405162461bcd60e51b8152600401610d8590613d39565b8061169f57600a546001600160a01b039081169083160361169f5760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610d85565b6001600160a01b03919091166000908152602860205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146116f45760405162461bcd60e51b8152600401610d8590613d39565b601a839055601b829055601c8190558061170e8385613df4565b6117189190613df4565b6019819055600f1015610fc35760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610d85565b6005546001600160a01b031633146117975760405162461bcd60e51b8152600401610d8590613d39565b601354610100900460ff16156117ef5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610d85565b600a8111156118105760405162461bcd60e51b8152600401610d8590613e0c565b6013805462ffff0019166201010017905543600e819055611832908290613df4565b600f556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a150565b6005546000906001600160a01b0316331461188e5760405162461bcd60e51b8152600401610d8590613d39565b6001600160a01b0383166118e45760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610d85565b6001600160a01b038316301415806119045750601354610100900460ff16155b61196d5760405162461bcd60e51b815260206004820152603460248201527f43616e2774207769746864726177206e617469766520746f6b656e73207768696044820152736c652074726164696e672069732061637469766560601b6064820152608401610d85565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa1580156119b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d89190613e53565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af1158015611a2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4f9190613e6c565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6005546001600160a01b03163314611ac55760405162461bcd60e51b8152600401610d8590613d39565b601354610100900460ff1615611b315760405162461bcd60e51b815260206004820152602b60248201527f54726164696e6720697320616c7265616479206163746976652c2063616e6e6f60448201526a3a103932b630bab731b41760a91b6064820152608401610d85565b600a8110611b515760405162461bcd60e51b8152600401610d8590613e0c565b6013805462ffff0019166201010017905543600e819055611b73908290613df4565b600f556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a160004711611bfb5760405162461bcd60e51b815260206004820152602360248201527f4d757374206861766520455448206f6e20636f6e747261637420746f206c61756044820152620dcc6d60eb1b6064820152608401610d85565b6000611c063061153d565b11611c625760405162461bcd60e51b815260206004820152602660248201527f4d757374206861766520546f6b656e73206f6e20636f6e747261637420746f206044820152650d8c2eadcc6d60d31b6064820152608401610d85565b600954611c7d9030906001600160a01b031661124a8261153d565b6009546001600160a01b031663f305d7194730611c998161153d565b60008033426040518863ffffffff1660e01b8152600401611cbf96959493929190613e89565b60606040518083038185885af1158015611cdd573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611d029190613ec4565b50505050565b606060048054610cc290613cff565b60606011805480602002602001604051908101604052809291908181526020018280548015610d3b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611d51575050505050905090565b6005546001600160a01b03163314611da25760405162461bcd60e51b8152600401610d8590613d39565b600a546001600160a01b0390811690831603611e265760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610d85565b611e3082826136cc565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314611e965760405162461bcd60e51b8152600401610d8590613d39565b6013805460ff19166001179055565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611f275760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d85565b611f34338585840361278a565b5060019392505050565b6000610d52338484612a03565b6005546001600160a01b03163314611f755760405162461bcd60e51b8152600401610d8590613d39565b6001600160a01b038216600081815260276020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314611ffe5760405162461bcd60e51b8152600401610d8590613d39565b602183905560228290556023819055806120188385613df4565b6120229190613df4565b602081905560141015610fc35760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c6573730000006044820152606401610d85565b6005546001600160a01b031633146120a15760405162461bcd60e51b8152600401610d8590613d39565b670de0b6b3a76400006103e86120b660025490565b6120c1906005613d84565b6120cb9190613dd2565b6120d59190613dd2565b8110156121395760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e352560a01b6064820152608401610d85565b670de0b6b3a7640000606461214d60025490565b612158906003613d84565b6121629190613dd2565b61216c9190613dd2565b8111156121cf5760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e742068696760448201526a686572207468616e20332560a81b6064820152608401610d85565b6121e181670de0b6b3a7640000613d84565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc90602001611208565b6005546001600160a01b031633146122405760405162461bcd60e51b8152600401610d8590613d39565b620186a061224d60025490565b612258906001613d84565b6122629190613dd2565b8110156122cf5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610d85565b6103e86122db60025490565b6122e6906001613d84565b6122f09190613dd2565b81111561235c5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610d85565b600b55565b6005546001600160a01b0316331461238b5760405162461bcd60e51b8152600401610d8590613d39565b6001600160a01b0381166123ed5760405162461bcd60e51b815260206004820152602360248201527f5f746865446f6f724164647265737320616464726573732063616e6e6f74206260448201526206520360ec1b6064820152608401610d85565b600c80546001600160a01b0319166001600160a01b0383169081179091556040517f790b0e99d4e810284a2debeabeb9a3fe7d9b0310dbcf106765239798ceeab9c390600090a250565b6005546001600160a01b031633146124615760405162461bcd60e51b8152600401610d8590613d39565b670de0b6b3a764000061271061247660025490565b612481906001613d84565b61248b9190613dd2565b6124959190613dd2565b8110156124f85760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f77657260448201526a207468616e20302e30312560a81b6064820152608401610d85565b670de0b6b3a7640000606461250c60025490565b612517906002613d84565b6125219190613dd2565b61252b9190613dd2565b81111561258c5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e7420686967686560448201526872207468616e20322560b81b6064820152608401610d85565b61259e81670de0b6b3a7640000613d84565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e90602001611208565b6005546001600160a01b031633146125fd5760405162461bcd60e51b8152600401610d8590613d39565b6018805460ff19169055565b6011818154811061261957600080fd5b6000918252602090912001546001600160a01b0316905081565b6005546001600160a01b0316331461265d5760405162461bcd60e51b8152600401610d8590613d39565b6001600160a01b0381166126c25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d85565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146127485760405162461bcd60e51b8152600401610d8590613d39565b604051600090339047908381818185875af1925050503d8060008114611d02576040519150601f19603f3d011682016040523d82523d6000602084013e611d02565b6001600160a01b0383166127ec5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d85565b6001600160a01b03821661284d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d85565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166128d45760405162461bcd60e51b8152600401610d8590613ef2565b6001600160a01b0382166128fa5760405162461bcd60e51b8152600401610d8590613f37565b6001600160a01b038316600090815260208190526040902054818110156129725760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d85565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906129a9908490613df4565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129f591815260200190565b60405180910390a350505050565b6001600160a01b038316612a295760405162461bcd60e51b8152600401610d8590613ef2565b6001600160a01b038216612a4f5760405162461bcd60e51b8152600401610d8590613f37565b60008111612a9f5760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610d85565b601354610100900460ff16612b32576001600160a01b03831660009081526027602052604090205460ff1680612aed57506001600160a01b03821660009081526027602052604090205460ff165b612b325760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610d85565b600f544310158015612b4b5750601354610100900460ff165b15612c1b576001600160a01b03831660009081526010602052604090205460ff161580612b8557506005546001600160a01b038381169116145b80612b9a57506001600160a01b03821661dead145b612c1b5760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610d85565b60135460ff1615612ff9576005546001600160a01b03848116911614801590612c5257506005546001600160a01b03838116911614155b8015612c6957506001600160a01b03821661dead14155b8015612c8e57506001600160a01b03831660009081526027602052604090205460ff16155b8015612cb357506001600160a01b03821660009081526027602052604090205460ff16155b15612ff95760185460ff1615612dcc576009546001600160a01b03838116911614801590612cef5750600a546001600160a01b03838116911614155b15612dcc57612cff600243613f7a565b32600090815260176020526040902054108015612d3d5750612d22600243613f7a565b6001600160a01b038316600090815260176020526040902054105b612da75760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610d85565b3260009081526017602052604080822043908190556001600160a01b03851683529120555b6001600160a01b03831660009081526029602052604090205460ff168015612e0d57506001600160a01b03821660009081526028602052604090205460ff16155b15612ed457600654811115612e755760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610d85565b600854612e818361153d565b612e8b9083613df4565b1115612ecf5760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b6044820152606401610d85565b612ff9565b6001600160a01b03821660009081526029602052604090205460ff168015612f1557506001600160a01b03831660009081526028602052604090205460ff16155b15612f7f57600754811115612ecf5760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610d85565b6001600160a01b03821660009081526028602052604090205460ff16612ff957600854612fab8361153d565b612fb59083613df4565b1115612ff95760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b6044820152606401610d85565b60006130043061153d565b600b5490915081108015908190613023575060135462010000900460ff165b80156130395750600a54600160a01b900460ff16155b801561305d57506001600160a01b03841660009081526029602052604090205460ff165b1561308b57600a805460ff60a01b1916600160a01b17905561307d61351a565b600a805460ff60a01b191690555b6001600160a01b03851660009081526027602052604090205460019060ff16806130cd57506001600160a01b03851660009081526027602052604090205460ff165b156130d6575060005b6000811561350657600f5443108061311c5750670c7d713b49da00006006546130ff9190613f7a565b851015801561311c575043600f5460086131199190613df4565b10155b801561314057506001600160a01b03871660009081526029602052604090205460ff165b801561316557506001600160a01b03861660009081526029602052604090205460ff16155b801561318a57506001600160a01b03861660009081526027602052604090205460ff16155b801561319857506000601954115b1561334f57600f5443106131bf576001600660008282546131b99190613f7a565b90915550505b6001600160a01b03861660009081526010602052604090205460ff1661329f576001600160a01b0386166000908152601060205260408120805460ff191660019081179091556012805491929091613218908490613df4565b9091555050601180546001810182556000919091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680180546001600160a01b0319166001600160a01b0388169081179091556040519081527f55678e47d0a699d3ab99b0184c4ff14f2246ba80522deb921aa0c8823578c44a9060200160405180910390a15b60646132ac866063613d84565b6132b69190613dd2565b9050601954601b54826132c99190613d84565b6132d39190613dd2565b602560008282546132e49190613df4565b9091555050601954601a546132f99083613d84565b6133039190613dd2565b602460008282546133149190613df4565b9091555050601954601c546133299083613d84565b6133339190613dd2565b602660008282546133449190613df4565b909155506134e89050565b6001600160a01b03861660009081526029602052604090205460ff16801561337957506000602054115b1561340b5760646020548661338e9190613d84565b6133989190613dd2565b9050602054602254826133ab9190613d84565b6133b59190613dd2565b602560008282546133c69190613df4565b90915550506020546021546133db9083613d84565b6133e59190613dd2565b602460008282546133f69190613df4565b90915550506020546023546133299083613d84565b6001600160a01b03871660009081526029602052604090205460ff16801561343557506000601954115b156134e85760646019548661344a9190613d84565b6134549190613dd2565b9050601954601b54826134679190613d84565b6134719190613dd2565b602560008282546134829190613df4565b9091555050601954601a546134979083613d84565b6134a19190613dd2565b602460008282546134b29190613df4565b9091555050601954601c546134c79083613d84565b6134d19190613dd2565b602660008282546134e29190613df4565b90915550505b80156134f9576134f98730836128ae565b6135038186613f7a565b94505b6135118787876128ae565b50505050505050565b600060265411801561353657506026546135333061153d565b10155b1561355857600d546026546135589130916001600160a01b03909116906128ae565b600060268190556135683061153d565b9050600060265460245460255461357f9190613df4565b6135899190613df4565b9050811580613596575080155b1561359f575050565b600b546135ad90600a613d84565b8211156135c557600b546135c290600a613d84565b91505b600080600283602554866135d99190613d84565b6135e39190613dd2565b6135ed9190613dd2565b90506136016135fc8286613f7a565b6136fa565b6025544790819060009061361790600290613dd2565b6136219087613f7a565b60245461362e9085613d84565b6136389190613dd2565b90506136448183613f7a565b600060258190556024559150831580159061365f5750600082115b1561366e5761366e8483613854565b600c546040516001600160a01b03909116904790600081818185875af1925050503d80600081146136bb576040519150601f19603f3d011682016040523d82523d6000602084013e6136c0565b606091505b50505050505050505050565b6001600160a01b0382166000908152602960205260409020805460ff1916821515179055611e3082826138f5565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061372f5761372f613da3565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613788573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ac9190613f91565b816001815181106137bf576137bf613da3565b6001600160a01b0392831660209182029290920101526009546137e5913091168461278a565b60095460405163791ac94760e01b81526001600160a01b039091169063791ac9479061381e908590600090869030904290600401613fae565b600060405180830381600087803b15801561383857600080fd5b505af115801561384c573d6000803e3d6000fd5b505050505050565b60095461386c9030906001600160a01b03168461278a565b60095460405163f305d71960e01b81526001600160a01b039091169063f305d7199083906138ab9030908790600090819061dead904290600401613e89565b60606040518083038185885af11580156138c9573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906138ee9190613ec4565b5050505050565b6001600160a01b038216600081815260286020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b600060208083528351808285015260005b8181101561398557858101830151858201604001528201613969565b81811115613997576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146139c257600080fd5b50565b600080604083850312156139d857600080fd5b82356139e3816139ad565b946020939093013593505050565b600060208284031215613a0357600080fd5b5035919050565b600060208284031215613a1c57600080fd5b8135613a27816139ad565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613a6d57613a6d613a2e565b604052919050565b600067ffffffffffffffff821115613a8f57613a8f613a2e565b5060051b60200190565b600082601f830112613aaa57600080fd5b81356020613abf613aba83613a75565b613a44565b82815260059290921b84018101918181019086841115613ade57600080fd5b8286015b84811015613af95780358352918301918301613ae2565b509695505050505050565b60008060408385031215613b1757600080fd5b823567ffffffffffffffff80821115613b2f57600080fd5b818501915085601f830112613b4357600080fd5b81356020613b53613aba83613a75565b82815260059290921b84018101918181019089841115613b7257600080fd5b948201945b83861015613b99578535613b8a816139ad565b82529482019490820190613b77565b96505086013592505080821115613baf57600080fd5b50613bbc85828601613a99565b9150509250929050565b600080600060608486031215613bdb57600080fd5b8335613be6816139ad565b92506020840135613bf6816139ad565b929592945050506040919091013590565b80151581146139c257600080fd5b60008060408385031215613c2857600080fd5b8235613c33816139ad565b91506020830135613c4381613c07565b809150509250929050565b600080600060608486031215613c6357600080fd5b505081359360208301359350604090920135919050565b60008060408385031215613c8d57600080fd5b8235613c98816139ad565b91506020830135613c43816139ad565b600081518084526020808501945080840160005b83811015613ce15781516001600160a01b031687529582019590820190600101613cbc565b509495945050505050565b602081526000613a276020830184613ca8565b600181811c90821680613d1357607f821691505b602082108103613d3357634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613d9e57613d9e613d6e565b500290565b634e487b7160e01b600052603260045260246000fd5b600060018201613dcb57613dcb613d6e565b5060010190565b600082613def57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115613e0757613e07613d6e565b500190565b60208082526027908201527f43616e6e6f74206d616b652070656e616c747920626c6f636b73206d6f72652060408201526607468616e2031360cc1b606082015260800190565b600060208284031215613e6557600080fd5b5051919050565b600060208284031215613e7e57600080fd5b8151613a2781613c07565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600080600060608486031215613ed957600080fd5b8351925060208401519150604084015190509250925092565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600082821015613f8c57613f8c613d6e565b500390565b600060208284031215613fa357600080fd5b8151613a27816139ad565b85815284602082015260a060408201526000613fcd60a0830186613ca8565b6001600160a01b039490941660608301525060800152939250505056fea2646970667358221220fb32bbd027075afa6c9a05a44bbd6be64d6c9a4c09b092b2c52285cc2300a78d64736f6c634300080d00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0

Deployed Bytecode

0x60806040526004361061042a5760003560e01c806385b12c7c11610229578063c876d0b91161012e578063e2f45605116100b6578063f11a24d31161007a578063f11a24d314610c3c578063f2fde38b14610c52578063f5648a4f14610c72578063f637434214610c87578063f8b45b0514610c9d57600080fd5b8063e2f4560514610bc5578063e884f26014610bdb578063eb1e361514610bf0578063eb472fc414610c06578063ee40166e14610c2657600080fd5b8063d85ba063116100fd578063d85ba06314610b13578063db5281be14610b29578063dc3f0d0f14610b49578063dd62ed3e14610b69578063e1eed8f014610baf57600080fd5b8063c876d0b914610a96578063cc2ffe7c14610ab0578063d0d52b5d14610ac6578063d257b34f14610af357600080fd5b8063a457c2d7116101b1578063bbc0c74211610180578063bbc0c742146109f7578063c024666814610a16578063c17b5b8c14610a36578063c18bc19514610a56578063c5f956af14610a7657600080fd5b8063a457c2d714610971578063a62068ce14610991578063a9059cbb146109a7578063b62496f5146109c757600080fd5b80638e8467f1116101f85780638e8467f1146108e557806395d89b41146109055780639a5bd2dd1461091a5780639a7a23d61461093c578063a28e86d31461095c57600080fd5b806385b12c7c1461086157806385ecfd281461088157806388e765ff146108b15780638da5cb5b146108c757600080fd5b806358a6d5311161032f5780636b2fb124116102b7578063751039fc11610286578063751039fc146107cc5780637571336a146107e15780638095d5641461080157806382aa7c68146108215780638366e79a1461084157600080fd5b80636b2fb124146107615780636ddd17131461077757806370a0823114610797578063715018a6146107b757600080fd5b80636605bfda116102fe5780636605bfda146106e9578063661f2cd11461070957806366d602ae1461071f5780636a486a8e146107355780636b0a894c1461074b57600080fd5b806358a6d531146106875780635bb988c91461069e5780635c068a8c146106be5780635eed98e2146106d457600080fd5b806323b872dd116103b257806339509351116103815780633950935114610602578063452ed4f1146106225780634a62bb651461064257806350f4a5341461065c57806351f205e41461067257600080fd5b806323b872dd146105905780632be32b61146105b0578063313ce567146105d057806339075395146105ec57600080fd5b806310d5de53116103f957806310d5de53146104eb5780631805805b1461051b57806318160ddd1461053b5780631a8145bb1461055a5780632307b4411461057057600080fd5b806306fdde03146104365780630758d92414610461578063095ea7b31461049957806310c01979146104c957600080fd5b3661043157005b600080fd5b34801561044257600080fd5b5061044b610cb3565b6040516104589190613958565b60405180910390f35b34801561046d57600080fd5b50600954610481906001600160a01b031681565b6040516001600160a01b039091168152602001610458565b3480156104a557600080fd5b506104b96104b43660046139c5565b610d45565b6040519015158152602001610458565b3480156104d557600080fd5b506104e96104e43660046139f1565b610d5b565b005b3480156104f757600080fd5b506104b9610506366004613a0a565b60286020526000908152604090205460ff1681565b34801561052757600080fd5b506104e9610536366004613a0a565b610dba565b34801561054757600080fd5b506002545b604051908152602001610458565b34801561056657600080fd5b5061054c60255481565b34801561057c57600080fd5b506104e961058b366004613b04565b610e70565b34801561059c57600080fd5b506104b96105ab366004613bc6565b610fc8565b3480156105bc57600080fd5b506104e96105cb3660046139f1565b611072565b3480156105dc57600080fd5b5060405160128152602001610458565b3480156105f857600080fd5b5061054c60245481565b34801561060e57600080fd5b506104b961061d3660046139c5565b611213565b34801561062e57600080fd5b50600a54610481906001600160a01b031681565b34801561064e57600080fd5b506013546104b99060ff1681565b34801561066857600080fd5b5061054c60155481565b34801561067e57600080fd5b506104e961124f565b34801561069357600080fd5b50600f5443106104b9565b3480156106aa57600080fd5b506104e96106b9366004613a0a565b611358565b3480156106ca57600080fd5b5061054c601c5481565b3480156106e057600080fd5b506104e961140b565b3480156106f557600080fd5b506104e9610704366004613a0a565b611467565b34801561071557600080fd5b5061054c601a5481565b34801561072b57600080fd5b5061054c60075481565b34801561074157600080fd5b5061054c60205481565b34801561075757600080fd5b5061054c60125481565b34801561076d57600080fd5b5061054c60235481565b34801561078357600080fd5b506013546104b99062010000900460ff1681565b3480156107a357600080fd5b5061054c6107b2366004613a0a565b61153d565b3480156107c357600080fd5b506104e9611558565b3480156107d857600080fd5b506104e96115cc565b3480156107ed57600080fd5b506104e96107fc366004613c15565b611602565b34801561080d57600080fd5b506104e961081c366004613c4e565b6116ca565b34801561082d57600080fd5b506104e961083c3660046139f1565b61176d565b34801561084d57600080fd5b506104b961085c366004613c7a565b611861565b34801561086d57600080fd5b506104e961087c3660046139f1565b611a9b565b34801561088d57600080fd5b506104b961089c366004613a0a565b60106020526000908152604090205460ff1681565b3480156108bd57600080fd5b5061054c60065481565b3480156108d357600080fd5b506005546001600160a01b0316610481565b3480156108f157600080fd5b50600c54610481906001600160a01b031681565b34801561091157600080fd5b5061044b611d08565b34801561092657600080fd5b5061092f611d17565b6040516104589190613cec565b34801561094857600080fd5b506104e9610957366004613c15565b611d78565b34801561096857600080fd5b506104e9611e6c565b34801561097d57600080fd5b506104b961098c3660046139c5565b611ea5565b34801561099d57600080fd5b5061054c600f5481565b3480156109b357600080fd5b506104b96109c23660046139c5565b611f3e565b3480156109d357600080fd5b506104b96109e2366004613a0a565b60296020526000908152604090205460ff1681565b348015610a0357600080fd5b506013546104b990610100900460ff1681565b348015610a2257600080fd5b506104e9610a31366004613c15565b611f4b565b348015610a4257600080fd5b506104e9610a51366004613c4e565b611fd4565b348015610a6257600080fd5b506104e9610a713660046139f1565b612077565b348015610a8257600080fd5b50600d54610481906001600160a01b031681565b348015610aa257600080fd5b506018546104b99060ff1681565b348015610abc57600080fd5b5061054c60265481565b348015610ad257600080fd5b5061054c610ae1366004613a0a565b60146020526000908152604090205481565b348015610aff57600080fd5b506104e9610b0e3660046139f1565b612216565b348015610b1f57600080fd5b5061054c60195481565b348015610b3557600080fd5b506104e9610b44366004613a0a565b612361565b348015610b5557600080fd5b506104e9610b643660046139f1565b612437565b348015610b7557600080fd5b5061054c610b84366004613c7a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610bbb57600080fd5b5061054c60215481565b348015610bd157600080fd5b5061054c600b5481565b348015610be757600080fd5b506104e96125d3565b348015610bfc57600080fd5b5061054c60165481565b348015610c1257600080fd5b50610481610c213660046139f1565b612609565b348015610c3257600080fd5b5061054c600e5481565b348015610c4857600080fd5b5061054c601b5481565b348015610c5e57600080fd5b506104e9610c6d366004613a0a565b612633565b348015610c7e57600080fd5b506104e961271e565b348015610c9357600080fd5b5061054c60225481565b348015610ca957600080fd5b5061054c60085481565b606060038054610cc290613cff565b80601f0160208091040260200160405190810160405280929190818152602001828054610cee90613cff565b8015610d3b5780601f10610d1057610100808354040283529160200191610d3b565b820191906000526020600020905b815481529060010190602001808311610d1e57829003601f168201915b5050505050905090565b6000610d5233848461278a565b50600192915050565b6005546001600160a01b03163314610d8e5760405162461bcd60e51b8152600401610d8590613d39565b60405180910390fd5b600081118015610da057506105a08111155b610da957600080fd5b610db481603c613d84565b60155550565b6005546001600160a01b03163314610de45760405162461bcd60e51b8152600401610d8590613d39565b601354610100900460ff1615610e4e5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f74207570646174652061667465722074726164696e6720697320666044820152681d5b98dd1a5bdb985b60ba1b6064820152608401610d85565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610e9a5760405162461bcd60e51b8152600401610d8590613d39565b8051825114610eeb5760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610d85565b60c8825110610f5b5760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203230302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610d85565b60005b8251811015610fc3576000838281518110610f7b57610f7b613da3565b602002602001015190506000838381518110610f9957610f99613da3565b60200260200101519050610fae3383836128ae565b50508080610fbb90613db9565b915050610f5e565b505050565b6000610fd5848484612a03565b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101561105a5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610d85565b611067853385840361278a565b506001949350505050565b6005546001600160a01b0316331461109c5760405162461bcd60e51b8152600401610d8590613d39565b670de0b6b3a76400006127106110b160025490565b6110bc906001613d84565b6110c69190613dd2565b6110d09190613dd2565b8110156111325760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152697468616e20302e30312560b01b6064820152608401610d85565b670de0b6b3a7640000606461114660025490565b611151906002613d84565b61115b9190613dd2565b6111659190613dd2565b8111156111c55760405162461bcd60e51b815260206004820152602860248201527f43616e6e6f7420736574206d61782062757920616d6f756e7420686967686572604482015267207468616e20322560c01b6064820152608401610d85565b6111d781670de0b6b3a7640000613d84565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610d5291859061124a908690613df4565b61278a565b6005546001600160a01b031633146112795760405162461bcd60e51b8152600401610d8590613d39565b600b546112853061153d565b10156112fb576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610d85565b600a805460ff60a01b1916600160a01b17905561131661351a565b600a805460ff60a01b191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb329060200160405180910390a1565b6005546001600160a01b031633146113825760405162461bcd60e51b8152600401610d8590613d39565b6001600160a01b03811660009081526010602052604090205460ff166113ea5760405162461bcd60e51b815260206004820152601e60248201527f57616c6c657420697320616c7265616479206e6f7420666c61676765642e00006044820152606401610d85565b6001600160a01b03166000908152601060205260409020805460ff19169055565b6005546001600160a01b031633146114355760405162461bcd60e51b8152600401610d8590613d39565b601d546021819055601e546022819055601f546023819055916114589190613df4565b6114629190613df4565b602055565b6005546001600160a01b031633146114915760405162461bcd60e51b8152600401610d8590613d39565b6001600160a01b0381166114f35760405162461bcd60e51b8152602060048201526024808201527f5f74726561737572794164647265737320616464726573732063616e6e6f74206044820152630626520360e41b6064820152608401610d85565b600d80546001600160a01b0319166001600160a01b0383169081179091556040517f2e1e696cfb265fa16e1170d24ef04cb2262772bde00ecf34d80bae6722487b7f90600090a250565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146115825760405162461bcd60e51b8152600401610d8590613d39565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146115f65760405162461bcd60e51b8152600401610d8590613d39565b6013805460ff19169055565b6005546001600160a01b0316331461162c5760405162461bcd60e51b8152600401610d8590613d39565b8061169f57600a546001600160a01b039081169083160361169f5760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610d85565b6001600160a01b03919091166000908152602860205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146116f45760405162461bcd60e51b8152600401610d8590613d39565b601a839055601b829055601c8190558061170e8385613df4565b6117189190613df4565b6019819055600f1015610fc35760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610d85565b6005546001600160a01b031633146117975760405162461bcd60e51b8152600401610d8590613d39565b601354610100900460ff16156117ef5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610d85565b600a8111156118105760405162461bcd60e51b8152600401610d8590613e0c565b6013805462ffff0019166201010017905543600e819055611832908290613df4565b600f556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a150565b6005546000906001600160a01b0316331461188e5760405162461bcd60e51b8152600401610d8590613d39565b6001600160a01b0383166118e45760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610d85565b6001600160a01b038316301415806119045750601354610100900460ff16155b61196d5760405162461bcd60e51b815260206004820152603460248201527f43616e2774207769746864726177206e617469766520746f6b656e73207768696044820152736c652074726164696e672069732061637469766560601b6064820152608401610d85565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa1580156119b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d89190613e53565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af1158015611a2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4f9190613e6c565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6005546001600160a01b03163314611ac55760405162461bcd60e51b8152600401610d8590613d39565b601354610100900460ff1615611b315760405162461bcd60e51b815260206004820152602b60248201527f54726164696e6720697320616c7265616479206163746976652c2063616e6e6f60448201526a3a103932b630bab731b41760a91b6064820152608401610d85565b600a8110611b515760405162461bcd60e51b8152600401610d8590613e0c565b6013805462ffff0019166201010017905543600e819055611b73908290613df4565b600f556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a160004711611bfb5760405162461bcd60e51b815260206004820152602360248201527f4d757374206861766520455448206f6e20636f6e747261637420746f206c61756044820152620dcc6d60eb1b6064820152608401610d85565b6000611c063061153d565b11611c625760405162461bcd60e51b815260206004820152602660248201527f4d757374206861766520546f6b656e73206f6e20636f6e747261637420746f206044820152650d8c2eadcc6d60d31b6064820152608401610d85565b600954611c7d9030906001600160a01b031661124a8261153d565b6009546001600160a01b031663f305d7194730611c998161153d565b60008033426040518863ffffffff1660e01b8152600401611cbf96959493929190613e89565b60606040518083038185885af1158015611cdd573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611d029190613ec4565b50505050565b606060048054610cc290613cff565b60606011805480602002602001604051908101604052809291908181526020018280548015610d3b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611d51575050505050905090565b6005546001600160a01b03163314611da25760405162461bcd60e51b8152600401610d8590613d39565b600a546001600160a01b0390811690831603611e265760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610d85565b611e3082826136cc565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314611e965760405162461bcd60e51b8152600401610d8590613d39565b6013805460ff19166001179055565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611f275760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d85565b611f34338585840361278a565b5060019392505050565b6000610d52338484612a03565b6005546001600160a01b03163314611f755760405162461bcd60e51b8152600401610d8590613d39565b6001600160a01b038216600081815260276020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314611ffe5760405162461bcd60e51b8152600401610d8590613d39565b602183905560228290556023819055806120188385613df4565b6120229190613df4565b602081905560141015610fc35760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c6573730000006044820152606401610d85565b6005546001600160a01b031633146120a15760405162461bcd60e51b8152600401610d8590613d39565b670de0b6b3a76400006103e86120b660025490565b6120c1906005613d84565b6120cb9190613dd2565b6120d59190613dd2565b8110156121395760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e352560a01b6064820152608401610d85565b670de0b6b3a7640000606461214d60025490565b612158906003613d84565b6121629190613dd2565b61216c9190613dd2565b8111156121cf5760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e742068696760448201526a686572207468616e20332560a81b6064820152608401610d85565b6121e181670de0b6b3a7640000613d84565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc90602001611208565b6005546001600160a01b031633146122405760405162461bcd60e51b8152600401610d8590613d39565b620186a061224d60025490565b612258906001613d84565b6122629190613dd2565b8110156122cf5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610d85565b6103e86122db60025490565b6122e6906001613d84565b6122f09190613dd2565b81111561235c5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610d85565b600b55565b6005546001600160a01b0316331461238b5760405162461bcd60e51b8152600401610d8590613d39565b6001600160a01b0381166123ed5760405162461bcd60e51b815260206004820152602360248201527f5f746865446f6f724164647265737320616464726573732063616e6e6f74206260448201526206520360ec1b6064820152608401610d85565b600c80546001600160a01b0319166001600160a01b0383169081179091556040517f790b0e99d4e810284a2debeabeb9a3fe7d9b0310dbcf106765239798ceeab9c390600090a250565b6005546001600160a01b031633146124615760405162461bcd60e51b8152600401610d8590613d39565b670de0b6b3a764000061271061247660025490565b612481906001613d84565b61248b9190613dd2565b6124959190613dd2565b8110156124f85760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f77657260448201526a207468616e20302e30312560a81b6064820152608401610d85565b670de0b6b3a7640000606461250c60025490565b612517906002613d84565b6125219190613dd2565b61252b9190613dd2565b81111561258c5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e7420686967686560448201526872207468616e20322560b81b6064820152608401610d85565b61259e81670de0b6b3a7640000613d84565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e90602001611208565b6005546001600160a01b031633146125fd5760405162461bcd60e51b8152600401610d8590613d39565b6018805460ff19169055565b6011818154811061261957600080fd5b6000918252602090912001546001600160a01b0316905081565b6005546001600160a01b0316331461265d5760405162461bcd60e51b8152600401610d8590613d39565b6001600160a01b0381166126c25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d85565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146127485760405162461bcd60e51b8152600401610d8590613d39565b604051600090339047908381818185875af1925050503d8060008114611d02576040519150601f19603f3d011682016040523d82523d6000602084013e611d02565b6001600160a01b0383166127ec5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d85565b6001600160a01b03821661284d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d85565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166128d45760405162461bcd60e51b8152600401610d8590613ef2565b6001600160a01b0382166128fa5760405162461bcd60e51b8152600401610d8590613f37565b6001600160a01b038316600090815260208190526040902054818110156129725760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d85565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906129a9908490613df4565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129f591815260200190565b60405180910390a350505050565b6001600160a01b038316612a295760405162461bcd60e51b8152600401610d8590613ef2565b6001600160a01b038216612a4f5760405162461bcd60e51b8152600401610d8590613f37565b60008111612a9f5760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610d85565b601354610100900460ff16612b32576001600160a01b03831660009081526027602052604090205460ff1680612aed57506001600160a01b03821660009081526027602052604090205460ff165b612b325760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610d85565b600f544310158015612b4b5750601354610100900460ff165b15612c1b576001600160a01b03831660009081526010602052604090205460ff161580612b8557506005546001600160a01b038381169116145b80612b9a57506001600160a01b03821661dead145b612c1b5760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610d85565b60135460ff1615612ff9576005546001600160a01b03848116911614801590612c5257506005546001600160a01b03838116911614155b8015612c6957506001600160a01b03821661dead14155b8015612c8e57506001600160a01b03831660009081526027602052604090205460ff16155b8015612cb357506001600160a01b03821660009081526027602052604090205460ff16155b15612ff95760185460ff1615612dcc576009546001600160a01b03838116911614801590612cef5750600a546001600160a01b03838116911614155b15612dcc57612cff600243613f7a565b32600090815260176020526040902054108015612d3d5750612d22600243613f7a565b6001600160a01b038316600090815260176020526040902054105b612da75760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610d85565b3260009081526017602052604080822043908190556001600160a01b03851683529120555b6001600160a01b03831660009081526029602052604090205460ff168015612e0d57506001600160a01b03821660009081526028602052604090205460ff16155b15612ed457600654811115612e755760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610d85565b600854612e818361153d565b612e8b9083613df4565b1115612ecf5760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b6044820152606401610d85565b612ff9565b6001600160a01b03821660009081526029602052604090205460ff168015612f1557506001600160a01b03831660009081526028602052604090205460ff16155b15612f7f57600754811115612ecf5760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610d85565b6001600160a01b03821660009081526028602052604090205460ff16612ff957600854612fab8361153d565b612fb59083613df4565b1115612ff95760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b6044820152606401610d85565b60006130043061153d565b600b5490915081108015908190613023575060135462010000900460ff165b80156130395750600a54600160a01b900460ff16155b801561305d57506001600160a01b03841660009081526029602052604090205460ff165b1561308b57600a805460ff60a01b1916600160a01b17905561307d61351a565b600a805460ff60a01b191690555b6001600160a01b03851660009081526027602052604090205460019060ff16806130cd57506001600160a01b03851660009081526027602052604090205460ff165b156130d6575060005b6000811561350657600f5443108061311c5750670c7d713b49da00006006546130ff9190613f7a565b851015801561311c575043600f5460086131199190613df4565b10155b801561314057506001600160a01b03871660009081526029602052604090205460ff165b801561316557506001600160a01b03861660009081526029602052604090205460ff16155b801561318a57506001600160a01b03861660009081526027602052604090205460ff16155b801561319857506000601954115b1561334f57600f5443106131bf576001600660008282546131b99190613f7a565b90915550505b6001600160a01b03861660009081526010602052604090205460ff1661329f576001600160a01b0386166000908152601060205260408120805460ff191660019081179091556012805491929091613218908490613df4565b9091555050601180546001810182556000919091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680180546001600160a01b0319166001600160a01b0388169081179091556040519081527f55678e47d0a699d3ab99b0184c4ff14f2246ba80522deb921aa0c8823578c44a9060200160405180910390a15b60646132ac866063613d84565b6132b69190613dd2565b9050601954601b54826132c99190613d84565b6132d39190613dd2565b602560008282546132e49190613df4565b9091555050601954601a546132f99083613d84565b6133039190613dd2565b602460008282546133149190613df4565b9091555050601954601c546133299083613d84565b6133339190613dd2565b602660008282546133449190613df4565b909155506134e89050565b6001600160a01b03861660009081526029602052604090205460ff16801561337957506000602054115b1561340b5760646020548661338e9190613d84565b6133989190613dd2565b9050602054602254826133ab9190613d84565b6133b59190613dd2565b602560008282546133c69190613df4565b90915550506020546021546133db9083613d84565b6133e59190613dd2565b602460008282546133f69190613df4565b90915550506020546023546133299083613d84565b6001600160a01b03871660009081526029602052604090205460ff16801561343557506000601954115b156134e85760646019548661344a9190613d84565b6134549190613dd2565b9050601954601b54826134679190613d84565b6134719190613dd2565b602560008282546134829190613df4565b9091555050601954601a546134979083613d84565b6134a19190613dd2565b602460008282546134b29190613df4565b9091555050601954601c546134c79083613d84565b6134d19190613dd2565b602660008282546134e29190613df4565b90915550505b80156134f9576134f98730836128ae565b6135038186613f7a565b94505b6135118787876128ae565b50505050505050565b600060265411801561353657506026546135333061153d565b10155b1561355857600d546026546135589130916001600160a01b03909116906128ae565b600060268190556135683061153d565b9050600060265460245460255461357f9190613df4565b6135899190613df4565b9050811580613596575080155b1561359f575050565b600b546135ad90600a613d84565b8211156135c557600b546135c290600a613d84565b91505b600080600283602554866135d99190613d84565b6135e39190613dd2565b6135ed9190613dd2565b90506136016135fc8286613f7a565b6136fa565b6025544790819060009061361790600290613dd2565b6136219087613f7a565b60245461362e9085613d84565b6136389190613dd2565b90506136448183613f7a565b600060258190556024559150831580159061365f5750600082115b1561366e5761366e8483613854565b600c546040516001600160a01b03909116904790600081818185875af1925050503d80600081146136bb576040519150601f19603f3d011682016040523d82523d6000602084013e6136c0565b606091505b50505050505050505050565b6001600160a01b0382166000908152602960205260409020805460ff1916821515179055611e3082826138f5565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061372f5761372f613da3565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613788573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ac9190613f91565b816001815181106137bf576137bf613da3565b6001600160a01b0392831660209182029290920101526009546137e5913091168461278a565b60095460405163791ac94760e01b81526001600160a01b039091169063791ac9479061381e908590600090869030904290600401613fae565b600060405180830381600087803b15801561383857600080fd5b505af115801561384c573d6000803e3d6000fd5b505050505050565b60095461386c9030906001600160a01b03168461278a565b60095460405163f305d71960e01b81526001600160a01b039091169063f305d7199083906138ab9030908790600090819061dead904290600401613e89565b60606040518083038185885af11580156138c9573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906138ee9190613ec4565b5050505050565b6001600160a01b038216600081815260286020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b600060208083528351808285015260005b8181101561398557858101830151858201604001528201613969565b81811115613997576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146139c257600080fd5b50565b600080604083850312156139d857600080fd5b82356139e3816139ad565b946020939093013593505050565b600060208284031215613a0357600080fd5b5035919050565b600060208284031215613a1c57600080fd5b8135613a27816139ad565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613a6d57613a6d613a2e565b604052919050565b600067ffffffffffffffff821115613a8f57613a8f613a2e565b5060051b60200190565b600082601f830112613aaa57600080fd5b81356020613abf613aba83613a75565b613a44565b82815260059290921b84018101918181019086841115613ade57600080fd5b8286015b84811015613af95780358352918301918301613ae2565b509695505050505050565b60008060408385031215613b1757600080fd5b823567ffffffffffffffff80821115613b2f57600080fd5b818501915085601f830112613b4357600080fd5b81356020613b53613aba83613a75565b82815260059290921b84018101918181019089841115613b7257600080fd5b948201945b83861015613b99578535613b8a816139ad565b82529482019490820190613b77565b96505086013592505080821115613baf57600080fd5b50613bbc85828601613a99565b9150509250929050565b600080600060608486031215613bdb57600080fd5b8335613be6816139ad565b92506020840135613bf6816139ad565b929592945050506040919091013590565b80151581146139c257600080fd5b60008060408385031215613c2857600080fd5b8235613c33816139ad565b91506020830135613c4381613c07565b809150509250929050565b600080600060608486031215613c6357600080fd5b505081359360208301359350604090920135919050565b60008060408385031215613c8d57600080fd5b8235613c98816139ad565b91506020830135613c43816139ad565b600081518084526020808501945080840160005b83811015613ce15781516001600160a01b031687529582019590820190600101613cbc565b509495945050505050565b602081526000613a276020830184613ca8565b600181811c90821680613d1357607f821691505b602082108103613d3357634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613d9e57613d9e613d6e565b500290565b634e487b7160e01b600052603260045260246000fd5b600060018201613dcb57613dcb613d6e565b5060010190565b600082613def57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115613e0757613e07613d6e565b500190565b60208082526027908201527f43616e6e6f74206d616b652070656e616c747920626c6f636b73206d6f72652060408201526607468616e2031360cc1b606082015260800190565b600060208284031215613e6557600080fd5b5051919050565b600060208284031215613e7e57600080fd5b8151613a2781613c07565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600080600060608486031215613ed957600080fd5b8351925060208401519150604084015190509250925092565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600082821015613f8c57613f8c613d6e565b500390565b600060208284031215613fa357600080fd5b8151613a27816139ad565b85815284602082015260a060408201526000613fcd60a0830186613ca8565b6001600160a01b039490941660608301525060800152939250505056fea2646970667358221220fb32bbd027075afa6c9a05a44bbd6be64d6c9a4c09b092b2c52285cc2300a78d64736f6c634300080d0033

Deployed Bytecode Sourcemap

11274:23923:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5006:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11415:27;;;;;;;;;;-1:-1:-1;11415:27:0;;;;-1:-1:-1;;;;;11415:27:0;;;;;;-1:-1:-1;;;;;798:32:1;;;780:51;;768:2;753:18;11415:27:0;616:221:1;6061:210:0;;;;;;;;;;-1:-1:-1;6061:210:0;;;;;:::i;:::-;;:::i;:::-;;;1463:14:1;;1456:22;1438:41;;1426:2;1411:18;6061:210:0;1298:187:1;19651:197:0;;;;;;;;;;-1:-1:-1;19651:197:0;;;;;:::i;:::-;;:::i;:::-;;13118:63;;;;;;;;;;-1:-1:-1;13118:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;17393:194;;;;;;;;;;-1:-1:-1;17393:194:0;;;;;:::i;:::-;;:::i;5327:108::-;;;;;;;;;;-1:-1:-1;5415:12:0;;5327:108;;;2073:25:1;;;2061:2;2046:18;5327:108:0;1927:177:1;12897:33:0;;;;;;;;;;;;;;;;20085:719;;;;;;;;;;-1:-1:-1;20085:719:0;;;;;:::i;:::-;;:::i;6279:529::-;;;;;;;;;;-1:-1:-1;6279:529:0;;;;;:::i;:::-;;:::i;17754:455::-;;;;;;;;;;-1:-1:-1;17754:455:0;;;;;:::i;:::-;;:::i;5226:93::-;;;;;;;;;;-1:-1:-1;5226:93:0;;5309:2;5199:36:1;;5187:2;5172:18;5226:93:0;5057:184:1;12859:31:0;;;;;;;;;;;;;;;;6816:297;;;;;;;;;;-1:-1:-1;6816:297:0;;;;;:::i;:::-;;:::i;11449:21::-;;;;;;;;;;-1:-1:-1;11449:21:0;;;;-1:-1:-1;;;;;11449:21:0;;;11860:33;;;;;;;;;;-1:-1:-1;11860:33:0;;;;;;;;12080:44;;;;;;;;;;;;;;;;33491:349;;;;;;;;;;;;;:::i;29080:121::-;;;;;;;;;;-1:-1:-1;29175:18:0;;29160:12;:33;29080:121;;17204:181;;;;;;;;;;-1:-1:-1;17204:181:0;;;;;:::i;:::-;;:::i;12539:29::-;;;;;;;;;;;;;;;;22590:276;;;;;;;;;;;;;:::i;33121:318::-;;;;;;;;;;-1:-1:-1;33121:318:0;;;;;:::i;:::-;;:::i;12470:25::-;;;;;;;;;;;;;;;;11347:28;;;;;;;;;;;;;;;;12714;;;;;;;;;;;;;;;;11826:25;;;;;;;;;;;;;;;;12820:30;;;;;;;;;;;;;;;;11940:31;;;;;;;;;;-1:-1:-1;11940:31:0;;;;;;;;;;;5443:177;;;;;;;;;;-1:-1:-1;5443:177:0;;;;;:::i;:::-;;:::i;9537:150::-;;;;;;;;;;;;;:::i;33848:84::-;;;;;;;;;;;;;:::i;20812:334::-;;;;;;;;;;-1:-1:-1;20812:334:0;;;;;:::i;:::-;;:::i;21759:403::-;;;;;;;;;;-1:-1:-1;21759:403:0;;;;;:::i;:::-;;:::i;16620:464::-;;;;;;;;;;-1:-1:-1;16620:464:0;;;;;:::i;:::-;;:::i;31973:567::-;;;;;;;;;;-1:-1:-1;31973:567:0;;;;;:::i;:::-;;:::i;34032:1162::-;;;;;;;;;;-1:-1:-1;34032:1162:0;;;;;:::i;:::-;;:::i;11741:43::-;;;;;;;;;;-1:-1:-1;11741:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;11313:27;;;;;;;;;;;;;;;;9323:79;;;;;;;;;;-1:-1:-1;9388:6:0;;-1:-1:-1;;;;;9388:6:0;9323:79;;11549:29;;;;;;;;;;-1:-1:-1;11549:29:0;;;;-1:-1:-1;;;;;11549:29:0;;;5114:104;;;;;;;;;;;;;:::i;17092:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21154:353::-;;;;;;;;;;-1:-1:-1;21154:353:0;;;;;:::i;:::-;;:::i;33940:84::-;;;;;;;;;;;;;:::i;7121:482::-;;;;;;;;;;-1:-1:-1;7121:482:0;;;;;:::i;:::-;;:::i;11701:33::-;;;;;;;;;;;;;;;;5628:216;;;;;;;;;;-1:-1:-1;5628:216:0;;;;;:::i;:::-;;:::i;13339:57::-;;;;;;;;;;-1:-1:-1;13339:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;11900:33;;;;;;;;;;-1:-1:-1;11900:33:0;;;;;;;;;;;22874:182;;;;;;;;;;-1:-1:-1;22874:182:0;;;;;:::i;:::-;;:::i;22170:412::-;;;;;;;;;;-1:-1:-1;22170:412:0;;;;;:::i;:::-;;:::i;18686:459::-;;;;;;;;;;-1:-1:-1;18686:459:0;;;;;:::i;:::-;;:::i;11585:30::-;;;;;;;;;;-1:-1:-1;11585:30:0;;;;-1:-1:-1;;;;;11585:30:0;;;12388:39;;;;;;;;;;-1:-1:-1;12388:39:0;;;;;;;;12937:32;;;;;;;;;;;;;;;;12018:55;;;;;;;;;;-1:-1:-1;12018:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;19215:428;;;;;;;;;;-1:-1:-1;19215:428:0;;;;;:::i;:::-;;:::i;12436:27::-;;;;;;;;;;;;;;;;32803:310;;;;;;;;;;-1:-1:-1;32803:310:0;;;;;:::i;:::-;;:::i;18217:461::-;;;;;;;;;;-1:-1:-1;18217:461:0;;;;;:::i;:::-;;:::i;5852:201::-;;;;;;;;;;-1:-1:-1;5852:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;6018:18:0;;;5986:7;6018:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;5852:201;12749:26;;;;;;;;;;;;;;;;11507:33;;;;;;;;;;;;;;;;17648:98;;;;;;;;;;;;;:::i;12142:46::-;;;;;;;;;;;;;;;;11791:28;;;;;;;;;;-1:-1:-1;11791:28:0;;;;;:::i;:::-;;:::i;11624:37::-;;;;;;;;;;;;;;;;12502:30;;;;;;;;;;;;;;;;9695:281;;;;;;;;;;-1:-1:-1;9695:281:0;;;;;:::i;:::-;;:::i;32610:185::-;;;;;;;;;;;;;:::i;12782:31::-;;;;;;;;;;;;;;;;11382:24;;;;;;;;;;;;;;;;5006:100;5060:13;5093:5;5086:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5006:100;:::o;6061:210::-;6180:4;6202:39;1156:10;6225:7;6234:6;6202:8;:39::i;:::-;-1:-1:-1;6259:4:0;6061:210;;;;:::o;19651:197::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;;;;;;;;;19759:1:::1;19743:13;:17;:42;;;;;19781:4;19764:13;:21;;19743:42;19735:51;;;::::0;::::1;;19815:25;:13:::0;19831:9:::1;19815:25;:::i;:::-;19797:15;:43:::0;-1:-1:-1;19651:197:0:o;17393:194::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;17479:13:::1;::::0;::::1;::::0;::::1;;;17478:14;17470:68;;;::::0;-1:-1:-1;;;17470:68:0;;8663:2:1;17470:68:0::1;::::0;::::1;8645:21:1::0;8702:2;8682:18;;;8675:30;8741:34;8721:18;;;8714:62;-1:-1:-1;;;8792:18:1;;;8785:39;8841:19;;17470:68:0::1;8461:405:1::0;17470:68:0::1;17549:9;:30:::0;;-1:-1:-1;;;;;;17549:30:0::1;-1:-1:-1::0;;;;;17549:30:0;;;::::1;::::0;;;::::1;::::0;;17393:194::o;20085:719::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;20266:15:::1;:22;20248:7;:14;:40;20226:120;;;::::0;-1:-1:-1;;;20226:120:0;;9073:2:1;20226:120:0::1;::::0;::::1;9055:21:1::0;9112:2;9092:18;;;9085:30;9151:32;9131:18;;;9124:60;9201:18;;20226:120:0::1;8871:354:1::0;20226:120:0::1;20396:3;20379:7;:14;:20;20357:124;;;::::0;-1:-1:-1;;;20357:124:0;;9432:2:1;20357:124:0::1;::::0;::::1;9414:21:1::0;9471:2;9451:18;;;9444:30;9510:34;9490:18;;;9483:62;-1:-1:-1;;;9561:18:1;;;9554:52;9623:19;;20357:124:0::1;9230:418:1::0;20357:124:0::1;20595:9;20590:207;20614:7;:14;20610:1;:18;20590:207;;;20650:14;20667:7;20675:1;20667:10;;;;;;;;:::i;:::-;;;;;;;20650:27;;20692:14;20709:15;20725:1;20709:18;;;;;;;;:::i;:::-;;;;;;;20692:35;;20742:43;20758:10;20770:6;20778;20742:15;:43::i;:::-;20635:162;;20630:3;;;;;:::i;:::-;;;;20590:207;;;;20085:719:::0;;:::o;6279:529::-;6419:4;6436:36;6446:6;6454:9;6465:6;6436:9;:36::i;:::-;-1:-1:-1;;;;;6512:19:0;;6485:24;6512:19;;;:11;:19;;;;;;;;1156:10;6512:33;;;;;;;;6578:26;;;;6556:116;;;;-1:-1:-1;;;6556:116:0;;10127:2:1;6556:116:0;;;10109:21:1;10166:2;10146:18;;;10139:30;10205:34;10185:18;;;10178:62;-1:-1:-1;;;10256:18:1;;;10249:38;10304:19;;6556:116:0;9925:404:1;6556:116:0;6708:57;6717:6;1156:10;6758:6;6739:16;:25;6708:8;:57::i;:::-;-1:-1:-1;6796:4:0;;6279:529;-1:-1:-1;;;;6279:529:0:o;17754:455::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;17892:4:::1;17883:5;17862:13;5415:12:::0;;;5327:108;17862:13:::1;:17;::::0;17878:1:::1;17862:17;:::i;:::-;17861:27;;;;:::i;:::-;17860:36;;;;:::i;:::-;17850:6;:46;;17828:138;;;::::0;-1:-1:-1;;;17828:138:0;;10758:2:1;17828:138:0::1;::::0;::::1;10740:21:1::0;10797:2;10777:18;;;10770:30;10836:34;10816:18;;;10809:62;-1:-1:-1;;;10887:18:1;;;10880:40;10937:19;;17828:138:0::1;10556:406:1::0;17828:138:0::1;18039:4;18032:3;18011:13;5415:12:::0;;;5327:108;18011:13:::1;:17;::::0;18027:1:::1;18011:17;:::i;:::-;18010:25;;;;:::i;:::-;18009:34;;;;:::i;:::-;17999:6;:44;;17977:134;;;::::0;-1:-1:-1;;;17977:134:0;;11169:2:1;17977:134:0::1;::::0;::::1;11151:21:1::0;11208:2;11188:18;;;11181:30;11247:34;11227:18;;;11220:62;-1:-1:-1;;;11298:18:1;;;11291:38;11346:19;;17977:134:0::1;10967:404:1::0;17977:134:0::1;18137:15;:6:::0;18147:4:::1;18137:15;:::i;:::-;18122:12;:30:::0;;;18168:33:::1;::::0;2073:25:1;;;18168:33:0::1;::::0;2061:2:1;2046:18;18168:33:0::1;;;;;;;;17754:455:::0;:::o;6816:297::-;1156:10;6931:4;7025:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;7025:34:0;;;;;;;;;;6931:4;;6953:130;;7003:7;;7025:47;;7062:10;;7025:47;:::i;:::-;6953:8;:130::i;33491:349::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;33596:18:::1;;33568:24;33586:4;33568:9;:24::i;:::-;:46;;33546:160;;;::::0;;-1:-1:-1;;;33546:160:0;;11711:2:1;33546:160:0::1;::::0;::::1;11693:21:1::0;11730:18;;;11723:30;;;;11789:34;11769:18;;;11762:62;11860:34;11840:18;;;11833:62;11912:19;;33546:160:0::1;11509:428:1::0;33546:160:0::1;33717:8;:15:::0;;-1:-1:-1;;;;33717:15:0::1;-1:-1:-1::0;;;33717:15:0::1;::::0;;33743:10:::1;:8;:10::i;:::-;33764:8;:16:::0;;-1:-1:-1;;;;33764:16:0::1;::::0;;33796:36:::1;::::0;33816:15:::1;2073:25:1::0;;33796:36:0::1;::::0;2061:2:1;2046:18;33796:36:0::1;;;;;;;33491:349::o:0;17204:181::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17285:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;;::::1;;17277:62;;;::::0;-1:-1:-1;;;17277:62:0;;12144:2:1;17277:62:0::1;::::0;::::1;12126:21:1::0;12183:2;12163:18;;;12156:30;12222:32;12202:18;;;12195:60;12272:18;;17277:62:0::1;11942:354:1::0;17277:62:0::1;-1:-1:-1::0;;;;;17350:19:0::1;17372:5;17350:19:::0;;;:11:::1;:19;::::0;;;;:27;;-1:-1:-1;;17350:27:0::1;::::0;;17204:181::o;22590:276::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;22658:19:::1;::::0;22644:11:::1;:33:::0;;;22707:24:::1;::::0;22688:16:::1;:43:::0;;;22760:23:::1;::::0;22742:15:::1;:41:::0;;;22760:23;22810:30:::1;::::0;22707:24;22810:30:::1;:::i;:::-;:48;;;;:::i;:::-;22794:13;:64:::0;22590:276::o;33121:318::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33227:30:0;::::1;33205:116;;;::::0;-1:-1:-1;;;33205:116:0;;12503:2:1;33205:116:0::1;::::0;::::1;12485:21:1::0;12542:2;12522:18;;;12515:30;12581:34;12561:18;;;12554:62;-1:-1:-1;;;12632:18:1;;;12625:34;12676:19;;33205:116:0::1;12301:400:1::0;33205:116:0::1;33332:15;:43:::0;;-1:-1:-1;;;;;;33332:43:0::1;-1:-1:-1::0;;;;;33332:43:0;::::1;::::0;;::::1;::::0;;;33391:40:::1;::::0;::::1;::::0;-1:-1:-1;;33391:40:0::1;33121:318:::0;:::o;5443:177::-;-1:-1:-1;;;;;5594:18:0;5562:7;5594:18;;;;;;;;;;;;5443:177::o;9537:150::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;9630:6:::1;::::0;9609:40:::1;::::0;9646:1:::1;::::0;-1:-1:-1;;;;;9630:6:0::1;::::0;9609:40:::1;::::0;9646:1;;9609:40:::1;9660:6;:19:::0;;-1:-1:-1;;;;;;9660:19:0::1;::::0;;9537:150::o;33848:84::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;33902:14:::1;:22:::0;;-1:-1:-1;;33902:22:0::1;::::0;;33848:84::o;20812:334::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;20932:4:::1;20927:155;;20989:6;::::0;-1:-1:-1;;;;;20989:6:0;;::::1;20979:16:::0;;::::1;::::0;20953:117:::1;;;::::0;-1:-1:-1;;;20953:117:0;;12908:2:1;20953:117:0::1;::::0;::::1;12890:21:1::0;12947:2;12927:18;;;12920:30;12986:34;12966:18;;;12959:62;-1:-1:-1;;;13037:18:1;;;13030:37;13084:19;;20953:117:0::1;12706:403:1::0;20953:117:0::1;-1:-1:-1::0;;;;;21092:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;21092:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;20812:334::o;21759:403::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;21909:10:::1;:21:::0;;;21941:15:::1;:31:::0;;;21983:14:::1;:29:::0;;;22000:12;22038:28:::1;21959:13:::0;21922:8;22038:28:::1;:::i;:::-;:45;;;;:::i;:::-;22023:12;:60:::0;;;22118:2:::1;-1:-1:-1::0;22102:18:0::1;22094:60;;;::::0;-1:-1:-1;;;22094:60:0;;13316:2:1;22094:60:0::1;::::0;::::1;13298:21:1::0;13355:2;13335:18;;;13328:30;13394:31;13374:18;;;13367:59;13443:18;;22094:60:0::1;13114:353:1::0;16620:464:0;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;16708:13:::1;::::0;::::1;::::0;::::1;;;16707:14;16699:50;;;::::0;-1:-1:-1;;;16699:50:0;;13674:2:1;16699:50:0::1;::::0;::::1;13656:21:1::0;13713:2;13693:18;;;13686:30;13752:25;13732:18;;;13725:53;13795:18;;16699:50:0::1;13472:347:1::0;16699:50:0::1;16802:2;16782:16;:22;;16760:111;;;;-1:-1:-1::0;;;16760:111:0::1;;;;;;;:::i;:::-;16882:13;:20:::0;;-1:-1:-1;;16913:18:0;;;;;16963:12:::1;16942:18;:33:::0;;;17007:37:::1;::::0;17028:16;;17007:37:::1;:::i;:::-;16986:18;:58:::0;17060:16:::1;::::0;::::1;::::0;;;::::1;16620:464:::0;:::o;31973:567::-;9450:6;;32087:10;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32123:20:0;::::1;32115:59;;;::::0;-1:-1:-1;;;32115:59:0;;14434:2:1;32115:59:0::1;::::0;::::1;14416:21:1::0;14473:2;14453:18;;;14446:30;14512:28;14492:18;;;14485:56;14558:18;;32115:59:0::1;14232:350:1::0;32115:59:0::1;-1:-1:-1::0;;;;;32207:23:0;::::1;32225:4;32207:23;;::::0;:41:::1;;-1:-1:-1::0;32235:13:0::1;::::0;::::1;::::0;::::1;;;32234:14;32207:41;32185:143;;;::::0;-1:-1:-1;;;32185:143:0;;14789:2:1;32185:143:0::1;::::0;::::1;14771:21:1::0;14828:2;14808:18;;;14801:30;14867:34;14847:18;;;14840:62;-1:-1:-1;;;14918:18:1;;;14911:50;14978:19;;32185:143:0::1;14587:416:1::0;32185:143:0::1;32366:39;::::0;-1:-1:-1;;;32366:39:0;;32399:4:::1;32366:39;::::0;::::1;780:51:1::0;32339:24:0::1;::::0;-1:-1:-1;;;;;32366:24:0;::::1;::::0;::::1;::::0;753:18:1;;32366:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32424:46;::::0;-1:-1:-1;;;32424:46:0;;-1:-1:-1;;;;;15389:32:1;;;32424:46:0::1;::::0;::::1;15371:51:1::0;15438:18;;;15431:34;;;32339:66:0;;-1:-1:-1;32424:23:0;;::::1;::::0;::::1;::::0;15344:18:1;;32424:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32486;::::0;;-1:-1:-1;;;;;15389:32:1;;15371:51;;15453:2;15438:18;;15431:34;;;32416:54:0;;-1:-1:-1;32486:46:0::1;::::0;15344:18:1;32486:46:0::1;;;;;;;32104:436;31973:567:::0;;;;:::o;34032:1162::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;34113:13:::1;::::0;::::1;::::0;::::1;;;34112:14;34104:70;;;::::0;-1:-1:-1;;;34104:70:0;;15928:2:1;34104:70:0::1;::::0;::::1;15910:21:1::0;15967:2;15947:18;;;15940:30;16006:34;15986:18;;;15979:62;-1:-1:-1;;;16057:18:1;;;16050:41;16108:19;;34104:70:0::1;15726:407:1::0;34104:70:0::1;34226:2;34207:16;:21;34185:110;;;;-1:-1:-1::0;;;34185:110:0::1;;;;;;;:::i;:::-;34343:13;:20:::0;;-1:-1:-1;;34374:18:0;;;;;34424:12:::1;34403:18;:33:::0;;;34468:37:::1;::::0;34489:16;;34468:37:::1;:::i;:::-;34447:18;:58:::0;34521:16:::1;::::0;::::1;::::0;;;::::1;34626:1;34602:21;:25;34580:110;;;::::0;-1:-1:-1;;;34580:110:0;;16340:2:1;34580:110:0::1;::::0;::::1;16322:21:1::0;16379:2;16359:18;;;16352:30;16418:34;16398:18;;;16391:62;-1:-1:-1;;;16469:18:1;;;16462:33;16512:19;;34580:110:0::1;16138:399:1::0;34580:110:0::1;34750:1;34723:24;34741:4;34723:9;:24::i;:::-;:28;34701:116;;;::::0;-1:-1:-1;;;34701:116:0;;16744:2:1;34701:116:0::1;::::0;::::1;16726:21:1::0;16783:2;16763:18;;;16756:30;16822:34;16802:18;;;16795:62;-1:-1:-1;;;16873:18:1;;;16866:36;16919:19;;34701:116:0::1;16542:402:1::0;34701:116:0::1;34862:9;::::0;34830:69:::1;::::0;34847:4:::1;::::0;-1:-1:-1;;;;;34862:9:0::1;34874:24;34847:4:::0;34874:9:::1;:24::i;34830:69::-;34912:9;::::0;-1:-1:-1;;;;;34912:9:0::1;:25;34945:21;34990:4;35010:24;34990:4:::0;35010:9:::1;:24::i;:::-;35049:1;35092::::0;35135:10:::1;35160:15;34912:274;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;34032:1162:::0;:::o;5114:104::-;5170:13;5203:7;5196:14;;;;;:::i;17092:104::-;17141:16;17177:11;17170:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17170:18:0;;;;;;;;;;;;;;;;;;;;;;17092:104;:::o;21154:353::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;21300:6:::1;::::0;-1:-1:-1;;;;;21300:6:0;;::::1;21292:14:::0;;::::1;::::0;21270:121:::1;;;::::0;-1:-1:-1;;;21270:121:0;;18074:2:1;21270:121:0::1;::::0;::::1;18056:21:1::0;18113:2;18093:18;;;18086:30;18152:34;18132:18;;;18125:62;18223:27;18203:18;;;18196:55;18268:19;;21270:121:0::1;17872:421:1::0;21270:121:0::1;21402:41;21431:4;21437:5;21402:28;:41::i;:::-;21459:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;21459:40:0;::::1;::::0;::::1;::::0;;;::::1;21154:353:::0;;:::o;33940:84::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;33995:14:::1;:21:::0;;-1:-1:-1;;33995:21:0::1;34012:4;33995:21;::::0;;33940:84::o;7121:482::-;1156:10;7241:4;7290:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;7290:34:0;;;;;;;;;;7357:35;;;;7335:122;;;;-1:-1:-1;;;7335:122:0;;18500:2:1;7335:122:0;;;18482:21:1;18539:2;18519:18;;;18512:30;18578:34;18558:18;;;18551:62;-1:-1:-1;;;18629:18:1;;;18622:35;18674:19;;7335:122:0;18298:401:1;7335:122:0;7493:67;1156:10;7516:7;7544:15;7525:16;:34;7493:8;:67::i;:::-;-1:-1:-1;7591:4:0;;7121:482;-1:-1:-1;;;7121:482:0:o;5628:216::-;5750:4;5772:42;1156:10;5796:9;5807:6;5772:9;:42::i;22874:182::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22959:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;22959:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;23014:34;;1438:41:1;;;23014:34:0::1;::::0;1411:18:1;23014:34:0::1;;;;;;;22874:182:::0;;:::o;22170:412::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;22321:11:::1;:22:::0;;;22354:16:::1;:32:::0;;;22397:15:::1;:30:::0;;;22415:12;22454:30:::1;22373:13:::0;22335:8;22454:30:::1;:::i;:::-;:48;;;;:::i;:::-;22438:13;:64:::0;;;22538:2:::1;-1:-1:-1::0;22521:19:0::1;22513:61;;;::::0;-1:-1:-1;;;22513:61:0;;18906:2:1;22513:61:0::1;::::0;::::1;18888:21:1::0;18945:2;18925:18;;;18918:30;18984:31;18964:18;;;18957:59;19033:18;;22513:61:0::1;18704:353:1::0;18686:459:0;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;18826:4:::1;18818;18797:13;5415:12:::0;;;5327:108;18797:13:::1;:17;::::0;18813:1:::1;18797:17;:::i;:::-;18796:26;;;;:::i;:::-;18795:35;;;;:::i;:::-;18785:6;:45;;18763:139;;;::::0;-1:-1:-1;;;18763:139:0;;19264:2:1;18763:139:0::1;::::0;::::1;19246:21:1::0;19303:2;19283:18;;;19276:30;19342:34;19322:18;;;19315:62;-1:-1:-1;;;19393:18:1;;;19386:42;19445:19;;18763:139:0::1;19062:408:1::0;18763:139:0::1;18975:4;18968:3;18947:13;5415:12:::0;;;5327:108;18947:13:::1;:17;::::0;18963:1:::1;18947:17;:::i;:::-;18946:25;;;;:::i;:::-;18945:34;;;;:::i;:::-;18935:6;:44;;18913:137;;;::::0;-1:-1:-1;;;18913:137:0;;19677:2:1;18913:137:0::1;::::0;::::1;19659:21:1::0;19716:2;19696:18;;;19689:30;19755:34;19735:18;;;19728:62;-1:-1:-1;;;19806:18:1;;;19799:41;19857:19;;18913:137:0::1;19475:407:1::0;18913:137:0::1;19073:15;:6:::0;19083:4:::1;19073:15;:::i;:::-;19061:9;:27:::0;;;19104:33:::1;::::0;2073:25:1;;;19104:33:0::1;::::0;2061:2:1;2046:18;19104:33:0::1;1927:177:1::0;19215:428:0;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;19355:6:::1;19334:13;5415:12:::0;;;5327:108;19334:13:::1;:17;::::0;19350:1:::1;19334:17;:::i;:::-;19333:28;;;;:::i;:::-;19320:9;:41;;19298:144;;;::::0;-1:-1:-1;;;19298:144:0;;20089:2:1;19298:144:0::1;::::0;::::1;20071:21:1::0;20128:2;20108:18;;;20101:30;20167:34;20147:18;;;20140:62;-1:-1:-1;;;20218:18:1;;;20211:51;20279:19;;19298:144:0::1;19887:417:1::0;19298:144:0::1;19510:4;19489:13;5415:12:::0;;;5327:108;19489:13:::1;:17;::::0;19505:1:::1;19489:17;:::i;:::-;19488:26;;;;:::i;:::-;19475:9;:39;;19453:141;;;::::0;-1:-1:-1;;;19453:141:0;;20511:2:1;19453:141:0::1;::::0;::::1;20493:21:1::0;20550:2;20530:18;;;20523:30;20589:34;20569:18;;;20562:62;-1:-1:-1;;;20640:18:1;;;20633:50;20700:19;;19453:141:0::1;20309:416:1::0;19453:141:0::1;19605:18;:30:::0;19215:428::o;32803:310::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32907:29:0;::::1;32885:114;;;::::0;-1:-1:-1;;;32885:114:0;;20932:2:1;32885:114:0::1;::::0;::::1;20914:21:1::0;20971:2;20951:18;;;20944:30;21010:34;20990:18;;;20983:62;-1:-1:-1;;;21061:18:1;;;21054:33;21104:19;;32885:114:0::1;20730:399:1::0;32885:114:0::1;33010:14;:41:::0;;-1:-1:-1;;;;;;33010:41:0::1;-1:-1:-1::0;;;;;33010:41:0;::::1;::::0;;::::1;::::0;;;33067:38:::1;::::0;::::1;::::0;-1:-1:-1;;33067:38:0::1;32803:310:::0;:::o;18217:461::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;18356:4:::1;18347:5;18326:13;5415:12:::0;;;5327:108;18326:13:::1;:17;::::0;18342:1:::1;18326:17;:::i;:::-;18325:27;;;;:::i;:::-;18324:36;;;;:::i;:::-;18314:6;:46;;18292:139;;;::::0;-1:-1:-1;;;18292:139:0;;21336:2:1;18292:139:0::1;::::0;::::1;21318:21:1::0;21375:2;21355:18;;;21348:30;21414:34;21394:18;;;21387:62;-1:-1:-1;;;21465:18:1;;;21458:41;21516:19;;18292:139:0::1;21134:407:1::0;18292:139:0::1;18504:4;18497:3;18476:13;5415:12:::0;;;5327:108;18476:13:::1;:17;::::0;18492:1:::1;18476:17;:::i;:::-;18475:25;;;;:::i;:::-;18474:34;;;;:::i;:::-;18464:6;:44;;18442:135;;;::::0;-1:-1:-1;;;18442:135:0;;21748:2:1;18442:135:0::1;::::0;::::1;21730:21:1::0;21787:2;21767:18;;;21760:30;21826:34;21806:18;;;21799:62;-1:-1:-1;;;21877:18:1;;;21870:39;21926:19;;18442:135:0::1;21546:405:1::0;18442:135:0::1;18604:15;:6:::0;18614:4:::1;18604:15;:::i;:::-;18588:13;:31:::0;;;18635:35:::1;::::0;2073:25:1;;;18635:35:0::1;::::0;2061:2:1;2046:18;18635:35:0::1;1927:177:1::0;17648:98:0;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;17710:20:::1;:28:::0;;-1:-1:-1;;17710:28:0::1;::::0;;17648:98::o;11791:28::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11791:28:0;;-1:-1:-1;11791:28:0;:::o;9695:281::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9798:22:0;::::1;9776:110;;;::::0;-1:-1:-1;;;9776:110:0;;22158:2:1;9776:110:0::1;::::0;::::1;22140:21:1::0;22197:2;22177:18;;;22170:30;22236:34;22216:18;;;22209:62;-1:-1:-1;;;22287:18:1;;;22280:36;22333:19;;9776:110:0::1;21956:402:1::0;9776:110:0::1;9923:6;::::0;9902:38:::1;::::0;-1:-1:-1;;;;;9902:38:0;;::::1;::::0;9923:6:::1;::::0;9902:38:::1;::::0;9923:6:::1;::::0;9902:38:::1;9951:6;:17:::0;;-1:-1:-1;;;;;;9951:17:0::1;-1:-1:-1::0;;;;;9951:17:0;;;::::1;::::0;;;::::1;::::0;;9695:281::o;32610:185::-;9450:6;;-1:-1:-1;;;;;9450:6:0;1156:10;9450:22;9442:67;;;;-1:-1:-1;;;9442:67:0;;;;;;;:::i;:::-;32705:82:::1;::::0;32668:12:::1;::::0;32713:10:::1;::::0;32737:21:::1;::::0;32668:12;32705:82;32668:12;32705:82;32737:21;32713:10;32705:82:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8592:380:::0;-1:-1:-1;;;;;8728:19:0;;8720:68;;;;-1:-1:-1;;;8720:68:0;;22775:2:1;8720:68:0;;;22757:21:1;22814:2;22794:18;;;22787:30;22853:34;22833:18;;;22826:62;-1:-1:-1;;;22904:18:1;;;22897:34;22948:19;;8720:68:0;22573:400:1;8720:68:0;-1:-1:-1;;;;;8807:21:0;;8799:68;;;;-1:-1:-1;;;8799:68:0;;23180:2:1;8799:68:0;;;23162:21:1;23219:2;23199:18;;;23192:30;23258:34;23238:18;;;23231:62;-1:-1:-1;;;23309:18:1;;;23302:32;23351:19;;8799:68:0;22978:398:1;8799:68:0;-1:-1:-1;;;;;8880:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;8932:32;;2073:25:1;;;8932:32:0;;2046:18:1;8932:32:0;;;;;;;8592:380;;;:::o;7611:651::-;-1:-1:-1;;;;;7751:20:0;;7743:70;;;;-1:-1:-1;;;7743:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7832:23:0;;7824:71;;;;-1:-1:-1;;;7824:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7932:17:0;;7908:21;7932:17;;;;;;;;;;;7982:23;;;;7960:111;;;;-1:-1:-1;;;7960:111:0;;24393:2:1;7960:111:0;;;24375:21:1;24432:2;24412:18;;;24405:30;24471:34;24451:18;;;24444:62;-1:-1:-1;;;24522:18:1;;;24515:36;24568:19;;7960:111:0;24191:402:1;7960:111:0;-1:-1:-1;;;;;8107:17:0;;;:9;:17;;;;;;;;;;;8127:22;;;8107:42;;8171:20;;;;;;;;:30;;8143:6;;8107:9;8171:30;;8143:6;;8171:30;:::i;:::-;;;;;;;;8236:9;-1:-1:-1;;;;;8219:35:0;8228:6;-1:-1:-1;;;;;8219:35:0;;8247:6;8219:35;;;;2073:25:1;;2061:2;2046:18;;1927:177;8219:35:0;;;;;;;;7732:530;7611:651;;;:::o;23064:6008::-;-1:-1:-1;;;;;23196:18:0;;23188:68;;;;-1:-1:-1;;;23188:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23275:16:0;;23267:64;;;;-1:-1:-1;;;23267:64:0;;;;;;;:::i;:::-;23359:1;23350:6;:10;23342:52;;;;-1:-1:-1;;;23342:52:0;;24800:2:1;23342:52:0;;;24782:21:1;24839:2;24819:18;;;24812:30;24878:31;24858:18;;;24851:59;24927:18;;23342:52:0;24598:353:1;23342:52:0;23412:13;;;;;;;23407:183;;-1:-1:-1;;;;;23468:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;23497:23:0;;;;;;:19;:23;;;;;;;;23468:52;23442:136;;;;-1:-1:-1;;;23442:136:0;;25158:2:1;23442:136:0;;;25140:21:1;25197:2;25177:18;;;25170:30;-1:-1:-1;;;25216:18:1;;;25209:52;25278:18;;23442:136:0;24956:346:1;23442:136:0;29175:18;;29160:12;:33;23606:26;:43;;;;-1:-1:-1;23636:13:0;;;;;;;23606:43;23602:268;;;-1:-1:-1;;;;;23693:17:0;;;;;;:11;:17;;;;;;;;23692:18;;:35;;-1:-1:-1;9388:6:0;;-1:-1:-1;;;;;23714:13:0;;;9388:6;;23714:13;23692:35;:60;;;-1:-1:-1;;;;;;23731:21:0;;23745:6;23731:21;23692:60;23666:192;;;;-1:-1:-1;;;23666:192:0;;25509:2:1;23666:192:0;;;25491:21:1;25548:2;25528:18;;;25521:30;25587:34;25567:18;;;25560:62;25658:34;25638:18;;;25631:62;-1:-1:-1;;;25709:19:1;;;25702:37;25756:19;;23666:192:0;25307:474:1;23666:192:0;23886:14;;;;23882:2148;;;9388:6;;-1:-1:-1;;;;;23939:15:0;;;9388:6;;23939:15;;;;:49;;-1:-1:-1;9388:6:0;;-1:-1:-1;;;;;23975:13:0;;;9388:6;;23975:13;;23939:49;:91;;;;-1:-1:-1;;;;;;24009:21:0;;24023:6;24009:21;;23939:91;:138;;;;-1:-1:-1;;;;;;24052:25:0;;;;;;:19;:25;;;;;;;;24051:26;23939:138;:183;;;;-1:-1:-1;;;;;;24099:23:0;;;;;;:19;:23;;;;;;;;24098:24;23939:183;23917:2102;;;24161:20;;;;24157:692;;;24224:9;;-1:-1:-1;;;;;24210:24:0;;;24224:9;;24210:24;;;;:49;;-1:-1:-1;24252:6:0;;-1:-1:-1;;;;;24238:21:0;;;24252:6;;24238:21;;24210:49;24206:624;;;24401:16;24416:1;24401:12;:16;:::i;:::-;24355:9;24326:39;;;;:28;:39;;;;;;:91;:212;;;;-1:-1:-1;24522:16:0;24537:1;24522:12;:16;:::i;:::-;-1:-1:-1;;;;;24454:32:0;;;;;;:28;:32;;;;;;:84;24326:212;24288:363;;;;-1:-1:-1;;;24288:363:0;;26118:2:1;24288:363:0;;;26100:21:1;26157:2;26137:18;;;26130:30;26196:34;26176:18;;;26169:62;-1:-1:-1;;;26247:18:1;;;26240:51;26308:19;;24288:363:0;25916:417:1;24288:363:0;24707:9;24678:39;;;;:28;:39;;;;;;24720:12;24678:54;;;;-1:-1:-1;;;;;24759:32:0;;;;;;:47;24206:624;-1:-1:-1;;;;;24923:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;24980:35:0;;;;;;:31;:35;;;;;;;;24979:36;24923:92;24897:1107;;;25102:12;;25092:6;:22;;25058:148;;;;-1:-1:-1;;;25058:148:0;;26540:2:1;25058:148:0;;;26522:21:1;26579:2;26559:18;;;26552:30;26618:34;26598:18;;;26591:62;-1:-1:-1;;;26669:18:1;;;26662:38;26717:19;;25058:148:0;26338:404:1;25058:148:0;25289:9;;25272:13;25282:2;25272:9;:13::i;:::-;25263:22;;:6;:22;:::i;:::-;:35;;25229:140;;;;-1:-1:-1;;;25229:140:0;;26949:2:1;25229:140:0;;;26931:21:1;26988:2;26968:18;;;26961:30;-1:-1:-1;;;27007:18:1;;;27000:49;27066:18;;25229:140:0;26747:343:1;25229:140:0;24897:1107;;;-1:-1:-1;;;;;25467:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;25522:37:0;;;;;;:31;:37;;;;;;;;25521:38;25467:92;25441:563;;;25646:13;;25636:6;:23;;25602:151;;;;-1:-1:-1;;;25602:151:0;;27297:2:1;25602:151:0;;;27279:21:1;27336:2;27316:18;;;27309:30;27375:34;27355:18;;;27348:62;-1:-1:-1;;;27426:18:1;;;27419:40;27476:19;;25602:151:0;27095:406:1;25441:563:0;-1:-1:-1;;;;;25784:35:0;;;;;;:31;:35;;;;;;;;25779:225;;25904:9;;25887:13;25897:2;25887:9;:13::i;:::-;25878:22;;:6;:22;:::i;:::-;:35;;25844:140;;;;-1:-1:-1;;;25844:140:0;;26949:2:1;25844:140:0;;;26931:21:1;26988:2;26968:18;;;26961:30;-1:-1:-1;;;27007:18:1;;;27000:49;27066:18;;25844:140:0;26747:343:1;25844:140:0;26042:28;26073:24;26091:4;26073:9;:24::i;:::-;26149:18;;26042:55;;-1:-1:-1;26125:42:0;;;;;;;26198:22;;-1:-1:-1;26209:11:0;;;;;;;26198:22;:35;;;;-1:-1:-1;26225:8:0;;-1:-1:-1;;;26225:8:0;;;;26224:9;26198:35;:68;;;;-1:-1:-1;;;;;;26237:29:0;;;;;;:25;:29;;;;;;;;26198:68;26180:196;;;26293:8;:15;;-1:-1:-1;;;;26293:15:0;-1:-1:-1;;;26293:15:0;;;26323:10;:8;:10::i;:::-;26348:8;:16;;-1:-1:-1;;;;26348:16:0;;;26180:196;-1:-1:-1;;;;;26507:25:0;;26388:12;26507:25;;;:19;:25;;;;;;26403:4;;26507:25;;;:52;;-1:-1:-1;;;;;;26536:23:0;;;;;;:19;:23;;;;;;;;26507:52;26503:100;;;-1:-1:-1;26586:5:0;26503:100;26615:12;26720:7;26716:2303;;;29175:18;;29160:12;:33;26803:152;;;;26879:8;26864:12;;:23;;;;:::i;:::-;26854:6;:33;;:100;;;;;26942:12;26916:18;;26937:1;26916:22;;;;:::i;:::-;:38;;26854:100;26802:206;;;;-1:-1:-1;;;;;;26977:31:0;;;;;;:25;:31;;;;;;;;26802:206;:257;;;;-1:-1:-1;;;;;;27030:29:0;;;;;;:25;:29;;;;;;;;27029:30;26802:257;:302;;;;-1:-1:-1;;;;;;27081:23:0;;;;;;:19;:23;;;;;;;;27080:24;26802:302;:339;;;;;27140:1;27125:12;;:16;26802:339;26780:2090;;;29175:18;;29160:12;:33;27176:332;;27487:1;27471:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;27176:332:0;-1:-1:-1;;;;;27533:15:0;;;;;;:11;:15;;;;;;;;27528:216;;-1:-1:-1;;;;;27573:15:0;;;;;;:11;:15;;;;;:22;;-1:-1:-1;;27573:22:0;27591:4;27573:22;;;;;;27618:10;:15;;27591:4;;27618:10;;:15;;27591:4;;27618:15;:::i;:::-;;;;-1:-1:-1;;27656:11:0;:20;;;;;;;-1:-1:-1;27656:20:0;;;;;;;;-1:-1:-1;;;;;;27656:20:0;-1:-1:-1;;;;;27656:20:0;;;;;;;;27704;;780:51:1;;;27704:20:0;;768:2:1;753:18;27704:20:0;;;;;;;27528:216;27787:3;27772:11;:6;27781:2;27772:11;:::i;:::-;27771:19;;;;:::i;:::-;27764:26;;27882:12;;27863:15;;27856:4;:22;;;;:::i;:::-;27855:39;;;;:::i;:::-;27833:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;27955:12:0;;27941:10;;27934:17;;:4;:17;:::i;:::-;27933:34;;;;:::i;:::-;27913:16;;:54;;;;;;;:::i;:::-;;;;-1:-1:-1;;28033:12:0;;28015:14;;28008:21;;:4;:21;:::i;:::-;28007:38;;;;:::i;:::-;27986:17;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;26780:2090:0;;-1:-1:-1;26780:2090:0;;-1:-1:-1;;;;;28108:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;28157:1;28141:13;;:17;28108:50;28104:766;;;28213:3;28196:13;;28187:6;:22;;;;:::i;:::-;28186:30;;;;:::i;:::-;28179:37;;28285:13;;28265:16;;28258:4;:23;;;;:::i;:::-;28257:41;;;;:::i;:::-;28235:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;28360:13:0;;28345:11;;28338:18;;:4;:18;:::i;:::-;28337:36;;;;:::i;:::-;28317:16;;:56;;;;;;;:::i;:::-;;;;-1:-1:-1;;28440:13:0;;28421:15;;28414:22;;:4;:22;:::i;28104:766::-;-1:-1:-1;;;;;28515:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;28565:1;28550:12;;:16;28515:51;28511:359;;;28620:3;28604:12;;28595:6;:21;;;;:::i;:::-;28594:29;;;;:::i;:::-;28587:36;;28691:12;;28672:15;;28665:4;:22;;;;:::i;:::-;28664:39;;;;:::i;:::-;28642:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;28764:12:0;;28750:10;;28743:17;;:4;:17;:::i;:::-;28742:34;;;;:::i;:::-;28722:16;;:54;;;;;;;:::i;:::-;;;;-1:-1:-1;;28842:12:0;;28824:14;;28817:21;;:4;:21;:::i;:::-;28816:38;;;;:::i;:::-;28795:17;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;28511:359:0;28890:8;;28886:91;;28919:42;28935:4;28949;28956;28919:15;:42::i;:::-;28993:14;29003:4;28993:14;;:::i;:::-;;;26716:2303;29031:33;29047:4;29053:2;29057:6;29031:15;:33::i;:::-;23177:5895;;;;23064:6008;;;:::o;30305:1660::-;30420:1;30400:17;;:21;:83;;;;;30466:17;;30438:24;30456:4;30438:9;:24::i;:::-;:45;;30400:83;30382:281;;;30584:15;;30619:17;;30510:141;;30552:4;;-1:-1:-1;;;;;30584:15:0;;;;30510;:141::i;:::-;30693:1;30673:17;:21;;;30733:24;30751:4;30733:9;:24::i;:::-;30707:50;;30768:25;30862:17;;30830:16;;30796:18;;:50;;;;:::i;:::-;:83;;;;:::i;:::-;30768:111;-1:-1:-1;30896:20:0;;;:46;;-1:-1:-1;30920:22:0;;30896:46;30892:85;;;30959:7;;30305:1660::o;30892:85::-;31011:18;;:23;;31032:2;31011:23;:::i;:::-;30993:15;:41;30989:115;;;31069:18;;:23;;31090:2;31069:23;:::i;:::-;31051:41;;30989:115;31116:12;31190:23;31303:1;31270:17;31235:18;;31217:15;:36;;;;:::i;:::-;31216:71;;;;:::i;:::-;:88;;;;:::i;:::-;31190:114;-1:-1:-1;31317:51:0;31334:33;31190:114;31334:15;:33;:::i;:::-;31317:16;:51::i;:::-;31576:18;;31402:21;;;;31381:18;;31576:22;;31597:1;;31576:22;:::i;:::-;31555:44;;:17;:44;:::i;:::-;31521:16;;31508:29;;:10;:29;:::i;:::-;31507:93;;;;:::i;:::-;31483:117;-1:-1:-1;31613:32:0;31483:117;31613:32;;:::i;:::-;31679:1;31658:18;:22;;;31691:16;:20;31613:32;-1:-1:-1;31728:19:0;;;;;:42;;;31769:1;31751:15;:19;31728:42;31724:121;;;31787:46;31800:15;31817;31787:12;:46::i;:::-;31879:14;;31871:86;;-1:-1:-1;;;;;31879:14:0;;;;31921:21;;31871:86;;;;31921:21;31879:14;31871:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;30305:1660:0:o;21515:236::-;-1:-1:-1;;;;;21598:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;21598:39:0;;;;;;;21648;21598:31;:39;21648:26;:39::i;29209:571::-;29359:16;;;29373:1;29359:16;;;;;;;;29335:21;;29359:16;;;;;;;;;;-1:-1:-1;29359:16:0;29335:40;;29404:4;29386;29391:1;29386:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29386:23:0;;;:7;;;;;;;;;;:23;;;;29430:9;;:16;;;-1:-1:-1;;;29430:16:0;;;;:9;;;;;:14;;:16;;;;;29386:7;;29430:16;;;;;:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29420:4;29425:1;29420:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29420:26:0;;;:7;;;;;;;;;:26;29491:9;;29459:56;;29476:4;;29491:9;29503:11;29459:8;:56::i;:::-;29554:9;;:218;;-1:-1:-1;;;29554:218:0;;-1:-1:-1;;;;;29554:9:0;;;;:60;;:218;;29629:11;;29554:9;;29699:4;;29726;;29746:15;;29554:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29264:516;29209:571;:::o;29788:509::-;29968:9;;29936:56;;29953:4;;-1:-1:-1;;;;;29968:9:0;29980:11;29936:8;:56::i;:::-;30035:9;;:254;;-1:-1:-1;;;30035:254:0;;-1:-1:-1;;;;;30035:9:0;;;;:25;;30068:9;;30035:254;;30101:4;;30121:11;;30035:9;;;;30241:6;;30263:15;;30035:254;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;29788:509;;:::o;19856:221::-;-1:-1:-1;;;;;19958:39:0;;;;;;:31;:39;;;;;;;;;:52;;-1:-1:-1;;19958:52:0;;;;;;;;;;20026:43;;28517:51:1;;;28584:18;;;28577:50;20026:43:0;;28490:18:1;20026:43:0;;;;;;;19856:221;;:::o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;842:131::-;-1:-1:-1;;;;;917:31:1;;907:42;;897:70;;963:1;960;953:12;897:70;842:131;:::o;978:315::-;1046:6;1054;1107:2;1095:9;1086:7;1082:23;1078:32;1075:52;;;1123:1;1120;1113:12;1075:52;1162:9;1149:23;1181:31;1206:5;1181:31;:::i;:::-;1231:5;1283:2;1268:18;;;;1255:32;;-1:-1:-1;;;978:315:1:o;1490:180::-;1549:6;1602:2;1590:9;1581:7;1577:23;1573:32;1570:52;;;1618:1;1615;1608:12;1570:52;-1:-1:-1;1641:23:1;;1490:180;-1:-1:-1;1490:180:1:o;1675:247::-;1734:6;1787:2;1775:9;1766:7;1762:23;1758:32;1755:52;;;1803:1;1800;1793:12;1755:52;1842:9;1829:23;1861:31;1886:5;1861:31;:::i;:::-;1911:5;1675:247;-1:-1:-1;;;1675:247:1:o;2109:127::-;2170:10;2165:3;2161:20;2158:1;2151:31;2201:4;2198:1;2191:15;2225:4;2222:1;2215:15;2241:275;2312:2;2306:9;2377:2;2358:13;;-1:-1:-1;;2354:27:1;2342:40;;2412:18;2397:34;;2433:22;;;2394:62;2391:88;;;2459:18;;:::i;:::-;2495:2;2488:22;2241:275;;-1:-1:-1;2241:275:1:o;2521:183::-;2581:4;2614:18;2606:6;2603:30;2600:56;;;2636:18;;:::i;:::-;-1:-1:-1;2681:1:1;2677:14;2693:4;2673:25;;2521:183::o;2709:662::-;2763:5;2816:3;2809:4;2801:6;2797:17;2793:27;2783:55;;2834:1;2831;2824:12;2783:55;2870:6;2857:20;2896:4;2920:60;2936:43;2976:2;2936:43;:::i;:::-;2920:60;:::i;:::-;3014:15;;;3100:1;3096:10;;;;3084:23;;3080:32;;;3045:12;;;;3124:15;;;3121:35;;;3152:1;3149;3142:12;3121:35;3188:2;3180:6;3176:15;3200:142;3216:6;3211:3;3208:15;3200:142;;;3282:17;;3270:30;;3320:12;;;;3233;;3200:142;;;-1:-1:-1;3360:5:1;2709:662;-1:-1:-1;;;;;;2709:662:1:o;3376:1215::-;3494:6;3502;3555:2;3543:9;3534:7;3530:23;3526:32;3523:52;;;3571:1;3568;3561:12;3523:52;3611:9;3598:23;3640:18;3681:2;3673:6;3670:14;3667:34;;;3697:1;3694;3687:12;3667:34;3735:6;3724:9;3720:22;3710:32;;3780:7;3773:4;3769:2;3765:13;3761:27;3751:55;;3802:1;3799;3792:12;3751:55;3838:2;3825:16;3860:4;3884:60;3900:43;3940:2;3900:43;:::i;3884:60::-;3978:15;;;4060:1;4056:10;;;;4048:19;;4044:28;;;4009:12;;;;4084:19;;;4081:39;;;4116:1;4113;4106:12;4081:39;4140:11;;;;4160:217;4176:6;4171:3;4168:15;4160:217;;;4256:3;4243:17;4273:31;4298:5;4273:31;:::i;:::-;4317:18;;4193:12;;;;4355;;;;4160:217;;;4396:5;-1:-1:-1;;4439:18:1;;4426:32;;-1:-1:-1;;4470:16:1;;;4467:36;;;4499:1;4496;4489:12;4467:36;;4522:63;4577:7;4566:8;4555:9;4551:24;4522:63;:::i;:::-;4512:73;;;3376:1215;;;;;:::o;4596:456::-;4673:6;4681;4689;4742:2;4730:9;4721:7;4717:23;4713:32;4710:52;;;4758:1;4755;4748:12;4710:52;4797:9;4784:23;4816:31;4841:5;4816:31;:::i;:::-;4866:5;-1:-1:-1;4923:2:1;4908:18;;4895:32;4936:33;4895:32;4936:33;:::i;:::-;4596:456;;4988:7;;-1:-1:-1;;;5042:2:1;5027:18;;;;5014:32;;4596:456::o;5454:118::-;5540:5;5533:13;5526:21;5519:5;5516:32;5506:60;;5562:1;5559;5552:12;5577:382;5642:6;5650;5703:2;5691:9;5682:7;5678:23;5674:32;5671:52;;;5719:1;5716;5709:12;5671:52;5758:9;5745:23;5777:31;5802:5;5777:31;:::i;:::-;5827:5;-1:-1:-1;5884:2:1;5869:18;;5856:32;5897:30;5856:32;5897:30;:::i;:::-;5946:7;5936:17;;;5577:382;;;;;:::o;5964:316::-;6041:6;6049;6057;6110:2;6098:9;6089:7;6085:23;6081:32;6078:52;;;6126:1;6123;6116:12;6078:52;-1:-1:-1;;6149:23:1;;;6219:2;6204:18;;6191:32;;-1:-1:-1;6270:2:1;6255:18;;;6242:32;;5964:316;-1:-1:-1;5964:316:1:o;6285:388::-;6353:6;6361;6414:2;6402:9;6393:7;6389:23;6385:32;6382:52;;;6430:1;6427;6420:12;6382:52;6469:9;6456:23;6488:31;6513:5;6488:31;:::i;:::-;6538:5;-1:-1:-1;6595:2:1;6580:18;;6567:32;6608:33;6567:32;6608:33;:::i;6678:461::-;6731:3;6769:5;6763:12;6796:6;6791:3;6784:19;6822:4;6851:2;6846:3;6842:12;6835:19;;6888:2;6881:5;6877:14;6909:1;6919:195;6933:6;6930:1;6927:13;6919:195;;;6998:13;;-1:-1:-1;;;;;6994:39:1;6982:52;;7054:12;;;;7089:15;;;;7030:1;6948:9;6919:195;;;-1:-1:-1;7130:3:1;;6678:461;-1:-1:-1;;;;;6678:461:1:o;7144:261::-;7323:2;7312:9;7305:21;7286:4;7343:56;7395:2;7384:9;7380:18;7372:6;7343:56;:::i;7410:380::-;7489:1;7485:12;;;;7532;;;7553:61;;7607:4;7599:6;7595:17;7585:27;;7553:61;7660:2;7652:6;7649:14;7629:18;7626:38;7623:161;;7706:10;7701:3;7697:20;7694:1;7687:31;7741:4;7738:1;7731:15;7769:4;7766:1;7759:15;7623:161;;7410:380;;;:::o;7795:356::-;7997:2;7979:21;;;8016:18;;;8009:30;8075:34;8070:2;8055:18;;8048:62;8142:2;8127:18;;7795:356::o;8156:127::-;8217:10;8212:3;8208:20;8205:1;8198:31;8248:4;8245:1;8238:15;8272:4;8269:1;8262:15;8288:168;8328:7;8394:1;8390;8386:6;8382:14;8379:1;8376:21;8371:1;8364:9;8357:17;8353:45;8350:71;;;8401:18;;:::i;:::-;-1:-1:-1;8441:9:1;;8288:168::o;9653:127::-;9714:10;9709:3;9705:20;9702:1;9695:31;9745:4;9742:1;9735:15;9769:4;9766:1;9759:15;9785:135;9824:3;9845:17;;;9842:43;;9865:18;;:::i;:::-;-1:-1:-1;9912:1:1;9901:13;;9785:135::o;10334:217::-;10374:1;10400;10390:132;;10444:10;10439:3;10435:20;10432:1;10425:31;10479:4;10476:1;10469:15;10507:4;10504:1;10497:15;10390:132;-1:-1:-1;10536:9:1;;10334:217::o;11376:128::-;11416:3;11447:1;11443:6;11440:1;11437:13;11434:39;;;11453:18;;:::i;:::-;-1:-1:-1;11489:9:1;;11376:128::o;13824:403::-;14026:2;14008:21;;;14065:2;14045:18;;;14038:30;14104:34;14099:2;14084:18;;14077:62;-1:-1:-1;;;14170:2:1;14155:18;;14148:37;14217:3;14202:19;;13824:403::o;15008:184::-;15078:6;15131:2;15119:9;15110:7;15106:23;15102:32;15099:52;;;15147:1;15144;15137:12;15099:52;-1:-1:-1;15170:16:1;;15008:184;-1:-1:-1;15008:184:1:o;15476:245::-;15543:6;15596:2;15584:9;15575:7;15571:23;15567:32;15564:52;;;15612:1;15609;15602:12;15564:52;15644:9;15638:16;15663:28;15685:5;15663:28;:::i;16949:607::-;-1:-1:-1;;;;;17308:15:1;;;17290:34;;17355:2;17340:18;;17333:34;;;;17398:2;17383:18;;17376:34;;;;17441:2;17426:18;;17419:34;;;;17490:15;;;17484:3;17469:19;;17462:44;17270:3;17522:19;;17515:35;;;;17239:3;17224:19;;16949:607::o;17561:306::-;17649:6;17657;17665;17718:2;17706:9;17697:7;17693:23;17689:32;17686:52;;;17734:1;17731;17724:12;17686:52;17763:9;17757:16;17747:26;;17813:2;17802:9;17798:18;17792:25;17782:35;;17857:2;17846:9;17842:18;17836:25;17826:35;;17561:306;;;;;:::o;23381:401::-;23583:2;23565:21;;;23622:2;23602:18;;;23595:30;23661:34;23656:2;23641:18;;23634:62;-1:-1:-1;;;23727:2:1;23712:18;;23705:35;23772:3;23757:19;;23381:401::o;23787:399::-;23989:2;23971:21;;;24028:2;24008:18;;;24001:30;24067:34;24062:2;24047:18;;24040:62;-1:-1:-1;;;24133:2:1;24118:18;;24111:33;24176:3;24161:19;;23787:399::o;25786:125::-;25826:4;25854:1;25851;25848:8;25845:34;;;25859:18;;:::i;:::-;-1:-1:-1;25896:9:1;;25786:125::o;27506:251::-;27576:6;27629:2;27617:9;27608:7;27604:23;27600:32;27597:52;;;27645:1;27642;27635:12;27597:52;27677:9;27671:16;27696:31;27721:5;27696:31;:::i;27762:582::-;28061:6;28050:9;28043:25;28104:6;28099:2;28088:9;28084:18;28077:34;28147:3;28142:2;28131:9;28127:18;28120:31;28024:4;28168:57;28220:3;28209:9;28205:19;28197:6;28168:57;:::i;:::-;-1:-1:-1;;;;;28261:32:1;;;;28256:2;28241:18;;28234:60;-1:-1:-1;28325:3:1;28310:19;28303:35;28160:65;27762:582;-1:-1:-1;;;27762:582:1:o

Swarm Source

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