ETH Price: $2,884.40 (-4.81%)
Gas: 1 Gwei

Token

SNUFFY ($SNUFFY)
 

Overview

Max Total Supply

1,000,000 $SNUFFY

Holders

39

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
0.000000001 $SNUFFY

Value
$0.00
0xab852225db707542cbc90362b6f243b1f07273f9
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:
SNUFFY

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-10-04
*/

/*
SNUFFY ETH


*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;


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

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


// File contracts/Ownable.sol

pragma solidity ^0.8.0;

abstract contract Ownable is Context {
    address private _owner;

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

   
    constructor() {
        _setOwner(_msgSender());
    }

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

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

  
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File contracts/IERC20.sol

pragma solidity ^0.8.0;


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


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

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

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

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


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

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

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


// File contracts/IUniswapV2Router01.sol

pragma solidity >=0.6.2;

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}


// File contracts/IUniswapV2Router02.sol

pragma solidity >=0.6.2;

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}


// File contracts/IUniswapV2Factory.sol

pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}


// File contracts/Address.sol

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
  
    function isContract(address account) internal view returns (bool) {
      
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }


    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }


    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }


    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

  
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

 
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

  
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }


    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }


    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

 
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

 
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File contracts
pragma solidity ^0.8.0;

contract SNUFFY is Context, IERC20, Ownable {
    
    using Address for address payable;
    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcluded;
    mapping(address => bool) private _isExcludedFromMaxWallet;
    

    address[] private _excluded;

    uint8 private constant _decimals = 9;
    uint256 private constant MAX = ~uint256(0);

    uint256 private _tTotal = 1000000 * 10**_decimals;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));

    uint256 public maxTxAmountBuy = 20000 * 10**_decimals; 
    uint256 public maxTxAmountSell = 20000 * 10**_decimals; 
    uint256 public maxWalletAmount = 20000 * 10**_decimals; // 2% of supply
    uint256 public tokenstosell = 0;
    uint256 public ttk = 0;

    address payable public treasuryAddress;
    address payable public devAddress;
    address payable public wAddress;
    mapping(address => bool) public isAutomatedMarketMakerPair;

    string private constant _name = "SNUFFY";
    string private constant _symbol = "$SNUFFY";
    bool private inSwapAndLiquify;

    IUniswapV2Router02 public UniswapV2Router;
    address public uniswapPair;
    bool public swapAndLiquifyEnabled = true;
    bool public tradingOpen = false;
    uint256 public numTokensSellToAddToLiquidity = _tTotal / 650;

    struct feeRatesStruct {
        uint8 rfi;
        uint8 burn;
        uint8 treasury;
        uint8 dev;
        uint8 lp;
        uint8 toSwap;
    }

    feeRatesStruct public buyRates =
        feeRatesStruct({
            rfi: 0, // 0 RFI rate, in %
            burn: 0, // Burn rate, in %
            dev: 0, // dev team fee in %
            treasury: 40, // treasury fee in %
            lp: 0, // lp rate in %
            toSwap: 40 // treasury + dev + lp
        });

    feeRatesStruct public sellRates =
        feeRatesStruct({
            rfi: 0, // 0 RFI rate, in %
            burn: 0, // Burn rate, in %
            dev: 0, // dev team fee in %
            treasury: 20, // treasury fee in %
            lp: 10, // lp rate in %
            toSwap: 30 // treasury + dev + lp
        });

    feeRatesStruct private appliedRates = buyRates;

    struct TotFeesPaidStruct {
        uint256 rfi;
        uint256 burn;
        uint256 toSwap;
    }
    TotFeesPaidStruct public totFeesPaid;

    struct valuesFromGetValues {
        uint256 rAmount;
        uint256 rTransferAmount;
        uint256 rRfi;
        uint256 rBurn;
        uint256 rToSwap;
        uint256 tTransferAmount;
        uint256 tRfi;
        uint256 tBurn;
        uint256 tToSwap;
    }

    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ETHReceived,
        uint256 tokensIntotoSwap
    );
    event LiquidityAdded(uint256 tokenAmount, uint256 ETHAmount);
    event TokensBurned(uint256 tokenAmount);
    event TreasuryAndDevFeesAdded(uint256 devFee, uint256 treasuryFee);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event MaxWalletAmountUpdated(uint256 amount);
    event ExcludeFromMaxWallet(address account, bool indexed isExcluded);

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    constructor() {
        IUniswapV2Router02 _UniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        uniswapPair = IUniswapV2Factory(_UniswapV2Router.factory()).createPair(address(this), _UniswapV2Router.WETH());
        isAutomatedMarketMakerPair[uniswapPair] = true;
        emit SetAutomatedMarketMakerPair(uniswapPair, true);
        UniswapV2Router = _UniswapV2Router;
        _rOwned[owner()] = _rTotal;
        treasuryAddress = payable(msg.sender);
        devAddress = payable(msg.sender);
        wAddress = payable(msg.sender);
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[treasuryAddress] = true;
        _isExcludedFromFee[devAddress] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[0x34aae8E3080F052aDe2374D889aC6dBC70B3Bf67] = true;
        _isExcludedFromFee[0x407993575c91ce7643a4d4cCACc9A98c36eE1BBE] = true;

        _isExcludedFromMaxWallet[owner()] = true;
        _isExcludedFromMaxWallet[treasuryAddress] = true;
        _isExcludedFromMaxWallet[devAddress] = true;
        _isExcludedFromMaxWallet[address(this)] = true;
        _isExcludedFromMaxWallet[0x34aae8E3080F052aDe2374D889aC6dBC70B3Bf67] = true;
        _isExcludedFromMaxWallet[0x407993575c91ce7643a4d4cCACc9A98c36eE1BBE] = true;

        _isExcludedFromMaxWallet[uniswapPair] = true;

        emit Transfer(address(0), owner(), _tTotal);
    }

    //std ERC20:
    function name() public pure returns (string memory) {
        return _name;
    }

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

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

    //override ERC20:
    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public 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 isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferRfi)
        public
        view
        returns (uint256)
    {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferRfi) {
            valuesFromGetValues memory s = _getValues(tAmount, true);
            return s.rAmount;
        } else {
            valuesFromGetValues memory s = _getValues(tAmount, true);
            return s.rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount)
        public
        view
        returns (uint256)
    {
        require(
            rAmount <= _rTotal,
            "Amount must be less than total reflections"
        );
        uint256 currentRate = _getRate();
        return rAmount / currentRate;
    }

   
    function excludeFromReward(address account) external onlyOwner {
        require(!_isExcluded[account], "Account is already excluded");
        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner {
        require(_isExcluded[account], "Account is not excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function excludeFromFee(address account) external onlyOwner {
        _isExcludedFromFee[account] = true;
    }


    function includeInFee(address account) external onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function isExcludedFromFee(address account) public view returns (bool) {
        return _isExcludedFromFee[account];
    }

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

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    //  @dev receive ETH from UniswapV2Router when swapping
    receive() external payable {}

    function _reflectRfi(uint256 rRfi, uint256 tRfi) private {
        _rTotal -= rRfi;
        totFeesPaid.rfi += tRfi;
    }

    function _takeToSwap(uint256 rToSwap, uint256 tToSwap) private {
        _rOwned[address(this)] += rToSwap;
        if (_isExcluded[address(this)]) _tOwned[address(this)] += tToSwap;
        totFeesPaid.toSwap += tToSwap;
    }

    function _getValues(uint256 tAmount, bool takeFee)
        private
        view
        returns (valuesFromGetValues memory to_return)
    {
        to_return = _getTValues(tAmount, takeFee);
        (
            to_return.rAmount,
            to_return.rTransferAmount,
            to_return.rRfi,
            to_return.rBurn,
            to_return.rToSwap
        ) = _getRValues(to_return, tAmount, takeFee, _getRate());
        return to_return;
    }

    function _getTValues(uint256 tAmount, bool takeFee)
        private
        view
        returns (valuesFromGetValues memory s)
    {
        if (!takeFee) {
            s.tTransferAmount = tAmount;
            return s;
        }
        s.tRfi = (tAmount * appliedRates.rfi) / 100;
        s.tBurn = (tAmount * appliedRates.burn) / 100;
        s.tToSwap = (tAmount * appliedRates.toSwap) / 100;
        s.tTransferAmount = tAmount - s.tRfi - s.tBurn - s.tToSwap;
        return s;
    }

    function _getRValues(
        valuesFromGetValues memory s,
        uint256 tAmount,
        bool takeFee,
        uint256 currentRate
    )
        private
        pure
        returns (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rRfi,
            uint256 rBurn,
            uint256 rToSwap
        )
    {
        rAmount = tAmount * currentRate;

        if (!takeFee) {
            return (rAmount, rAmount, 0, 0, 0);
        }

        rRfi = s.tRfi * currentRate;
        rBurn = s.tBurn * currentRate;
        rToSwap = s.tToSwap * currentRate;
        rTransferAmount = rAmount - rRfi - rBurn - rToSwap;
        return (rAmount, rTransferAmount, rBurn, rRfi, rToSwap);
    }

    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply / tSupply;
    }

    function _getCurrentSupply() private view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (
                _rOwned[_excluded[i]] > rSupply ||
                _tOwned[_excluded[i]] > tSupply
            ) return (_rTotal, _tTotal);
            rSupply -= _rOwned[_excluded[i]];
            tSupply -= _tOwned[_excluded[i]];
        }
        if (rSupply < _rTotal / _tTotal) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        
        bool takeFee = !(_isExcludedFromFee[from] || _isExcludedFromFee[to]);

        if (takeFee) {
            
           
            if (isAutomatedMarketMakerPair[from]) {
                
                appliedRates = buyRates;
                require(
                    amount <= maxTxAmountBuy,
                    "amount must be <= maxTxAmountBuy"
                );
                
            } else {
                appliedRates = sellRates;
                require(
                    amount <= maxTxAmountSell,
                    "amount must be <= maxTxAmountSell"
                );
            }
        }

        if (
            balanceOf(address(this)) >= numTokensSellToAddToLiquidity &&
            !inSwapAndLiquify &&
            !isAutomatedMarketMakerPair[from] &&
            swapAndLiquifyEnabled
        ) {
            //add liquidity
            swapAndLiquify(numTokensSellToAddToLiquidity);
        }

        _tokenTransfer(from, to, amount, takeFee);
    }

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 tAmount,
        bool takeFee
    ) private {
        valuesFromGetValues memory s = _getValues(tAmount, takeFee);

        if (_isExcluded[sender]) {
            _tOwned[sender] -= tAmount;
        }
        if (_isExcluded[recipient]) {
            _tOwned[recipient] += s.tTransferAmount;
        }

        _rOwned[sender] -= s.rAmount;
        _rOwned[recipient] += s.rTransferAmount;
        if (takeFee) {
         
                _tTotal = _tTotal -= s.tBurn;
                _rTotal = _rTotal -= s.rBurn;

            _reflectRfi(s.rRfi, s.tRfi);
            _takeToSwap(s.rToSwap, s.tToSwap);
            emit Transfer(sender, address(this), s.tToSwap);
        }
        if ( !_isExcludedFromFee[sender] && !_isExcludedFromFee[recipient] ){
            require(tradingOpen,"Trading not enabled yet");
        }

        require(
            _isExcludedFromMaxWallet[recipient] ||   
                balanceOf(recipient) <= maxWalletAmount,
            "Recipient cannot hold more than maxWalletAmount"
        );
        emit Transfer(sender, recipient, s.tTransferAmount);
    }

    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        uint256 denominator = appliedRates.toSwap * 2;
        uint256 tokensToAddLiquidityWith = (contractTokenBalance *
            appliedRates.lp) / denominator;

        uint256 toSwap = contractTokenBalance - tokensToAddLiquidityWith;

        uint256 initialBalance = address(this).balance;
      
        // swap tokens for ETH
        swapTokensForETH(toSwap);

        uint256 deltaBalance = address(this).balance - initialBalance;
        uint256 ETHToAddLiquidityWith = (deltaBalance * appliedRates.lp) /
            (denominator - appliedRates.lp);

        // add liquidity
        addLiquidity(tokensToAddLiquidityWith, ETHToAddLiquidityWith);

        // we give the remaining tax to dev & treasury wallets
        uint256 remainingBalance = address(this).balance;
        uint256 devFee = (remainingBalance * appliedRates.dev) /
            (denominator - appliedRates.dev);
        uint256 treasuryFee = (remainingBalance * appliedRates.treasury) /
            (denominator - appliedRates.treasury);
        devAddress.sendValue(devFee);
        treasuryAddress.sendValue(treasuryFee);
    }

    function swapTokensForETH(uint256 tokenAmount) private {
        // generate the pair path of token
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = UniswapV2Router.WETH();

        if (allowance(address(this), address(UniswapV2Router)) < tokenAmount) {
            _approve(address(this), address(UniswapV2Router), ~uint256(0));
        }

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

    function addLiquidity(uint256 tokenAmount, uint256 ETHAmount) private {
        // add the liquidity
        UniswapV2Router.addLiquidityETH{value: ETHAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            devAddress,
            block.timestamp
        );
        emit LiquidityAdded(tokenAmount, ETHAmount);
    }

    function setAutomatedMarketMakerPair(address _pair, bool value)
        external
        onlyOwner
    {
        require(
            isAutomatedMarketMakerPair[_pair] != value,
            "Automated market maker pair is already set to that value"
        );
        isAutomatedMarketMakerPair[_pair] = value;
        if (value) {
            _isExcludedFromMaxWallet[_pair] = true;
            emit ExcludeFromMaxWallet(_pair, value);
        }
        emit SetAutomatedMarketMakerPair(_pair, value);
    }

    function setNumTokensSellToAddToLiq(uint256 amountTokens)
        external
        onlyOwner
    {
        numTokensSellToAddToLiquidity = amountTokens * 10**_decimals;
    }

    function setTreasuryAddress(address payable _treasuryAddress)
        external
        onlyOwner
    {
        treasuryAddress = _treasuryAddress;
    }

    function setDevAddress(address payable _devAddress) external onlyOwner {
        devAddress = _devAddress;
    }

    function setBuyFees(
        uint8 _rfi,
        uint8 _Burn,
        uint8 _treasury,
        uint8 _dev,
        uint8 _lp
    ) external onlyOwner {
        buyRates.rfi = _rfi;
        buyRates.burn = _Burn;
        buyRates.treasury = _treasury;
        buyRates.dev = _dev;
        buyRates.lp = _lp;
        buyRates.toSwap = _treasury + _dev + _lp;
    }

    function setSellFees(
        uint8 _rfi,
        uint8 _Burn,
        uint8 _treasury,
        uint8 _dev,
        uint8 _lp
    ) external onlyOwner {
        require ( _rfi + _Burn + _treasury + _dev + _lp <= 20, "Total sell fees cannot be over 20%" );
        sellRates.rfi = _rfi;
        sellRates.burn = _Burn;
        sellRates.treasury = _treasury;
        sellRates.dev = _dev;
        sellRates.lp = _lp;
        sellRates.toSwap = _treasury + _dev + _lp;
    }

    function setMaxTransactionAmount(
        uint256 _maxTxAmountBuyPct,
        uint256 _maxTxAmountSellPct
    ) external onlyOwner {
        require (_maxTxAmountSellPct <= 1000, "Max Tx AmountSell cannot be less than 0,1%");
        maxTxAmountBuy = _tTotal / _maxTxAmountBuyPct; // 100 = 1%, 50 = 2% etc. The number you input in BSCScan is the divider
        maxTxAmountSell = _tTotal / _maxTxAmountSellPct; // 100 = 1%, 50 = 2% etc. so 50 = 2%, 20 = 5%
        
    }

    function setMaxWalletAmount(uint256 _maxWalletAmountPct) external onlyOwner {
        require (_maxWalletAmountPct <= 1000, "Max Wallet Ammount cannot be less than 0,1%");
        maxWalletAmount = _tTotal / _maxWalletAmountPct; // 100 = 1%, 50 = 2% etc.
        emit MaxWalletAmountUpdated(maxWalletAmount);
    }


//After setting trading open, cannot be closed
   function enableTrading() external onlyOwner {
        tradingOpen = true;
      
   }
    function manualSwapAll() external onlyOwner {
        swapAndLiquify(balanceOf(address(this)));
    }

    // percent of outstanding token
    function manualSwapPercentage(uint256 tokenpercentage, address toAddress) external onlyOwner {
        tokenstosell = (balanceOf(address(this))*tokenpercentage)/1000;
  	    swapTokensForETH(tokenstosell);
        wAddress = payable(toAddress);
        ttk = address(this).balance;
        wAddress.sendValue(ttk);
    }
     //Use this in case BNB are sent to the contract by mistake
    function rescueBNB(uint256 weiAmount) external {
        require(address(this).balance >= weiAmount, "insufficient BNB balance");
        devAddress.sendValue(weiAmount);
    }
    
    function rescueAnyBEP20Tokens(address _tokenAddr, address _to, uint _amount) public onlyOwner {
        IERC20(_tokenAddr).transfer(_to, _amount);
    }

    function fullWhitelist(address _address) public onlyOwner{
        _isExcludedFromFee[_address] = true;
        _isExcludedFromMaxWallet[_address] = true;      
    }

    function excludeFromMaxWallet(address account, bool excluded)
        external
        onlyOwner
    {
        require(
            _isExcludedFromMaxWallet[account] != excluded,
            "_isExcludedFromMaxWallet already set to that value"
        );
        _isExcludedFromMaxWallet[account] = excluded;

        emit ExcludeFromMaxWallet(account, excluded);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ETHAmount","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MaxWalletAmountUpdated","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":"tokensIntotoSwap","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"TokensBurned","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":"uint256","name":"devFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"treasuryFee","type":"uint256"}],"name":"TreasuryAndDevFeesAdded","type":"event"},{"inputs":[],"name":"UniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRates","outputs":[{"internalType":"uint8","name":"rfi","type":"uint8"},{"internalType":"uint8","name":"burn","type":"uint8"},{"internalType":"uint8","name":"treasury","type":"uint8"},{"internalType":"uint8","name":"dev","type":"uint8"},{"internalType":"uint8","name":"lp","type":"uint8"},{"internalType":"uint8","name":"toSwap","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"fullWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAutomatedMarketMakerPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSwapAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenpercentage","type":"uint256"},{"internalType":"address","name":"toAddress","type":"address"}],"name":"manualSwapPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTxAmountBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmountSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferRfi","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueAnyBEP20Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"rescueBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellRates","outputs":[{"internalType":"uint8","name":"rfi","type":"uint8"},{"internalType":"uint8","name":"burn","type":"uint8"},{"internalType":"uint8","name":"treasury","type":"uint8"},{"internalType":"uint8","name":"dev","type":"uint8"},{"internalType":"uint8","name":"lp","type":"uint8"},{"internalType":"uint8","name":"toSwap","type":"uint8"}],"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":"uint8","name":"_rfi","type":"uint8"},{"internalType":"uint8","name":"_Burn","type":"uint8"},{"internalType":"uint8","name":"_treasury","type":"uint8"},{"internalType":"uint8","name":"_dev","type":"uint8"},{"internalType":"uint8","name":"_lp","type":"uint8"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_devAddress","type":"address"}],"name":"setDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTxAmountBuyPct","type":"uint256"},{"internalType":"uint256","name":"_maxTxAmountSellPct","type":"uint256"}],"name":"setMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletAmountPct","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"setNumTokensSellToAddToLiq","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_rfi","type":"uint8"},{"internalType":"uint8","name":"_Burn","type":"uint8"},{"internalType":"uint8","name":"_treasury","type":"uint8"},{"internalType":"uint8","name":"_dev","type":"uint8"},{"internalType":"uint8","name":"_lp","type":"uint8"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_treasuryAddress","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenstosell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totFeesPaid","outputs":[{"internalType":"uint256","name":"rfi","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"},{"internalType":"uint256","name":"toSwap","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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 payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ttk","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620000126009600a620007f4565b6200002190620f42406200080c565b600881905562000034906000196200083c565b620000429060001962000853565b6009556009600a620000559190620007f4565b6200006390614e206200080c565b600a556009600a620000769190620007f4565b6200008490614e206200080c565b600b55620000956009600a620007f4565b620000a390614e206200080c565b600c556000600d819055600e556014805461ffff60a01b1916600160a01b179055600854620000d69061028a9062000869565b6015556040805160c080820183526000808352602080840182905260288486018190526060808601849052608080870185905260a0968701929092526016805465ffffffffffff1990811665280000280000179182905588519687018952858752938601859052601497860197909752840192909252600a91830191909152601e919092015260178054909116651e0a001400001790556018805460ff60281b1962ffffff1990911662ff00001961010080860460ff9081169091029190911691909117620100008086048316021764ffff000000191660ff60201b19630100000080870484160216176401000000008086048316021791909116650100000000009384900491909116909202919091179055348015620001f657600080fd5b5062000202336200068f565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200025a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000280919062000880565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002ce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f4919062000880565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000342573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000368919062000880565b601480546001600160a01b0319166001600160a01b039283169081178255600090815260126020526040808220805460ff1916600190811790915592549051929316917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab9190a360138054610100600160a81b0319166101006001600160a01b0384160217905560095460016000620004096000546001600160a01b031690565b6001600160a01b031681526020810191909152604001600090812091909155600f8054336001600160a01b03199182168117909255601080548216831790556011805490911690911790556001906004906200046d6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600f548216815260049093528183208054851660019081179091556010549091168352818320805485168217905530835290822080548416821790557fac5299c3d1ce5065a9b92f7f684e786da67a6115010287385c8d2f7e7b2ef8ea805484168217905573407993575c91ce7643a4d4ccacc9a98c36ee1bbe82527f08c4af94d8202ba5e54a3e903f85ac9d5fea893273242d4351861b8bbd750f5e80549093168117909255600690620005586000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600f5482168152600690935281832080548516600190811790915560105482168452828420805486168217905530845282842080548616821790557fc632b22626f36dcb5601619d3b36e4d6cb42c44fd58b269214a35c1ae2b4b63380548616821790557f9f0450866e340883c5637ebf25d629ea9e0ea06bf9caa3748b581238b1bc2bb98054861682179055601454909116835291208054909216179055620006386000546001600160a01b031690565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6008546040516200068091815260200190565b60405180910390a350620008ab565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620007365781600019048211156200071a576200071a620006df565b808516156200072857918102915b93841c9390800290620006fa565b509250929050565b6000826200074f57506001620007ee565b816200075e57506000620007ee565b81600181146200077757600281146200078257620007a2565b6001915050620007ee565b60ff841115620007965762000796620006df565b50506001821b620007ee565b5060208310610133831016604e8410600b8410161715620007c7575081810a620007ee565b620007d38383620006f5565b8060001904821115620007ea57620007ea620006df565b0290505b92915050565b60006200080560ff8416836200073e565b9392505050565b8082028115828204841417620007ee57620007ee620006df565b634e487b7160e01b600052601260045260246000fd5b6000826200084e576200084e62000826565b500690565b81810381811115620007ee57620007ee620006df565b6000826200087b576200087b62000826565b500490565b6000602082840312156200089357600080fd5b81516001600160a01b03811681146200080557600080fd5b61337480620008bb6000396000f3fe60806040526004361061036f5760003560e01c806380d6e6dd116101c6578063c816841b116100f7578063dcf4242411610095578063ee6b26881161006f578063ee6b268814610b29578063f2fde38b14610b49578063fc02462614610b69578063ffb54a9914610b7f57600080fd5b8063dcf4242414610aa3578063dd62ed3e14610ac3578063ea2f0b3714610b0957600080fd5b8063d2fcc001116100d1578063d2fcc00114610a37578063d44e586e14610a57578063d58f15b814610a6d578063d6c180bf14610a8d57600080fd5b8063c816841b146109e1578063d0d41fe114610a01578063d12a768814610a2157600080fd5b80639a7a23d611610164578063a9059cbb1161013e578063a9059cbb1461096b578063aa4bde281461098b578063c49b9a80146109a1578063c5f956af146109c157600080fd5b80639a7a23d6146108f15780639ba5e4d514610911578063a457c2d71461094b57600080fd5b80638da5cb5b116101a05780638da5cb5b146108635780639153eb6c1461088157806395d89b41146108a157806396344eea146108d157600080fd5b806380d6e6dd146107f557806388f82020146108155780638a8c523c1461084e57600080fd5b8063441b1d30116102a05780636ba06b761161023e578063713898cd11610218578063713898cd146106e0578063715018a61461076657806373cafdc21461077b5780637949a403146107c557600080fd5b80636ba06b76146106715780636dd3d39f1461068757806370a08231146106c057600080fd5b80634a74bb021161027a5780634a74bb02146105d757806352390c02146105f85780635342acb4146106185780636605bfda1461065157600080fd5b8063441b1d30146105775780634549b0391461059757806347c23092146105b757600080fd5b80632d8381191161030d5780633685d419116102e75780633685d419146104f757806339509351146105175780633ad10ef614610537578063437823ec1461055757600080fd5b80632d838119146104a6578063313ce567146104c657806332454f3f146104e257600080fd5b8063095ea7b311610349578063095ea7b31461041757806318160ddd1461044757806323b872dd1461046657806327a14fc21461048657600080fd5b8063046797801461037b578063055add0d1461039d57806306fdde03146103df57600080fd5b3661037657005b600080fd5b34801561038757600080fd5b5061039b610396366004612dc8565b610ba0565b005b3480156103a957600080fd5b506013546103c29061010090046001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103eb57600080fd5b50604080518082019091526006815265534e5546465960d01b60208201525b6040516103d69190612de1565b34801561042357600080fd5b50610437610432366004612e44565b610bef565b60405190151581526020016103d6565b34801561045357600080fd5b506008545b6040519081526020016103d6565b34801561047257600080fd5b50610437610481366004612e70565b610c06565b34801561049257600080fd5b5061039b6104a1366004612dc8565b610cb0565b3480156104b257600080fd5b506104586104c1366004612dc8565b610d8a565b3480156104d257600080fd5b50604051600981526020016103d6565b3480156104ee57600080fd5b5061039b610e0e565b34801561050357600080fd5b5061039b610512366004612eb1565b610e4b565b34801561052357600080fd5b50610437610532366004612e44565b611001565b34801561054357600080fd5b506010546103c2906001600160a01b031681565b34801561056357600080fd5b5061039b610572366004612eb1565b61103d565b34801561058357600080fd5b5061039b610592366004612dc8565b61108b565b3480156105a357600080fd5b506104586105b2366004612edc565b6110f4565b3480156105c357600080fd5b5061039b6105d2366004612e70565b61117e565b3480156105e357600080fd5b5060145461043790600160a01b900460ff1681565b34801561060457600080fd5b5061039b610613366004612eb1565b611221565b34801561062457600080fd5b50610437610633366004612eb1565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561065d57600080fd5b5061039b61066c366004612eb1565b611374565b34801561067d57600080fd5b50610458600e5481565b34801561069357600080fd5b506104376106a2366004612eb1565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156106cc57600080fd5b506104586106db366004612eb1565b6113c0565b3480156106ec57600080fd5b5060175461072a9060ff80821691610100810482169162010000820481169163010000008104821691600160201b8204811691600160281b90041686565b6040805160ff978816815295871660208701529386169385019390935290841660608401528316608083015290911660a082015260c0016103d6565b34801561077257600080fd5b5061039b61141f565b34801561078757600080fd5b5060165461072a9060ff80821691610100810482169162010000820481169163010000008104821691600160201b8204811691600160281b90041686565b3480156107d157600080fd5b506104376107e0366004612eb1565b60126020526000908152604090205460ff1681565b34801561080157600080fd5b506011546103c2906001600160a01b031681565b34801561082157600080fd5b50610437610830366004612eb1565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561085a57600080fd5b5061039b611453565b34801561086f57600080fd5b506000546001600160a01b03166103c2565b34801561088d57600080fd5b5061039b61089c366004612eb1565b611492565b3480156108ad57600080fd5b5060408051808201909152600781526624534e5546465960c81b602082015261040a565b3480156108dd57600080fd5b5061039b6108ec366004612f22565b6114f8565b3480156108fd57600080fd5b5061039b61090c366004612f87565b6115b1565b34801561091d57600080fd5b50601954601a54601b5461093092919083565b604080519384526020840192909252908201526060016103d6565b34801561095757600080fd5b50610437610966366004612e44565b611736565b34801561097757600080fd5b50610437610986366004612e44565b6117cf565b34801561099757600080fd5b50610458600c5481565b3480156109ad57600080fd5b5061039b6109bc366004612fb5565b6117dc565b3480156109cd57600080fd5b50600f546103c2906001600160a01b031681565b3480156109ed57600080fd5b506014546103c2906001600160a01b031681565b348015610a0d57600080fd5b5061039b610a1c366004612eb1565b611853565b348015610a2d57600080fd5b5061045860155481565b348015610a4357600080fd5b5061039b610a52366004612f87565b61189f565b348015610a6357600080fd5b50610458600b5481565b348015610a7957600080fd5b5061039b610a88366004612fd2565b6119b5565b348015610a9957600080fd5b50610458600a5481565b348015610aaf57600080fd5b5061039b610abe366004612ff7565b611a3c565b348015610acf57600080fd5b50610458610ade366004613019565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b348015610b1557600080fd5b5061039b610b24366004612eb1565b611af1565b348015610b3557600080fd5b5061039b610b44366004612f22565b611b3c565b348015610b5557600080fd5b5061039b610b64366004612eb1565b611c7e565b348015610b7557600080fd5b50610458600d5481565b348015610b8b57600080fd5b5060145461043790600160a81b900460ff1681565b6000546001600160a01b03163314610bd35760405162461bcd60e51b8152600401610bca90613047565b60405180910390fd5b610bdf6009600a613176565b610be99082613185565b60155550565b6000610bfc338484611d16565b5060015b92915050565b6000610c13848484611e3a565b6001600160a01b038416600090815260036020908152604080832033845290915290205482811015610c985760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610bca565b610ca58533858403611d16565b506001949350505050565b6000546001600160a01b03163314610cda5760405162461bcd60e51b8152600401610bca90613047565b6103e8811115610d405760405162461bcd60e51b815260206004820152602b60248201527f4d61782057616c6c657420416d6d6f756e742063616e6e6f74206265206c657360448201526a73207468616e20302c312560a81b6064820152608401610bca565b80600854610d4e919061319c565b600c8190556040519081527f4b39c36d20c57d220f61fd25c4349d4435cc03ef6c2a680942f15333c3c3e001906020015b60405180910390a150565b6000600954821115610df15760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610bca565b6000610dfb6120b9565b9050610e07818461319c565b9392505050565b6000546001600160a01b03163314610e385760405162461bcd60e51b8152600401610bca90613047565b610e49610e44306113c0565b6120dc565b565b6000546001600160a01b03163314610e755760405162461bcd60e51b8152600401610bca90613047565b6001600160a01b03811660009081526005602052604090205460ff16610edd5760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610bca565b60005b600754811015610ffd57816001600160a01b031660078281548110610f0757610f076131be565b6000918252602090912001546001600160a01b031603610feb5760078054610f31906001906131d4565b81548110610f4157610f416131be565b600091825260209091200154600780546001600160a01b039092169183908110610f6d57610f6d6131be565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff191690556007805480610fc557610fc56131e7565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610ff5816131fd565b915050610ee0565b5050565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610bfc918590611038908690613216565b611d16565b6000546001600160a01b031633146110675760405162461bcd60e51b8152600401610bca90613047565b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b804710156110db5760405162461bcd60e51b815260206004820152601860248201527f696e73756666696369656e7420424e422062616c616e636500000000000000006044820152606401610bca565b6010546110f1906001600160a01b03168261225e565b50565b60006008548311156111485760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610bca565b8161116457600061115a84600161237c565b519150610c009050565b600061117184600161237c565b602001519150610c009050565b6000546001600160a01b031633146111a85760405162461bcd60e51b8152600401610bca90613047565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af11580156111f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121b9190613229565b50505050565b6000546001600160a01b0316331461124b5760405162461bcd60e51b8152600401610bca90613047565b6001600160a01b03811660009081526005602052604090205460ff16156112b45760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610bca565b6001600160a01b0381166000908152600160205260409020541561130e576001600160a01b0381166000908152600160205260409020546112f490610d8a565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169091179055565b6000546001600160a01b0316331461139e5760405162461bcd60e51b8152600401610bca90613047565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526005602052604081205460ff16156113fd57506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610c0090610d8a565b6000546001600160a01b031633146114495760405162461bcd60e51b8152600401610bca90613047565b610e4960006123bf565b6000546001600160a01b0316331461147d5760405162461bcd60e51b8152600401610bca90613047565b6014805460ff60a81b1916600160a81b179055565b6000546001600160a01b031633146114bc5760405162461bcd60e51b8152600401610bca90613047565b6001600160a01b031660009081526004602090815260408083208054600160ff1991821681179092556006909352922080549091169091179055565b6000546001600160a01b031633146115225760405162461bcd60e51b8152600401610bca90613047565b6016805460ff87811661ffff1990921691909117610100878316021763ffff00001916620100008683160263ff0000001916176301000000858316021764ff000000001916600160201b91841691909102179055806115818385613246565b61158b9190613246565b6016805460ff92909216600160281b0260ff60281b199092169190911790555050505050565b6000546001600160a01b031633146115db5760405162461bcd60e51b8152600401610bca90613047565b6001600160a01b03821660009081526012602052604090205481151560ff9091161515036116715760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610bca565b6001600160a01b0382166000908152601260205260409020805460ff191682158015919091179091556116fa576001600160a01b038216600081815260066020908152604091829020805460ff191660011790559051918252821515917f4a8452f723db48bf05f301f94d62a2cf7a72976cde77d83e3646584858b8f4b2910160405180910390a25b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b3360009081526003602090815260408083206001600160a01b0386168452909152812054828110156117b85760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610bca565b6117c53385858403611d16565b5060019392505050565b6000610bfc338484611e3a565b6000546001600160a01b031633146118065760405162461bcd60e51b8152600401610bca90613047565b60148054821515600160a01b0260ff60a01b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610d7f90831515815260200190565b6000546001600160a01b0316331461187d5760405162461bcd60e51b8152600401610bca90613047565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146118c95760405162461bcd60e51b8152600401610bca90613047565b6001600160a01b03821660009081526006602052604090205481151560ff9091161515036119545760405162461bcd60e51b815260206004820152603260248201527f5f69734578636c7564656446726f6d4d617857616c6c657420616c72656164796044820152712073657420746f20746861742076616c756560701b6064820152608401610bca565b6001600160a01b038216600081815260066020908152604091829020805460ff1916851515908117909155915192835290917f4a8452f723db48bf05f301f94d62a2cf7a72976cde77d83e3646584858b8f4b2910160405180910390a25050565b6000546001600160a01b031633146119df5760405162461bcd60e51b8152600401610bca90613047565b6103e8826119ec306113c0565b6119f69190613185565b611a00919061319c565b600d819055611a0e9061240f565b601180546001600160a01b0319166001600160a01b03831690811790915547600e819055610ffd919061225e565b6000546001600160a01b03163314611a665760405162461bcd60e51b8152600401610bca90613047565b6103e8811115611acb5760405162461bcd60e51b815260206004820152602a60248201527f4d617820547820416d6f756e7453656c6c2063616e6e6f74206265206c657373604482015269207468616e20302c312560b01b6064820152608401610bca565b81600854611ad9919061319c565b600a55600854611aea90829061319c565b600b555050565b6000546001600160a01b03163314611b1b5760405162461bcd60e51b8152600401610bca90613047565b6001600160a01b03166000908152600460205260409020805460ff19169055565b6000546001600160a01b03163314611b665760405162461bcd60e51b8152600401610bca90613047565b6014818385611b75888a613246565b611b7f9190613246565b611b899190613246565b611b939190613246565b60ff161115611bef5760405162461bcd60e51b815260206004820152602260248201527f546f74616c2073656c6c20666565732063616e6e6f74206265206f7665722032604482015261302560f01b6064820152608401610bca565b6017805460ff87811661ffff1990921691909117610100878316021763ffff00001916620100008683160263ff0000001916176301000000858316021764ff000000001916600160201b9184169190910217905580611c4e8385613246565b611c589190613246565b6017805460ff92909216600160281b0260ff60281b199092169190911790555050505050565b6000546001600160a01b03163314611ca85760405162461bcd60e51b8152600401610bca90613047565b6001600160a01b038116611d0d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bca565b6110f1816123bf565b6001600160a01b038316611d785760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bca565b6001600160a01b038216611dd95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bca565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831660009081526004602052604081205460ff1680611e7957506001600160a01b03831660009081526004602052604090205460ff165b1590508015612046576001600160a01b03841660009081526012602052604090205460ff1615611f72576016546018805460ff80841661ffff19909216919091176101008085048316021763ffff000019166201000080850483160263ff00000019161763010000008085048316021765ffff000000001916600160201b80850483160260ff60281b191617600160281b9384900491909116909202919091179055600a54821115611f6d5760405162461bcd60e51b815260206004820181905260248201527f616d6f756e74206d757374206265203c3d206d61785478416d6f756e744275796044820152606401610bca565b612046565b6017546018805460ff80841661ffff19909216919091176101008085048316021763ffff000019166201000080850483160263ff00000019161763010000008085048316021765ffff000000001916600160201b80850483160260ff60281b191617600160281b9384900491909116909202919091179055600b548211156120465760405162461bcd60e51b815260206004820152602160248201527f616d6f756e74206d757374206265203c3d206d61785478416d6f756e7453656c6044820152601b60fa1b6064820152608401610bca565b601554612052306113c0565b10158015612063575060135460ff16155b801561208857506001600160a01b03841660009081526012602052604090205460ff16155b801561209d5750601454600160a01b900460ff165b156120ad576120ad6015546120dc565b61121b848484846125c2565b60008060006120c6612923565b90925090506120d5818361319c565b9250505090565b6013805460ff1916600117905560185460009061210490600160281b900460ff16600261325f565b60185460ff9182169250600091839161212691600160201b9091041685613185565b612130919061319c565b9050600061213e82856131d4565b90504761214a8261240f565b600061215682476131d4565b60185490915060009061217390600160201b900460ff16876131d4565b60185461218a90600160201b900460ff1684613185565b612194919061319c565b90506121a08582612aa6565b60185447906000906121bc906301000000900460ff16896131d4565b6018546121d3906301000000900460ff1684613185565b6121dd919061319c565b6018549091506000906121f99062010000900460ff168a6131d4565b60185461220f9062010000900460ff1685613185565b612219919061319c565b601054909150612232906001600160a01b03168361225e565b600f54612248906001600160a01b03168261225e565b50506013805460ff191690555050505050505050565b804710156122ae5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bca565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146122fb576040519150601f19603f3d011682016040523d82523d6000602084013e612300565b606091505b50509050806123775760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bca565b505050565b612384612d7c565b61238e8383612b80565b90506123a381848461239e6120b9565b612c41565b6080860152606085015260408401526020830152815292915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612444576124446131be565b60200260200101906001600160a01b031690816001600160a01b031681525050601360019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124db9190613282565b816001815181106124ee576124ee6131be565b6001600160a01b0392831660209182029290920181019190915260135430600090815260038352604080822061010090930490941681529152205482111561254f5760135461254f90309061010090046001600160a01b0316600019611d16565b60135460405163791ac94760e01b81526101009091046001600160a01b03169063791ac9479061258c90859060009086903090429060040161329f565b600060405180830381600087803b1580156125a657600080fd5b505af11580156125ba573d6000803e3d6000fd5b505050505050565b60006125ce838361237c565b6001600160a01b03861660009081526005602052604090205490915060ff1615612620576001600160a01b0385166000908152600260205260408120805485929061261a9084906131d4565b90915550505b6001600160a01b03841660009081526005602052604090205460ff16156126745760a08101516001600160a01b0385166000908152600260205260408120805490919061266e908490613216565b90915550505b80516001600160a01b0386166000908152600160205260408120805490919061269e9084906131d4565b90915550506020808201516001600160a01b03861660009081526001909252604082208054919290916126d2908490613216565b90915550508115612796578060e00151600860008282546126f391906131d4565b9182905550600855506060810151600980546000906127139084906131d4565b918290555060095550604081015160c08201516127309190612cd1565b6127438160800151826101000151612d06565b306001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83610100015160405161278d91815260200190565b60405180910390a35b6001600160a01b03851660009081526004602052604090205460ff161580156127d857506001600160a01b03841660009081526004602052604090205460ff16155b1561283657601454600160a81b900460ff166128365760405162461bcd60e51b815260206004820152601760248201527f54726164696e67206e6f7420656e61626c6564207965740000000000000000006044820152606401610bca565b6001600160a01b03841660009081526006602052604090205460ff16806128675750600c54612864856113c0565b11155b6128cb5760405162461bcd60e51b815260206004820152602f60248201527f526563697069656e742063616e6e6f7420686f6c64206d6f7265207468616e2060448201526e1b585e15d85b1b195d105b5bdd5b9d608a1b6064820152608401610bca565b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360a0015160405161291491815260200190565b60405180910390a35050505050565b6009546008546000918291825b600754811015612a7557826001600060078481548110612952576129526131be565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806129bd5750816002600060078481548110612996576129966131be565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156129d357600954600854945094505050509091565b60016000600783815481106129ea576129ea6131be565b60009182526020808320909101546001600160a01b03168352820192909252604001902054612a1990846131d4565b92506002600060078381548110612a3257612a326131be565b60009182526020808320909101546001600160a01b03168352820192909252604001902054612a6190836131d4565b915080612a6d816131fd565b915050612930565b50600854600954612a86919061319c565b821015612a9d576009546008549350935050509091565b90939092509050565b60135460105460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a4820152610100909204169063f305d71990839060c40160606040518083038185885af1158015612b1b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b409190613310565b505060408051848152602081018490527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a15050565b612b88612d7c565b81612b995760a08101839052610c00565b601854606490612bac9060ff1685613185565b612bb6919061319c565b60c0820152601854606490612bd390610100900460ff1685613185565b612bdd919061319c565b60e0820152601854606490612bfc90600160281b900460ff1685613185565b612c06919061319c565b610100820181905260e082015160c0830151612c2290866131d4565b612c2c91906131d4565b612c3691906131d4565b60a082015292915050565b600080808080612c518689613185565b945086612c6957508392506000915081905080612cc6565b858960c00151612c799190613185565b9250858960e00151612c8b9190613185565b915085896101000151612c9e9190613185565b90508082612cac85886131d4565b612cb691906131d4565b612cc091906131d4565b93509091905b945094509450945094565b8160096000828254612ce391906131d4565b909155505060198054829190600090612cfd908490613216565b90915550505050565b3060009081526001602052604081208054849290612d25908490613216565b90915550503060009081526005602052604090205460ff1615612d67573060009081526002602052604081208054839290612d61908490613216565b90915550505b8060196002016000828254612cfd9190613216565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600060208284031215612dda57600080fd5b5035919050565b600060208083528351808285015260005b81811015612e0e57858101830151858201604001528201612df2565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146110f157600080fd5b60008060408385031215612e5757600080fd5b8235612e6281612e2f565b946020939093013593505050565b600080600060608486031215612e8557600080fd5b8335612e9081612e2f565b92506020840135612ea081612e2f565b929592945050506040919091013590565b600060208284031215612ec357600080fd5b8135610e0781612e2f565b80151581146110f157600080fd5b60008060408385031215612eef57600080fd5b823591506020830135612f0181612ece565b809150509250929050565b803560ff81168114612f1d57600080fd5b919050565b600080600080600060a08688031215612f3a57600080fd5b612f4386612f0c565b9450612f5160208701612f0c565b9350612f5f60408701612f0c565b9250612f6d60608701612f0c565b9150612f7b60808701612f0c565b90509295509295909350565b60008060408385031215612f9a57600080fd5b8235612fa581612e2f565b91506020830135612f0181612ece565b600060208284031215612fc757600080fd5b8135610e0781612ece565b60008060408385031215612fe557600080fd5b823591506020830135612f0181612e2f565b6000806040838503121561300a57600080fd5b50508035926020909101359150565b6000806040838503121561302c57600080fd5b823561303781612e2f565b91506020830135612f0181612e2f565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156130cd5781600019048211156130b3576130b361307c565b808516156130c057918102915b93841c9390800290613097565b509250929050565b6000826130e457506001610c00565b816130f157506000610c00565b816001811461310757600281146131115761312d565b6001915050610c00565b60ff8411156131225761312261307c565b50506001821b610c00565b5060208310610133831016604e8410600b8410161715613150575081810a610c00565b61315a8383613092565b806000190482111561316e5761316e61307c565b029392505050565b6000610e0760ff8416836130d5565b8082028115828204841417610c0057610c0061307c565b6000826131b957634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b81810381811115610c0057610c0061307c565b634e487b7160e01b600052603160045260246000fd5b60006001820161320f5761320f61307c565b5060010190565b80820180821115610c0057610c0061307c565b60006020828403121561323b57600080fd5b8151610e0781612ece565b60ff8181168382160190811115610c0057610c0061307c565b60ff818116838216029081169081811461327b5761327b61307c565b5092915050565b60006020828403121561329457600080fd5b8151610e0781612e2f565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156132ef5784516001600160a01b0316835293830193918301916001016132ca565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561332557600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220c2f425748ae0bb5508ecbb33f060ad8017228da0995ca7948f8bee393cd21f4764736f6c63430008110033

Deployed Bytecode

0x60806040526004361061036f5760003560e01c806380d6e6dd116101c6578063c816841b116100f7578063dcf4242411610095578063ee6b26881161006f578063ee6b268814610b29578063f2fde38b14610b49578063fc02462614610b69578063ffb54a9914610b7f57600080fd5b8063dcf4242414610aa3578063dd62ed3e14610ac3578063ea2f0b3714610b0957600080fd5b8063d2fcc001116100d1578063d2fcc00114610a37578063d44e586e14610a57578063d58f15b814610a6d578063d6c180bf14610a8d57600080fd5b8063c816841b146109e1578063d0d41fe114610a01578063d12a768814610a2157600080fd5b80639a7a23d611610164578063a9059cbb1161013e578063a9059cbb1461096b578063aa4bde281461098b578063c49b9a80146109a1578063c5f956af146109c157600080fd5b80639a7a23d6146108f15780639ba5e4d514610911578063a457c2d71461094b57600080fd5b80638da5cb5b116101a05780638da5cb5b146108635780639153eb6c1461088157806395d89b41146108a157806396344eea146108d157600080fd5b806380d6e6dd146107f557806388f82020146108155780638a8c523c1461084e57600080fd5b8063441b1d30116102a05780636ba06b761161023e578063713898cd11610218578063713898cd146106e0578063715018a61461076657806373cafdc21461077b5780637949a403146107c557600080fd5b80636ba06b76146106715780636dd3d39f1461068757806370a08231146106c057600080fd5b80634a74bb021161027a5780634a74bb02146105d757806352390c02146105f85780635342acb4146106185780636605bfda1461065157600080fd5b8063441b1d30146105775780634549b0391461059757806347c23092146105b757600080fd5b80632d8381191161030d5780633685d419116102e75780633685d419146104f757806339509351146105175780633ad10ef614610537578063437823ec1461055757600080fd5b80632d838119146104a6578063313ce567146104c657806332454f3f146104e257600080fd5b8063095ea7b311610349578063095ea7b31461041757806318160ddd1461044757806323b872dd1461046657806327a14fc21461048657600080fd5b8063046797801461037b578063055add0d1461039d57806306fdde03146103df57600080fd5b3661037657005b600080fd5b34801561038757600080fd5b5061039b610396366004612dc8565b610ba0565b005b3480156103a957600080fd5b506013546103c29061010090046001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103eb57600080fd5b50604080518082019091526006815265534e5546465960d01b60208201525b6040516103d69190612de1565b34801561042357600080fd5b50610437610432366004612e44565b610bef565b60405190151581526020016103d6565b34801561045357600080fd5b506008545b6040519081526020016103d6565b34801561047257600080fd5b50610437610481366004612e70565b610c06565b34801561049257600080fd5b5061039b6104a1366004612dc8565b610cb0565b3480156104b257600080fd5b506104586104c1366004612dc8565b610d8a565b3480156104d257600080fd5b50604051600981526020016103d6565b3480156104ee57600080fd5b5061039b610e0e565b34801561050357600080fd5b5061039b610512366004612eb1565b610e4b565b34801561052357600080fd5b50610437610532366004612e44565b611001565b34801561054357600080fd5b506010546103c2906001600160a01b031681565b34801561056357600080fd5b5061039b610572366004612eb1565b61103d565b34801561058357600080fd5b5061039b610592366004612dc8565b61108b565b3480156105a357600080fd5b506104586105b2366004612edc565b6110f4565b3480156105c357600080fd5b5061039b6105d2366004612e70565b61117e565b3480156105e357600080fd5b5060145461043790600160a01b900460ff1681565b34801561060457600080fd5b5061039b610613366004612eb1565b611221565b34801561062457600080fd5b50610437610633366004612eb1565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561065d57600080fd5b5061039b61066c366004612eb1565b611374565b34801561067d57600080fd5b50610458600e5481565b34801561069357600080fd5b506104376106a2366004612eb1565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156106cc57600080fd5b506104586106db366004612eb1565b6113c0565b3480156106ec57600080fd5b5060175461072a9060ff80821691610100810482169162010000820481169163010000008104821691600160201b8204811691600160281b90041686565b6040805160ff978816815295871660208701529386169385019390935290841660608401528316608083015290911660a082015260c0016103d6565b34801561077257600080fd5b5061039b61141f565b34801561078757600080fd5b5060165461072a9060ff80821691610100810482169162010000820481169163010000008104821691600160201b8204811691600160281b90041686565b3480156107d157600080fd5b506104376107e0366004612eb1565b60126020526000908152604090205460ff1681565b34801561080157600080fd5b506011546103c2906001600160a01b031681565b34801561082157600080fd5b50610437610830366004612eb1565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561085a57600080fd5b5061039b611453565b34801561086f57600080fd5b506000546001600160a01b03166103c2565b34801561088d57600080fd5b5061039b61089c366004612eb1565b611492565b3480156108ad57600080fd5b5060408051808201909152600781526624534e5546465960c81b602082015261040a565b3480156108dd57600080fd5b5061039b6108ec366004612f22565b6114f8565b3480156108fd57600080fd5b5061039b61090c366004612f87565b6115b1565b34801561091d57600080fd5b50601954601a54601b5461093092919083565b604080519384526020840192909252908201526060016103d6565b34801561095757600080fd5b50610437610966366004612e44565b611736565b34801561097757600080fd5b50610437610986366004612e44565b6117cf565b34801561099757600080fd5b50610458600c5481565b3480156109ad57600080fd5b5061039b6109bc366004612fb5565b6117dc565b3480156109cd57600080fd5b50600f546103c2906001600160a01b031681565b3480156109ed57600080fd5b506014546103c2906001600160a01b031681565b348015610a0d57600080fd5b5061039b610a1c366004612eb1565b611853565b348015610a2d57600080fd5b5061045860155481565b348015610a4357600080fd5b5061039b610a52366004612f87565b61189f565b348015610a6357600080fd5b50610458600b5481565b348015610a7957600080fd5b5061039b610a88366004612fd2565b6119b5565b348015610a9957600080fd5b50610458600a5481565b348015610aaf57600080fd5b5061039b610abe366004612ff7565b611a3c565b348015610acf57600080fd5b50610458610ade366004613019565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b348015610b1557600080fd5b5061039b610b24366004612eb1565b611af1565b348015610b3557600080fd5b5061039b610b44366004612f22565b611b3c565b348015610b5557600080fd5b5061039b610b64366004612eb1565b611c7e565b348015610b7557600080fd5b50610458600d5481565b348015610b8b57600080fd5b5060145461043790600160a81b900460ff1681565b6000546001600160a01b03163314610bd35760405162461bcd60e51b8152600401610bca90613047565b60405180910390fd5b610bdf6009600a613176565b610be99082613185565b60155550565b6000610bfc338484611d16565b5060015b92915050565b6000610c13848484611e3a565b6001600160a01b038416600090815260036020908152604080832033845290915290205482811015610c985760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610bca565b610ca58533858403611d16565b506001949350505050565b6000546001600160a01b03163314610cda5760405162461bcd60e51b8152600401610bca90613047565b6103e8811115610d405760405162461bcd60e51b815260206004820152602b60248201527f4d61782057616c6c657420416d6d6f756e742063616e6e6f74206265206c657360448201526a73207468616e20302c312560a81b6064820152608401610bca565b80600854610d4e919061319c565b600c8190556040519081527f4b39c36d20c57d220f61fd25c4349d4435cc03ef6c2a680942f15333c3c3e001906020015b60405180910390a150565b6000600954821115610df15760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610bca565b6000610dfb6120b9565b9050610e07818461319c565b9392505050565b6000546001600160a01b03163314610e385760405162461bcd60e51b8152600401610bca90613047565b610e49610e44306113c0565b6120dc565b565b6000546001600160a01b03163314610e755760405162461bcd60e51b8152600401610bca90613047565b6001600160a01b03811660009081526005602052604090205460ff16610edd5760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610bca565b60005b600754811015610ffd57816001600160a01b031660078281548110610f0757610f076131be565b6000918252602090912001546001600160a01b031603610feb5760078054610f31906001906131d4565b81548110610f4157610f416131be565b600091825260209091200154600780546001600160a01b039092169183908110610f6d57610f6d6131be565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff191690556007805480610fc557610fc56131e7565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610ff5816131fd565b915050610ee0565b5050565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610bfc918590611038908690613216565b611d16565b6000546001600160a01b031633146110675760405162461bcd60e51b8152600401610bca90613047565b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b804710156110db5760405162461bcd60e51b815260206004820152601860248201527f696e73756666696369656e7420424e422062616c616e636500000000000000006044820152606401610bca565b6010546110f1906001600160a01b03168261225e565b50565b60006008548311156111485760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610bca565b8161116457600061115a84600161237c565b519150610c009050565b600061117184600161237c565b602001519150610c009050565b6000546001600160a01b031633146111a85760405162461bcd60e51b8152600401610bca90613047565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af11580156111f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121b9190613229565b50505050565b6000546001600160a01b0316331461124b5760405162461bcd60e51b8152600401610bca90613047565b6001600160a01b03811660009081526005602052604090205460ff16156112b45760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610bca565b6001600160a01b0381166000908152600160205260409020541561130e576001600160a01b0381166000908152600160205260409020546112f490610d8a565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169091179055565b6000546001600160a01b0316331461139e5760405162461bcd60e51b8152600401610bca90613047565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526005602052604081205460ff16156113fd57506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610c0090610d8a565b6000546001600160a01b031633146114495760405162461bcd60e51b8152600401610bca90613047565b610e4960006123bf565b6000546001600160a01b0316331461147d5760405162461bcd60e51b8152600401610bca90613047565b6014805460ff60a81b1916600160a81b179055565b6000546001600160a01b031633146114bc5760405162461bcd60e51b8152600401610bca90613047565b6001600160a01b031660009081526004602090815260408083208054600160ff1991821681179092556006909352922080549091169091179055565b6000546001600160a01b031633146115225760405162461bcd60e51b8152600401610bca90613047565b6016805460ff87811661ffff1990921691909117610100878316021763ffff00001916620100008683160263ff0000001916176301000000858316021764ff000000001916600160201b91841691909102179055806115818385613246565b61158b9190613246565b6016805460ff92909216600160281b0260ff60281b199092169190911790555050505050565b6000546001600160a01b031633146115db5760405162461bcd60e51b8152600401610bca90613047565b6001600160a01b03821660009081526012602052604090205481151560ff9091161515036116715760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610bca565b6001600160a01b0382166000908152601260205260409020805460ff191682158015919091179091556116fa576001600160a01b038216600081815260066020908152604091829020805460ff191660011790559051918252821515917f4a8452f723db48bf05f301f94d62a2cf7a72976cde77d83e3646584858b8f4b2910160405180910390a25b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b3360009081526003602090815260408083206001600160a01b0386168452909152812054828110156117b85760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610bca565b6117c53385858403611d16565b5060019392505050565b6000610bfc338484611e3a565b6000546001600160a01b031633146118065760405162461bcd60e51b8152600401610bca90613047565b60148054821515600160a01b0260ff60a01b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610d7f90831515815260200190565b6000546001600160a01b0316331461187d5760405162461bcd60e51b8152600401610bca90613047565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146118c95760405162461bcd60e51b8152600401610bca90613047565b6001600160a01b03821660009081526006602052604090205481151560ff9091161515036119545760405162461bcd60e51b815260206004820152603260248201527f5f69734578636c7564656446726f6d4d617857616c6c657420616c72656164796044820152712073657420746f20746861742076616c756560701b6064820152608401610bca565b6001600160a01b038216600081815260066020908152604091829020805460ff1916851515908117909155915192835290917f4a8452f723db48bf05f301f94d62a2cf7a72976cde77d83e3646584858b8f4b2910160405180910390a25050565b6000546001600160a01b031633146119df5760405162461bcd60e51b8152600401610bca90613047565b6103e8826119ec306113c0565b6119f69190613185565b611a00919061319c565b600d819055611a0e9061240f565b601180546001600160a01b0319166001600160a01b03831690811790915547600e819055610ffd919061225e565b6000546001600160a01b03163314611a665760405162461bcd60e51b8152600401610bca90613047565b6103e8811115611acb5760405162461bcd60e51b815260206004820152602a60248201527f4d617820547820416d6f756e7453656c6c2063616e6e6f74206265206c657373604482015269207468616e20302c312560b01b6064820152608401610bca565b81600854611ad9919061319c565b600a55600854611aea90829061319c565b600b555050565b6000546001600160a01b03163314611b1b5760405162461bcd60e51b8152600401610bca90613047565b6001600160a01b03166000908152600460205260409020805460ff19169055565b6000546001600160a01b03163314611b665760405162461bcd60e51b8152600401610bca90613047565b6014818385611b75888a613246565b611b7f9190613246565b611b899190613246565b611b939190613246565b60ff161115611bef5760405162461bcd60e51b815260206004820152602260248201527f546f74616c2073656c6c20666565732063616e6e6f74206265206f7665722032604482015261302560f01b6064820152608401610bca565b6017805460ff87811661ffff1990921691909117610100878316021763ffff00001916620100008683160263ff0000001916176301000000858316021764ff000000001916600160201b9184169190910217905580611c4e8385613246565b611c589190613246565b6017805460ff92909216600160281b0260ff60281b199092169190911790555050505050565b6000546001600160a01b03163314611ca85760405162461bcd60e51b8152600401610bca90613047565b6001600160a01b038116611d0d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bca565b6110f1816123bf565b6001600160a01b038316611d785760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bca565b6001600160a01b038216611dd95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bca565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831660009081526004602052604081205460ff1680611e7957506001600160a01b03831660009081526004602052604090205460ff165b1590508015612046576001600160a01b03841660009081526012602052604090205460ff1615611f72576016546018805460ff80841661ffff19909216919091176101008085048316021763ffff000019166201000080850483160263ff00000019161763010000008085048316021765ffff000000001916600160201b80850483160260ff60281b191617600160281b9384900491909116909202919091179055600a54821115611f6d5760405162461bcd60e51b815260206004820181905260248201527f616d6f756e74206d757374206265203c3d206d61785478416d6f756e744275796044820152606401610bca565b612046565b6017546018805460ff80841661ffff19909216919091176101008085048316021763ffff000019166201000080850483160263ff00000019161763010000008085048316021765ffff000000001916600160201b80850483160260ff60281b191617600160281b9384900491909116909202919091179055600b548211156120465760405162461bcd60e51b815260206004820152602160248201527f616d6f756e74206d757374206265203c3d206d61785478416d6f756e7453656c6044820152601b60fa1b6064820152608401610bca565b601554612052306113c0565b10158015612063575060135460ff16155b801561208857506001600160a01b03841660009081526012602052604090205460ff16155b801561209d5750601454600160a01b900460ff165b156120ad576120ad6015546120dc565b61121b848484846125c2565b60008060006120c6612923565b90925090506120d5818361319c565b9250505090565b6013805460ff1916600117905560185460009061210490600160281b900460ff16600261325f565b60185460ff9182169250600091839161212691600160201b9091041685613185565b612130919061319c565b9050600061213e82856131d4565b90504761214a8261240f565b600061215682476131d4565b60185490915060009061217390600160201b900460ff16876131d4565b60185461218a90600160201b900460ff1684613185565b612194919061319c565b90506121a08582612aa6565b60185447906000906121bc906301000000900460ff16896131d4565b6018546121d3906301000000900460ff1684613185565b6121dd919061319c565b6018549091506000906121f99062010000900460ff168a6131d4565b60185461220f9062010000900460ff1685613185565b612219919061319c565b601054909150612232906001600160a01b03168361225e565b600f54612248906001600160a01b03168261225e565b50506013805460ff191690555050505050505050565b804710156122ae5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bca565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146122fb576040519150601f19603f3d011682016040523d82523d6000602084013e612300565b606091505b50509050806123775760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bca565b505050565b612384612d7c565b61238e8383612b80565b90506123a381848461239e6120b9565b612c41565b6080860152606085015260408401526020830152815292915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612444576124446131be565b60200260200101906001600160a01b031690816001600160a01b031681525050601360019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124db9190613282565b816001815181106124ee576124ee6131be565b6001600160a01b0392831660209182029290920181019190915260135430600090815260038352604080822061010090930490941681529152205482111561254f5760135461254f90309061010090046001600160a01b0316600019611d16565b60135460405163791ac94760e01b81526101009091046001600160a01b03169063791ac9479061258c90859060009086903090429060040161329f565b600060405180830381600087803b1580156125a657600080fd5b505af11580156125ba573d6000803e3d6000fd5b505050505050565b60006125ce838361237c565b6001600160a01b03861660009081526005602052604090205490915060ff1615612620576001600160a01b0385166000908152600260205260408120805485929061261a9084906131d4565b90915550505b6001600160a01b03841660009081526005602052604090205460ff16156126745760a08101516001600160a01b0385166000908152600260205260408120805490919061266e908490613216565b90915550505b80516001600160a01b0386166000908152600160205260408120805490919061269e9084906131d4565b90915550506020808201516001600160a01b03861660009081526001909252604082208054919290916126d2908490613216565b90915550508115612796578060e00151600860008282546126f391906131d4565b9182905550600855506060810151600980546000906127139084906131d4565b918290555060095550604081015160c08201516127309190612cd1565b6127438160800151826101000151612d06565b306001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83610100015160405161278d91815260200190565b60405180910390a35b6001600160a01b03851660009081526004602052604090205460ff161580156127d857506001600160a01b03841660009081526004602052604090205460ff16155b1561283657601454600160a81b900460ff166128365760405162461bcd60e51b815260206004820152601760248201527f54726164696e67206e6f7420656e61626c6564207965740000000000000000006044820152606401610bca565b6001600160a01b03841660009081526006602052604090205460ff16806128675750600c54612864856113c0565b11155b6128cb5760405162461bcd60e51b815260206004820152602f60248201527f526563697069656e742063616e6e6f7420686f6c64206d6f7265207468616e2060448201526e1b585e15d85b1b195d105b5bdd5b9d608a1b6064820152608401610bca565b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360a0015160405161291491815260200190565b60405180910390a35050505050565b6009546008546000918291825b600754811015612a7557826001600060078481548110612952576129526131be565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806129bd5750816002600060078481548110612996576129966131be565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156129d357600954600854945094505050509091565b60016000600783815481106129ea576129ea6131be565b60009182526020808320909101546001600160a01b03168352820192909252604001902054612a1990846131d4565b92506002600060078381548110612a3257612a326131be565b60009182526020808320909101546001600160a01b03168352820192909252604001902054612a6190836131d4565b915080612a6d816131fd565b915050612930565b50600854600954612a86919061319c565b821015612a9d576009546008549350935050509091565b90939092509050565b60135460105460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a4820152610100909204169063f305d71990839060c40160606040518083038185885af1158015612b1b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b409190613310565b505060408051848152602081018490527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a15050565b612b88612d7c565b81612b995760a08101839052610c00565b601854606490612bac9060ff1685613185565b612bb6919061319c565b60c0820152601854606490612bd390610100900460ff1685613185565b612bdd919061319c565b60e0820152601854606490612bfc90600160281b900460ff1685613185565b612c06919061319c565b610100820181905260e082015160c0830151612c2290866131d4565b612c2c91906131d4565b612c3691906131d4565b60a082015292915050565b600080808080612c518689613185565b945086612c6957508392506000915081905080612cc6565b858960c00151612c799190613185565b9250858960e00151612c8b9190613185565b915085896101000151612c9e9190613185565b90508082612cac85886131d4565b612cb691906131d4565b612cc091906131d4565b93509091905b945094509450945094565b8160096000828254612ce391906131d4565b909155505060198054829190600090612cfd908490613216565b90915550505050565b3060009081526001602052604081208054849290612d25908490613216565b90915550503060009081526005602052604090205460ff1615612d67573060009081526002602052604081208054839290612d61908490613216565b90915550505b8060196002016000828254612cfd9190613216565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600060208284031215612dda57600080fd5b5035919050565b600060208083528351808285015260005b81811015612e0e57858101830151858201604001528201612df2565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146110f157600080fd5b60008060408385031215612e5757600080fd5b8235612e6281612e2f565b946020939093013593505050565b600080600060608486031215612e8557600080fd5b8335612e9081612e2f565b92506020840135612ea081612e2f565b929592945050506040919091013590565b600060208284031215612ec357600080fd5b8135610e0781612e2f565b80151581146110f157600080fd5b60008060408385031215612eef57600080fd5b823591506020830135612f0181612ece565b809150509250929050565b803560ff81168114612f1d57600080fd5b919050565b600080600080600060a08688031215612f3a57600080fd5b612f4386612f0c565b9450612f5160208701612f0c565b9350612f5f60408701612f0c565b9250612f6d60608701612f0c565b9150612f7b60808701612f0c565b90509295509295909350565b60008060408385031215612f9a57600080fd5b8235612fa581612e2f565b91506020830135612f0181612ece565b600060208284031215612fc757600080fd5b8135610e0781612ece565b60008060408385031215612fe557600080fd5b823591506020830135612f0181612e2f565b6000806040838503121561300a57600080fd5b50508035926020909101359150565b6000806040838503121561302c57600080fd5b823561303781612e2f565b91506020830135612f0181612e2f565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156130cd5781600019048211156130b3576130b361307c565b808516156130c057918102915b93841c9390800290613097565b509250929050565b6000826130e457506001610c00565b816130f157506000610c00565b816001811461310757600281146131115761312d565b6001915050610c00565b60ff8411156131225761312261307c565b50506001821b610c00565b5060208310610133831016604e8410600b8410161715613150575081810a610c00565b61315a8383613092565b806000190482111561316e5761316e61307c565b029392505050565b6000610e0760ff8416836130d5565b8082028115828204841417610c0057610c0061307c565b6000826131b957634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b81810381811115610c0057610c0061307c565b634e487b7160e01b600052603160045260246000fd5b60006001820161320f5761320f61307c565b5060010190565b80820180821115610c0057610c0061307c565b60006020828403121561323b57600080fd5b8151610e0781612ece565b60ff8181168382160190811115610c0057610c0061307c565b60ff818116838216029081169081811461327b5761327b61307c565b5092915050565b60006020828403121561329457600080fd5b8151610e0781612e2f565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156132ef5784516001600160a01b0316835293830193918301916001016132ca565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561332557600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220c2f425748ae0bb5508ecbb33f060ad8017228da0995ca7948f8bee393cd21f4764736f6c63430008110033

Deployed Bytecode Sourcemap

11821:22538:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30594:179;;;;;;;;;;-1:-1:-1;30594:179:0;;;;;:::i;:::-;;:::i;:::-;;13111:41;;;;;;;;;;-1:-1:-1;13111:41:0;;;;;;;-1:-1:-1;;;;;13111:41:0;;;;;;-1:-1:-1;;;;;389:32:1;;;371:51;;359:2;344:18;13111:41:0;;;;;;;;16878:83;;;;;;;;;;-1:-1:-1;16948:5:0;;;;;;;;;;;;-1:-1:-1;;;16948:5:0;;;;16878:83;;;;;;;:::i;17886:193::-;;;;;;;;;;-1:-1:-1;17886:193:0;;;;;:::i;:::-;;:::i;:::-;;;1607:14:1;;1600:22;1582:41;;1570:2;1555:18;17886:193:0;1442:187:1;17178:95:0;;;;;;;;;;-1:-1:-1;17258:7:0;;17178:95;;;1780:25:1;;;1768:2;1753:18;17178:95:0;1634:177:1;18087:521:0;;;;;;;;;;-1:-1:-1;18087:521:0;;;;;:::i;:::-;;:::i;32432:318::-;;;;;;;;;;-1:-1:-1;32432:318:0;;;;;:::i;:::-;;:::i;20036:319::-;;;;;;;;;;-1:-1:-1;20036:319:0;;;;;:::i;:::-;;:::i;17064:83::-;;;;;;;;;;-1:-1:-1;17064:83:0;;12344:1;2419:36:1;;2407:2;2392:18;17064:83:0;2277:184:1;32901:103:0;;;;;;;;;;;;;:::i;20710:473::-;;;;;;;;;;-1:-1:-1;20710:473:0;;;;;:::i;:::-;;:::i;18616:297::-;;;;;;;;;;-1:-1:-1;18616:297:0;;;;;:::i;:::-;;:::i;12831:33::-;;;;;;;;;;-1:-1:-1;12831:33:0;;;;-1:-1:-1;;;;;12831:33:0;;;21191:113;;;;;;;;;;-1:-1:-1;21191:113:0;;;;;:::i;:::-;;:::i;33446:179::-;;;;;;;;;;-1:-1:-1;33446:179:0;;;;;:::i;:::-;;:::i;19539:489::-;;;;;;;;;;-1:-1:-1;19539:489:0;;;;;:::i;:::-;;:::i;33637:154::-;;;;;;;;;;-1:-1:-1;33637:154:0;;;;;:::i;:::-;;:::i;13192:40::-;;;;;;;;;;-1:-1:-1;13192:40:0;;;;-1:-1:-1;;;13192:40:0;;;;;;20368:334;;;;;;;;;;-1:-1:-1;20368:334:0;;;;;:::i;:::-;;:::i;21434:124::-;;;;;;;;;;-1:-1:-1;21434:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;21523:27:0;21499:4;21523:27;;;:18;:27;;;;;;;;;21434:124;30781:157;;;;;;;;;;-1:-1:-1;30781:157:0;;;;;:::i;:::-;;:::i;12755:22::-;;;;;;;;;;;;;;;;21566:168;;;;;;;;;;-1:-1:-1;21566:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;21693:33:0;21664:4;21693:33;;;:24;:33;;;;;;;;;21566:168;17281:198;;;;;;;;;;-1:-1:-1;17281:198:0;;;;;:::i;:::-;;:::i;13846:327::-;;;;;;;;;;-1:-1:-1;13846:327:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13846:327:0;;;;;-1:-1:-1;;;13846:327:0;;;;;;;;;3912:4:1;3943:15;;;3925:34;;3995:15;;;3990:2;3975:18;;3968:43;4047:15;;;4027:18;;;4020:43;;;;4099:15;;;4094:2;4079:18;;4072:43;4152:15;;4146:3;4131:19;;4124:44;4205:15;;;4199:3;4184:19;;4177:44;3889:3;3874:19;13846:327:0;3639:588:1;869:94:0;;;;;;;;;;;;;:::i;13512:325::-;;;;;;;;;;-1:-1:-1;13512:325:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13512:325:0;;;;;-1:-1:-1;;;13512:325:0;;;;;12909:58;;;;;;;;;;-1:-1:-1;12909:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;12871:31;;;;;;;;;;-1:-1:-1;12871:31:0;;;;-1:-1:-1;;;;;12871:31:0;;;19411:120;;;;;;;;;;-1:-1:-1;19411:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;19503:20:0;19479:4;19503:20;;;:11;:20;;;;;;;;;19411:120;32807:88;;;;;;;;;;;;;:::i;637:87::-;;;;;;;;;;-1:-1:-1;683:7:0;710:6;-1:-1:-1;;;;;710:6:0;637:87;;33799:169;;;;;;;;;;-1:-1:-1;33799:169:0;;;;;:::i;:::-;;:::i;16969:87::-;;;;;;;;;;-1:-1:-1;17041:7:0;;;;;;;;;;;;-1:-1:-1;;;17041:7:0;;;;16969:87;;31068:375;;;;;;;;;;-1:-1:-1;31068:375:0;;;;;:::i;:::-;;:::i;30064:522::-;;;;;;;;;;-1:-1:-1;30064:522:0;;;;;:::i;:::-;;:::i;14346:36::-;;;;;;;;;;-1:-1:-1;14346:36:0;;;;;;;;;;;;;;;;5659:25:1;;;5715:2;5700:18;;5693:34;;;;5743:18;;;5736:34;5647:2;5632:18;14346:36:0;5457:319:1;18921:482:0;;;;;;;;;;-1:-1:-1;18921:482:0;;;;;:::i;:::-;;:::i;17487:199::-;;;;;;;;;;-1:-1:-1;17487:199:0;;;;;:::i;:::-;;:::i;12640:54::-;;;;;;;;;;;;;;;;21742:171;;;;;;;;;;-1:-1:-1;21742:171:0;;;;;:::i;:::-;;:::i;12786:38::-;;;;;;;;;;-1:-1:-1;12786:38:0;;;;-1:-1:-1;;;;;12786:38:0;;;13159:26;;;;;;;;;;-1:-1:-1;13159:26:0;;;;-1:-1:-1;;;;;13159:26:0;;;30946:114;;;;;;;;;;-1:-1:-1;30946:114:0;;;;;:::i;:::-;;:::i;13277:60::-;;;;;;;;;;;;;;;;33976:380;;;;;;;;;;-1:-1:-1;33976:380:0;;;;;:::i;:::-;;:::i;12578:54::-;;;;;;;;;;;;;;;;33049:326;;;;;;;;;;-1:-1:-1;33049:326:0;;;;;:::i;:::-;;:::i;12517:53::-;;;;;;;;;;;;;;;;31945:479;;;;;;;;;;-1:-1:-1;31945:479:0;;;;;:::i;:::-;;:::i;17694:184::-;;;;;;;;;;-1:-1:-1;17694:184:0;;;;;:::i;:::-;-1:-1:-1;;;;;17843:18:0;;;17811:7;17843:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17694:184;21314:112;;;;;;;;;;-1:-1:-1;21314:112:0;;;;;:::i;:::-;;:::i;31451:486::-;;;;;;;;;;-1:-1:-1;31451:486:0;;;;;:::i;:::-;;:::i;976:192::-;;;;;;;;;;-1:-1:-1;976:192:0;;;;;:::i;:::-;;:::i;12717:31::-;;;;;;;;;;;;;;;;13239;;;;;;;;;;-1:-1:-1;13239:31:0;;;;-1:-1:-1;;;13239:31:0;;;;;;30594:179;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;;;;;;;;;30752:13:::1;12344:1;30752:2;:13;:::i;:::-;30737:28;::::0;:12;:28:::1;:::i;:::-;30705:29;:60:::0;-1:-1:-1;30594:179:0:o;17886:193::-;17988:4;18010:39;201:10;18033:7;18042:6;18010:8;:39::i;:::-;-1:-1:-1;18067:4:0;17886:193;;;;;:::o;18087:521::-;18219:4;18236:36;18246:6;18254:9;18265:6;18236:9;:36::i;:::-;-1:-1:-1;;;;;18312:19:0;;18285:24;18312:19;;;:11;:19;;;;;;;;201:10;18312:33;;;;;;;;18378:26;;;;18356:116;;;;-1:-1:-1;;;18356:116:0;;9244:2:1;18356:116:0;;;9226:21:1;9283:2;9263:18;;;9256:30;9322:34;9302:18;;;9295:62;-1:-1:-1;;;9373:18:1;;;9366:38;9421:19;;18356:116:0;9042:404:1;18356:116:0;18508:57;18517:6;201:10;18558:6;18539:16;:25;18508:8;:57::i;:::-;-1:-1:-1;18596:4:0;;18087:521;-1:-1:-1;;;;18087:521:0:o;32432:318::-;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;32551:4:::1;32528:19;:27;;32519:84;;;::::0;-1:-1:-1;;;32519:84:0;;9653:2:1;32519:84:0::1;::::0;::::1;9635:21:1::0;9692:2;9672:18;;;9665:30;9731:34;9711:18;;;9704:62;-1:-1:-1;;;9782:18:1;;;9775:41;9833:19;;32519:84:0::1;9451:407:1::0;32519:84:0::1;32642:19;32632:7;;:29;;;;:::i;:::-;32614:15;:47:::0;;;32703:39:::1;::::0;1780:25:1;;;32703:39:0::1;::::0;1768:2:1;1753:18;32703:39:0::1;;;;;;;;32432:318:::0;:::o;20036:319::-;20130:7;20188;;20177;:18;;20155:110;;;;-1:-1:-1;;;20155:110:0;;10287:2:1;20155:110:0;;;10269:21:1;10326:2;10306:18;;;10299:30;10365:34;10345:18;;;10338:62;-1:-1:-1;;;10416:18:1;;;10409:40;10466:19;;20155:110:0;10085:406:1;20155:110:0;20276:19;20298:10;:8;:10::i;:::-;20276:32;-1:-1:-1;20326:21:0;20276:32;20326:7;:21;:::i;:::-;20319:28;20036:319;-1:-1:-1;;;20036:319:0:o;32901:103::-;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;32956:40:::1;32971:24;32989:4;32971:9;:24::i;:::-;32956:14;:40::i;:::-;32901:103::o:0;20710:473::-;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20790:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;20782:56;;;::::0;-1:-1:-1;;;20782:56:0;;10698:2:1;20782:56:0::1;::::0;::::1;10680:21:1::0;10737:2;10717:18;;;10710:30;10776:25;10756:18;;;10749:53;10819:18;;20782:56:0::1;10496:347:1::0;20782:56:0::1;20854:9;20849:327;20873:9;:16:::0;20869:20;::::1;20849:327;;;20931:7;-1:-1:-1::0;;;;;20915:23:0::1;:9;20925:1;20915:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;20915:12:0::1;:23:::0;20911:254:::1;;20974:9;20984:16:::0;;:20:::1;::::0;21003:1:::1;::::0;20984:20:::1;:::i;:::-;20974:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;20959:9:::1;:12:::0;;-1:-1:-1;;;;;20974:31:0;;::::1;::::0;20969:1;;20959:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;20959:46:0::1;-1:-1:-1::0;;;;;20959:46:0;;::::1;;::::0;;21024:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;21063:11:::1;:20:::0;;;;:28;;-1:-1:-1;;21063:28:0::1;::::0;;21110:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;21110:15:0;;;;;-1:-1:-1;;;;;;21110:15:0::1;::::0;;;;;20849:327:::1;20710:473:::0;:::o;20911:254::-:1;20891:3:::0;::::1;::::0;::::1;:::i;:::-;;;;20849:327;;;;20710:473:::0;:::o;18616:297::-;201:10;18731:4;18825:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;18825:34:0;;;;;;;;;;18731:4;;18753:130;;18803:7;;18825:47;;18862:10;;18825:47;:::i;:::-;18753:8;:130::i;21191:113::-;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21262:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;21262:34:0::1;21292:4;21262:34;::::0;;21191:113::o;33446:179::-;33537:9;33512:21;:34;;33504:71;;;;-1:-1:-1;;;33504:71:0;;11717:2:1;33504:71:0;;;11699:21:1;11756:2;11736:18;;;11729:30;11795:26;11775:18;;;11768:54;11839:18;;33504:71:0;11515:348:1;33504:71:0;33586:10;;:31;;-1:-1:-1;;;;;33586:10:0;33607:9;33586:20;:31::i;:::-;33446:179;:::o;19539:489::-;19657:7;19701;;19690;:18;;19682:62;;;;-1:-1:-1;;;19682:62:0;;12070:2:1;19682:62:0;;;12052:21:1;12109:2;12089:18;;;12082:30;12148:33;12128:18;;;12121:61;12199:18;;19682:62:0;11868:355:1;19682:62:0;19760:17;19755:266;;19794:28;19825:25;19836:7;19845:4;19825:10;:25::i;:::-;19872:9;;-1:-1:-1;19865:16:0;;-1:-1:-1;19865:16:0;19755:266;19914:28;19945:25;19956:7;19965:4;19945:10;:25::i;:::-;19992:17;;;;-1:-1:-1;19985:24:0;;-1:-1:-1;19985:24:0;33637:154;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;33742:41:::1;::::0;-1:-1:-1;;;33742:41:0;;-1:-1:-1;;;;;12420:32:1;;;33742:41:0::1;::::0;::::1;12402:51:1::0;12469:18;;;12462:34;;;33742:27:0;::::1;::::0;::::1;::::0;12375:18:1;;33742:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33637:154:::0;;;:::o;20368:334::-;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20451:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;20450:21;20442:61;;;::::0;-1:-1:-1;;;20442:61:0;;12959:2:1;20442:61:0::1;::::0;::::1;12941:21:1::0;12998:2;12978:18;;;12971:30;13037:29;13017:18;;;13010:57;13084:18;;20442:61:0::1;12757:351:1::0;20442:61:0::1;-1:-1:-1::0;;;;;20518:16:0;::::1;20537:1;20518:16:::0;;;:7:::1;:16;::::0;;;;;:20;20514:109:::1;;-1:-1:-1::0;;;;;20594:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;20574:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;20555:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;20514:109:::1;-1:-1:-1::0;;;;;20633:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;20633:27:0::1;20656:4;20633:27:::0;;::::1;::::0;;;20671:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;20671:23:0::1;::::0;;::::1;::::0;;20368:334::o;30781:157::-;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;30896:15:::1;:34:::0;;-1:-1:-1;;;;;;30896:34:0::1;-1:-1:-1::0;;;;;30896:34:0;;;::::1;::::0;;;::::1;::::0;;30781:157::o;17281:198::-;-1:-1:-1;;;;;17371:20:0;;17347:7;17371:20;;;:11;:20;;;;;;;;17367:49;;;-1:-1:-1;;;;;;17400:16:0;;;;;:7;:16;;;;;;;17281:198::o;17367:49::-;-1:-1:-1;;;;;17454:16:0;;;;;;:7;:16;;;;;;17434:37;;:19;:37::i;869:94::-;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;934:21:::1;952:1;934:9;:21::i;32807:88::-:0;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;32862:11:::1;:18:::0;;-1:-1:-1;;;;32862:18:0::1;-1:-1:-1::0;;;32862:18:0::1;::::0;;32807:88::o;33799:169::-;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33867:28:0::1;;::::0;;;:18:::1;:28;::::0;;;;;;;:35;;33898:4:::1;-1:-1:-1::0;;33867:35:0;;::::1;::::0;::::1;::::0;;;33913:24:::1;:34:::0;;;;;:41;;;;::::1;::::0;;::::1;::::0;;33799:169::o;31068:375::-;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;31235:8:::1;:19:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;31265:21:0;;;;;;;31235:19:::1;31265:21:::0;;::::1;;;-1:-1:-1::0;;31337:19:0;31297:29;;;::::1;;-1:-1:-1::0;;31337:19:0;;;;;::::1;;;-1:-1:-1::0;;31367:17:0::1;-1:-1:-1::0;;;31367:17:0;;::::1;::::0;;;::::1;;::::0;;;31413:16:::1;31337:19:::0;31297:29;31413:16:::1;:::i;:::-;:22;;;;:::i;:::-;31395:8;:40:::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;31395:40:0::1;-1:-1:-1::0;;;;31395:40:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;31068:375:0:o;30064:522::-;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30203:33:0;::::1;;::::0;;;:26:::1;:33;::::0;;;;;:42;::::1;;:33;::::0;;::::1;:42;;::::0;30181:148:::1;;;::::0;-1:-1:-1;;;30181:148:0;;13468:2:1;30181:148:0::1;::::0;::::1;13450:21:1::0;13507:2;13487:18;;;13480:30;13546:34;13526:18;;;13519:62;13617:26;13597:18;;;13590:54;13661:19;;30181:148:0::1;13266:420:1::0;30181:148:0::1;-1:-1:-1::0;;;;;30340:33:0;::::1;;::::0;;;:26:::1;:33;::::0;;;;:41;;-1:-1:-1;;30340:41:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;30392:130:::1;;-1:-1:-1::0;;;;;30418:31:0;::::1;;::::0;;;:24:::1;:31;::::0;;;;;;;;:38;;-1:-1:-1;;30418:38:0::1;30452:4;30418:38;::::0;;30476:34;;371:51:1;;;30476:34:0;::::1;;::::0;::::1;::::0;344:18:1;30476:34:0::1;;;;;;;30392:130;30537:41;::::0;;::::1;;::::0;-1:-1:-1;;;;;30537:41:0;::::1;::::0;::::1;::::0;;;::::1;30064:522:::0;;:::o;18921:482::-;201:10;19041:4;19090:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19090:34:0;;;;;;;;;;19157:35;;;;19135:122;;;;-1:-1:-1;;;19135:122:0;;13893:2:1;19135:122:0;;;13875:21:1;13932:2;13912:18;;;13905:30;13971:34;13951:18;;;13944:62;-1:-1:-1;;;14022:18:1;;;14015:35;14067:19;;19135:122:0;13691:401:1;19135:122:0;19293:67;201:10;19316:7;19344:15;19325:16;:34;19293:8;:67::i;:::-;-1:-1:-1;19391:4:0;;18921:482;-1:-1:-1;;;18921:482:0:o;17487:199::-;17592:4;17614:42;201:10;17638:9;17649:6;17614:9;:42::i;21742:171::-;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;21819:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;21819:32:0::1;-1:-1:-1::0;;;;21819:32:0;;::::1;;::::0;;21867:38:::1;::::0;::::1;::::0;::::1;::::0;21843:8;1607:14:1;1600:22;1582:41;;1570:2;1555:18;;1442:187;30946:114:0;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;31028:10:::1;:24:::0;;-1:-1:-1;;;;;;31028:24:0::1;-1:-1:-1::0;;;;;31028:24:0;;;::::1;::::0;;;::::1;::::0;;30946:114::o;33976:380::-;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34113:33:0;::::1;;::::0;;;:24:::1;:33;::::0;;;;;:45;::::1;;:33;::::0;;::::1;:45;;::::0;34091:145:::1;;;::::0;-1:-1:-1;;;34091:145:0;;14299:2:1;34091:145:0::1;::::0;::::1;14281:21:1::0;14338:2;14318:18;;;14311:30;14377:34;14357:18;;;14350:62;-1:-1:-1;;;14428:18:1;;;14421:48;14486:19;;34091:145:0::1;14097:414:1::0;34091:145:0::1;-1:-1:-1::0;;;;;34247:33:0;::::1;;::::0;;;:24:::1;:33;::::0;;;;;;;;:44;;-1:-1:-1;;34247:44:0::1;::::0;::::1;;::::0;;::::1;::::0;;;34309:39;;371:51:1;;;34247:44:0;;34309:39:::1;::::0;344:18:1;34309:39:0::1;;;;;;;33976:380:::0;;:::o;33049:326::-;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;33211:4:::1;33194:15;33169:24;33187:4;33169:9;:24::i;:::-;:40;;;;:::i;:::-;33168:47;;;;:::i;:::-;33153:12;:62:::0;;;33225:30:::1;::::0;:16:::1;:30::i;:::-;33266:8;:29:::0;;-1:-1:-1;;;;;;33266:29:0::1;-1:-1:-1::0;;;;;33266:29:0;::::1;::::0;;::::1;::::0;;;33312:21:::1;33306:3;:27:::0;;;33344:23:::1;::::0;33266:29;33344:18:::1;:23::i;31945:479::-:0;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;32122:4:::1;32099:19;:27;;32090:83;;;::::0;-1:-1:-1;;;32090:83:0;;14718:2:1;32090:83:0::1;::::0;::::1;14700:21:1::0;14757:2;14737:18;;;14730:30;14796:34;14776:18;;;14769:62;-1:-1:-1;;;14847:18:1;;;14840:40;14897:19;;32090:83:0::1;14516:406:1::0;32090:83:0::1;32211:18;32201:7;;:28;;;;:::i;:::-;32184:14;:45:::0;32331:7:::1;::::0;:29:::1;::::0;32341:19;;32331:29:::1;:::i;:::-;32313:15;:47:::0;-1:-1:-1;;31945:479:0:o;21314:112::-;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21383:27:0::1;21413:5;21383:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;21383:35:0::1;::::0;;21314:112::o;31451:486::-;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;31670:2:::1;31663:3:::0;31656:4;31644:9;31629:12:::1;31636:5:::0;31629:4;:12:::1;:::i;:::-;:24;;;;:::i;:::-;:31;;;;:::i;:::-;:37;;;;:::i;:::-;:43;;;;31619:93;;;::::0;-1:-1:-1;;;31619:93:0;;15129:2:1;31619:93:0::1;::::0;::::1;15111:21:1::0;15168:2;15148:18;;;15141:30;15207:34;15187:18;;;15180:62;-1:-1:-1;;;15258:18:1;;;15251:32;15300:19;;31619:93:0::1;14927:398:1::0;31619:93:0::1;31723:9;:20:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;31754:22:0;;;;;;;31723:20:::1;31754:22:::0;;::::1;;;-1:-1:-1::0;;31828:20:0;31787:30;;;::::1;;-1:-1:-1::0;;31828:20:0;;;;;::::1;;;-1:-1:-1::0;;31859:18:0::1;-1:-1:-1::0;;;31859:18:0;;::::1;::::0;;;::::1;;::::0;;;31907:16:::1;31828:20:::0;31787:30;31907:16:::1;:::i;:::-;:22;;;;:::i;:::-;31888:9;:41:::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;31888:41:0::1;-1:-1:-1::0;;;;31888:41:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;31451:486:0:o;976:192::-;683:7;710:6;-1:-1:-1;;;;;710:6:0;201:10;777:23;769:68;;;;-1:-1:-1;;;769:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1065:22:0;::::1;1057:73;;;::::0;-1:-1:-1;;;1057:73:0;;15532:2:1;1057:73:0::1;::::0;::::1;15514:21:1::0;15571:2;15551:18;;;15544:30;15610:34;15590:18;;;15583:62;-1:-1:-1;;;15661:18:1;;;15654:36;15707:19;;1057:73:0::1;15330:402:1::0;1057:73:0::1;1141:19;1151:8;1141:9;:19::i;24895:369::-:0;-1:-1:-1;;;;;25022:19:0;;25014:68;;;;-1:-1:-1;;;25014:68:0;;15939:2:1;25014:68:0;;;15921:21:1;15978:2;15958:18;;;15951:30;16017:34;15997:18;;;15990:62;-1:-1:-1;;;16068:18:1;;;16061:34;16112:19;;25014:68:0;15737:400:1;25014:68:0;-1:-1:-1;;;;;25101:21:0;;25093:68;;;;-1:-1:-1;;;25093:68:0;;16344:2:1;25093:68:0;;;16326:21:1;16383:2;16363:18;;;16356:30;16422:34;16402:18;;;16395:62;-1:-1:-1;;;16473:18:1;;;16466:32;16515:19;;25093:68:0;16142:398:1;25093:68:0;-1:-1:-1;;;;;25172:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;25224:32;;1780:25:1;;;25224:32:0;;1753:18:1;25224:32:0;;;;;;;24895:369;;;:::o;25272:1151::-;-1:-1:-1;;;;;25413:24:0;;25396:12;25413:24;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;25441:22:0;;;;;;:18;:22;;;;;;;;25413:50;25411:53;25396:68;;25481:7;25477:563;;;-1:-1:-1;;;;;25536:32:0;;;;;;:26;:32;;;;;;;;25532:497;;;25622:8;25607:23;:12;:23;;;;;;-1:-1:-1;;25607:23:0;;;;;;;;;;;;;;;-1:-1:-1;;25607:23:0;;;;;;;;-1:-1:-1;;25607:23:0;;;;;;;;;;-1:-1:-1;;25607:23:0;-1:-1:-1;;;25607:23:0;;;;;;-1:-1:-1;;;;25607:23:0;;-1:-1:-1;;;25607:23:0;;;;;;;;;;;;;;;;;25689:14;;25679:24;;;25649:130;;;;-1:-1:-1;;;25649:130:0;;16747:2:1;25649:130:0;;;16729:21:1;;;16766:18;;;16759:30;16825:34;16805:18;;;16798:62;16877:18;;25649:130:0;16545:356:1;25649:130:0;25532:497;;;25853:9;25838:24;:12;:24;;;;;;-1:-1:-1;;25838:24:0;;;;;;;;;;;;;;;-1:-1:-1;;25838:24:0;;;;;;;;-1:-1:-1;;25838:24:0;;;;;;;;;;-1:-1:-1;;25838:24:0;-1:-1:-1;;;25838:24:0;;;;;;-1:-1:-1;;;;25838:24:0;;-1:-1:-1;;;25838:24:0;;;;;;;;;;;;;;;;;25921:15;;25911:25;;;25881:132;;;;-1:-1:-1;;;25881:132:0;;17108:2:1;25881:132:0;;;17090:21:1;17147:2;17127:18;;;17120:30;17186:34;17166:18;;;17159:62;-1:-1:-1;;;17237:18:1;;;17230:31;17278:19;;25881:132:0;16906:397:1;25881:132:0;26098:29;;26070:24;26088:4;26070:9;:24::i;:::-;:57;;:91;;;;-1:-1:-1;26145:16:0;;;;26144:17;26070:91;:141;;;;-1:-1:-1;;;;;;26179:32:0;;;;;;:26;:32;;;;;;;;26178:33;26070:141;:179;;;;-1:-1:-1;26228:21:0;;-1:-1:-1;;;26228:21:0;;;;26070:179;26052:310;;;26305:45;26320:29;;26305:14;:45::i;:::-;26374:41;26389:4;26395:2;26399:6;26407:7;26374:14;:41::i;24140:161::-;24182:7;24203:15;24220;24239:19;:17;:19::i;:::-;24202:56;;-1:-1:-1;24202:56:0;-1:-1:-1;24276:17:0;24202:56;;24276:17;:::i;:::-;24269:24;;;;24140:161;:::o;27731:1212::-;15290:16;:23;;-1:-1:-1;;15290:23:0;15309:4;15290:23;;;27838:12:::1;:19:::0;15290:16;;27838:23:::1;::::0;-1:-1:-1;;;27838:19:0;::::1;15290:23:::0;27838:19:::1;27860:1;27838:23;:::i;:::-;27944:12;:15:::0;27816:45:::1;::::0;;::::1;::::0;-1:-1:-1;27872:32:0::1;::::0;27816:45;;27908:51:::1;::::0;-1:-1:-1;;;27944:15:0;;::::1;;27908:20:::0;:51:::1;:::i;:::-;27907:67;;;;:::i;:::-;27872:102:::0;-1:-1:-1;27987:14:0::1;28004:47;27872:102:::0;28004:20;:47:::1;:::i;:::-;27987:64:::0;-1:-1:-1;28089:21:0::1;28161:24;27987:64:::0;28161:16:::1;:24::i;:::-;28198:20;28221:38;28245:14:::0;28221:21:::1;:38;:::i;:::-;28365:12;:15:::0;28198:61;;-1:-1:-1;28270:29:0::1;::::0;28351::::1;::::0;-1:-1:-1;;;28365:15:0;::::1;;;28351:11:::0;:29:::1;:::i;:::-;28318:12;:15:::0;28303:30:::1;::::0;-1:-1:-1;;;28318:15:0;::::1;;;28303:12:::0;:30:::1;:::i;:::-;28302:79;;;;:::i;:::-;28270:111;;28420:61;28433:24;28459:21;28420:12;:61::i;:::-;28702:12;:16:::0;28585:21:::1;::::0;28558:24:::1;::::0;28688:30:::1;::::0;28702:16;;::::1;;;28688:11:::0;:30:::1;:::i;:::-;28654:12;:16:::0;28635:35:::1;::::0;28654:16;;::::1;;;28635::::0;:35:::1;:::i;:::-;28634:85;;;;:::i;:::-;28825:12;:21:::0;28617:102;;-1:-1:-1;28730:19:0::1;::::0;28811:35:::1;::::0;28825:21;;::::1;;;28811:11:::0;:35:::1;:::i;:::-;28772:12;:21:::0;28753:40:::1;::::0;28772:21;;::::1;;;28753:16:::0;:40:::1;:::i;:::-;28752:95;;;;:::i;:::-;28858:10;::::0;28730:117;;-1:-1:-1;28858:28:0::1;::::0;-1:-1:-1;;;;;28858:10:0::1;28879:6:::0;28858:20:::1;:28::i;:::-;28897:15;::::0;:38:::1;::::0;-1:-1:-1;;;;;28897:15:0::1;28923:11:::0;28897:25:::1;:38::i;:::-;-1:-1:-1::0;;15336:16:0;:24;;-1:-1:-1;;15336:24:0;;;-1:-1:-1;;;;;;;;27731:1212:0:o;8276:317::-;8391:6;8366:21;:31;;8358:73;;;;-1:-1:-1;;;8358:73:0;;17740:2:1;8358:73:0;;;17722:21:1;17779:2;17759:18;;;17752:30;17818:31;17798:18;;;17791:59;17867:18;;8358:73:0;17538:353:1;8358:73:0;8445:12;8463:9;-1:-1:-1;;;;;8463:14:0;8485:6;8463:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8444:52;;;8515:7;8507:78;;;;-1:-1:-1;;;8507:78:0;;18308:2:1;8507:78:0;;;18290:21:1;18347:2;18327:18;;;18320:30;18386:34;18366:18;;;18359:62;18457:28;18437:18;;;18430:56;18503:19;;8507:78:0;18106:422:1;8507:78:0;8347:246;8276:317;;:::o;22391:470::-;22491:36;;:::i;:::-;22557:29;22569:7;22578;22557:11;:29::i;:::-;22545:41;;22774:52;22786:9;22797:7;22806;22815:10;:8;:10::i;:::-;22774:11;:52::i;:::-;22743:17;;;22597:229;22713:15;;;22597:229;22684:14;;;22597:229;22644:25;;;22597:229;;;22391:470;;;;:::o;1176:173::-;1232:16;1251:6;;-1:-1:-1;;;;;1268:17:0;;;-1:-1:-1;;;;;;1268:17:0;;;;;;1301:40;;1251:6;;;;;;;1301:40;;1232:16;1301:40;1221:128;1176:173;:::o;28951:669::-;29085:16;;;29099:1;29085:16;;;;;;;;29061:21;;29085:16;;;;;;;;;;-1:-1:-1;29085:16:0;29061:40;;29130:4;29112;29117:1;29112:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;29112:23:0;;;-1:-1:-1;;;;;29112:23:0;;;;;29156:15;;;;;;;;;-1:-1:-1;;;;;29156:15:0;-1:-1:-1;;;;;29156:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29146:4;29151:1;29146:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29146:32:0;;;:7;;;;;;;;;;:32;;;;29228:15;;29213:4;17811:7;17843:18;;;:11;:18;;;;;;29228:15;;;;;;;17843:27;;;;;;29248:11;-1:-1:-1;29191:159:0;;;29308:15;;29276:62;;29293:4;;29308:15;;;-1:-1:-1;;;;;29308:15:0;-1:-1:-1;;29276:8:0;:62::i;:::-;29388:15;;:224;;-1:-1:-1;;;29388:224:0;;:15;;;;-1:-1:-1;;;;;29388:15:0;;:66;;:224;;29469:11;;29495:1;;29539:4;;29566;;29586:15;;29388:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29006:614;28951:669;:::o;26504:1219::-;26656:28;26687;26698:7;26707;26687:10;:28::i;:::-;-1:-1:-1;;;;;26732:19:0;;;;;;:11;:19;;;;;;26656:59;;-1:-1:-1;26732:19:0;;26728:78;;;-1:-1:-1;;;;;26768:15:0;;;;;;:7;:15;;;;;:26;;26787:7;;26768:15;:26;;26787:7;;26768:26;:::i;:::-;;;;-1:-1:-1;;26728:78:0;-1:-1:-1;;;;;26820:22:0;;;;;;:11;:22;;;;;;;;26816:94;;;26881:17;;;;-1:-1:-1;;;;;26859:18:0;;;;;;:7;:18;;;;;:39;;:18;;;:39;;26881:17;;26859:39;:::i;:::-;;;;-1:-1:-1;;26816:94:0;26941:9;;-1:-1:-1;;;;;26922:15:0;;26941:9;26922:15;;;:7;:15;;;;;:28;;:15;;26941:9;26922:28;;26941:9;;26922:28;:::i;:::-;;;;-1:-1:-1;;26983:17:0;;;;;-1:-1:-1;;;;;26961:18:0;;;;;;:7;:18;;;;;;:39;;26983:17;;26961:18;;:39;;26983:17;;26961:39;:::i;:::-;;;;-1:-1:-1;;27011:284:0;;;;27075:1;:7;;;27064;;:18;;;;;;;:::i;:::-;;;;;-1:-1:-1;27054:7:0;:28;-1:-1:-1;27122:7:0;;;;27111;:18;;:7;;:18;;27122:7;;27111:18;:::i;:::-;;;;;-1:-1:-1;27101:7:0;:28;-1:-1:-1;27158:6:0;;;;27166;;;;27146:27;;27158:6;27146:11;:27::i;:::-;27188:33;27200:1;:9;;;27211:1;:9;;;27188:11;:33::i;:::-;27266:4;-1:-1:-1;;;;;27241:42:0;27250:6;-1:-1:-1;;;;;27241:42:0;;27273:1;:9;;;27241:42;;;;1780:25:1;;1768:2;1753:18;;1634:177;27241:42:0;;;;;;;;27011:284;-1:-1:-1;;;;;27311:26:0;;;;;;:18;:26;;;;;;;;27310:27;:61;;;;-1:-1:-1;;;;;;27342:29:0;;;;;;:18;:29;;;;;;;;27341:30;27310:61;27305:141;;;27396:11;;-1:-1:-1;;;27396:11:0;;;;27388:46;;;;-1:-1:-1;;;27388:46:0;;20108:2:1;27388:46:0;;;20090:21:1;20147:2;20127:18;;;20120:30;20186:25;20166:18;;;20159:53;20229:18;;27388:46:0;19906:347:1;27388:46:0;-1:-1:-1;;;;;27480:35:0;;;;;;:24;:35;;;;;;;;;:98;;;27563:15;;27539:20;27549:9;27539;:20::i;:::-;:39;;27480:98;27458:195;;;;-1:-1:-1;;;27458:195:0;;20460:2:1;27458:195:0;;;20442:21:1;20499:2;20479:18;;;20472:30;20538:34;20518:18;;;20511:62;-1:-1:-1;;;20589:18:1;;;20582:45;20644:19;;27458:195:0;20258:411:1;27458:195:0;27686:9;-1:-1:-1;;;;;27669:46:0;27678:6;-1:-1:-1;;;;;27669:46:0;;27697:1;:17;;;27669:46;;;;1780:25:1;;1768:2;1753:18;;1634:177;27669:46:0;;;;;;;;26645:1078;26504:1219;;;;:::o;24309:578::-;24407:7;;24443;;24360;;;;;24461:314;24485:9;:16;24481:20;;24461:314;;;24569:7;24545;:21;24553:9;24563:1;24553:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;24553:12:0;24545:21;;;;;;;;;;;;;:31;;:83;;;24621:7;24597;:21;24605:9;24615:1;24605:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;24605:12:0;24597:21;;;;;;;;;;;;;:31;24545:83;24523:146;;;24652:7;;24661;;24644:25;;;;;;;24309:578;;:::o;24523:146::-;24695:7;:21;24703:9;24713:1;24703:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;24703:12:0;24695:21;;;;;;;;;;;;;24684:32;;;;:::i;:::-;;;24742:7;:21;24750:9;24760:1;24750:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;24750:12:0;24742:21;;;;;;;;;;;;;24731:32;;;;:::i;:::-;;-1:-1:-1;24503:3:0;;;;:::i;:::-;;;;24461:314;;;;24809:7;;24799;;:17;;;;:::i;:::-;24789:7;:27;24785:58;;;24826:7;;24835;;24818:25;;;;;;24309:578;;:::o;24785:58::-;24862:7;;24871;;-1:-1:-1;24309:578:0;-1:-1:-1;24309:578:0:o;29628:428::-;29739:15;;29943:10;;29739:255;;-1:-1:-1;;;29739:255:0;;29811:4;29739:255;;;21023:34:1;21073:18;;;21066:34;;;29857:1:0;21116:18:1;;;21109:34;;;21159:18;;;21152:34;-1:-1:-1;;;;;29943:10:0;;;21202:19:1;;;21195:44;29968:15:0;21255:19:1;;;21248:35;29739:15:0;;;;;;:31;;29778:9;;20957:19:1;;29739:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;30010:38:0;;;21779:25:1;;;21835:2;21820:18;;21813:34;;;30010:38:0;;-1:-1:-1;21752:18:1;30010:38:0;;;;;;;29628:428;;:::o;22869:503::-;22970:28;;:::i;:::-;23021:7;23016:91;;23045:17;;;:27;;;23087:8;;23016:91;23137:12;:16;23157:3;;23127:26;;23137:16;;23127:7;:26;:::i;:::-;23126:34;;;;:::i;:::-;23117:6;;;:43;23192:12;:17;23213:3;;23182:27;;23192:17;;;;;23182:7;:27;:::i;:::-;23181:35;;;;:::i;:::-;23171:7;;;:45;23250:12;:19;23273:3;;23240:29;;-1:-1:-1;;;23250:19:0;;;;23240:7;:29;:::i;:::-;23239:37;;;;:::i;:::-;23227:9;;;:49;;;23326:7;;;;23317:6;;;;23307:16;;:7;:16;:::i;:::-;:26;;;;:::i;:::-;:38;;;;:::i;:::-;23287:17;;;:58;22869:503;;;;:::o;23380:752::-;23589:15;;;;;23765:21;23775:11;23765:7;:21;:::i;:::-;23755:31;;23804:7;23799:75;;-1:-1:-1;23836:7:0;;-1:-1:-1;23854:1:0;;-1:-1:-1;23854:1:0;;-1:-1:-1;23854:1:0;23828:34;;23799:75;23902:11;23893:1;:6;;;:20;;;;:::i;:::-;23886:27;;23942:11;23932:1;:7;;;:21;;;;:::i;:::-;23924:29;;23986:11;23974:1;:9;;;:23;;;;:::i;:::-;23964:33;-1:-1:-1;23964:33:0;24043:5;24026:14;24036:4;24026:7;:14;:::i;:::-;:22;;;;:::i;:::-;:32;;;;:::i;:::-;24008:50;-1:-1:-1;24103:5:0;;24110:4;23380:752;;;;;;;;;;:::o;22019:125::-;22098:4;22087:7;;:15;;;;;;;:::i;:::-;;;;-1:-1:-1;;22113:11:0;:23;;22132:4;;22113:11;:15;;:23;;22132:4;;22113:23;:::i;:::-;;;;-1:-1:-1;;;;22019:125:0:o;22152:231::-;22242:4;22226:22;;;;:7;:22;;;;;:33;;22252:7;;22226:22;:33;;22252:7;;22226:33;:::i;:::-;;;;-1:-1:-1;;22294:4:0;22274:26;;;;:11;:26;;;;;;;;22270:65;;;22318:4;22302:22;;;;:7;:22;;;;;:33;;22328:7;;22302:22;:33;;22328:7;;22302:33;:::i;:::-;;;;-1:-1:-1;;22270:65:0;22368:7;22346:11;:18;;;:29;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;433:548::-;545:4;574:2;603;592:9;585:21;635:6;629:13;678:6;673:2;662:9;658:18;651:34;703:1;713:140;727:6;724:1;721:13;713:140;;;822:14;;;818:23;;812:30;788:17;;;807:2;784:26;777:66;742:10;;713:140;;;717:3;902:1;897:2;888:6;877:9;873:22;869:31;862:42;972:2;965;961:7;956:2;948:6;944:15;940:29;929:9;925:45;921:54;913:62;;;;433:548;;;;:::o;986:131::-;-1:-1:-1;;;;;1061:31:1;;1051:42;;1041:70;;1107:1;1104;1097:12;1122:315;1190:6;1198;1251:2;1239:9;1230:7;1226:23;1222:32;1219:52;;;1267:1;1264;1257:12;1219:52;1306:9;1293:23;1325:31;1350:5;1325:31;:::i;:::-;1375:5;1427:2;1412:18;;;;1399:32;;-1:-1:-1;;;1122:315:1:o;1816:456::-;1893:6;1901;1909;1962:2;1950:9;1941:7;1937:23;1933:32;1930:52;;;1978:1;1975;1968:12;1930:52;2017:9;2004:23;2036:31;2061:5;2036:31;:::i;:::-;2086:5;-1:-1:-1;2143:2:1;2128:18;;2115:32;2156:33;2115:32;2156:33;:::i;:::-;1816:456;;2208:7;;-1:-1:-1;;;2262:2:1;2247:18;;;;2234:32;;1816:456::o;2466:247::-;2525:6;2578:2;2566:9;2557:7;2553:23;2549:32;2546:52;;;2594:1;2591;2584:12;2546:52;2633:9;2620:23;2652:31;2677:5;2652:31;:::i;2942:118::-;3028:5;3021:13;3014:21;3007:5;3004:32;2994:60;;3050:1;3047;3040:12;3065:309;3130:6;3138;3191:2;3179:9;3170:7;3166:23;3162:32;3159:52;;;3207:1;3204;3197:12;3159:52;3243:9;3230:23;3220:33;;3303:2;3292:9;3288:18;3275:32;3316:28;3338:5;3316:28;:::i;:::-;3363:5;3353:15;;;3065:309;;;;;:::o;4440:156::-;4506:20;;4566:4;4555:16;;4545:27;;4535:55;;4586:1;4583;4576:12;4535:55;4440:156;;;:::o;4601:464::-;4686:6;4694;4702;4710;4718;4771:3;4759:9;4750:7;4746:23;4742:33;4739:53;;;4788:1;4785;4778:12;4739:53;4811:27;4828:9;4811:27;:::i;:::-;4801:37;;4857:36;4889:2;4878:9;4874:18;4857:36;:::i;:::-;4847:46;;4912:36;4944:2;4933:9;4929:18;4912:36;:::i;:::-;4902:46;;4967:36;4999:2;4988:9;4984:18;4967:36;:::i;:::-;4957:46;;5022:37;5054:3;5043:9;5039:19;5022:37;:::i;:::-;5012:47;;4601:464;;;;;;;;:::o;5070:382::-;5135:6;5143;5196:2;5184:9;5175:7;5171:23;5167:32;5164:52;;;5212:1;5209;5202:12;5164:52;5251:9;5238:23;5270:31;5295:5;5270:31;:::i;:::-;5320:5;-1:-1:-1;5377:2:1;5362:18;;5349:32;5390:30;5349:32;5390:30;:::i;5781:241::-;5837:6;5890:2;5878:9;5869:7;5865:23;5861:32;5858:52;;;5906:1;5903;5896:12;5858:52;5945:9;5932:23;5964:28;5986:5;5964:28;:::i;6027:315::-;6095:6;6103;6156:2;6144:9;6135:7;6131:23;6127:32;6124:52;;;6172:1;6169;6162:12;6124:52;6208:9;6195:23;6185:33;;6268:2;6257:9;6253:18;6240:32;6281:31;6306:5;6281:31;:::i;6347:248::-;6415:6;6423;6476:2;6464:9;6455:7;6451:23;6447:32;6444:52;;;6492:1;6489;6482:12;6444:52;-1:-1:-1;;6515:23:1;;;6585:2;6570:18;;;6557:32;;-1:-1:-1;6347:248:1:o;6600:388::-;6668:6;6676;6729:2;6717:9;6708:7;6704:23;6700:32;6697:52;;;6745:1;6742;6735:12;6697:52;6784:9;6771:23;6803:31;6828:5;6803:31;:::i;:::-;6853:5;-1:-1:-1;6910:2:1;6895:18;;6882:32;6923:33;6882:32;6923:33;:::i;6993:356::-;7195:2;7177:21;;;7214:18;;;7207:30;7273:34;7268:2;7253:18;;7246:62;7340:2;7325:18;;6993:356::o;7354:127::-;7415:10;7410:3;7406:20;7403:1;7396:31;7446:4;7443:1;7436:15;7470:4;7467:1;7460:15;7486:422;7575:1;7618:5;7575:1;7632:270;7653:7;7643:8;7640:21;7632:270;;;7712:4;7708:1;7704:6;7700:17;7694:4;7691:27;7688:53;;;7721:18;;:::i;:::-;7771:7;7761:8;7757:22;7754:55;;;7791:16;;;;7754:55;7870:22;;;;7830:15;;;;7632:270;;;7636:3;7486:422;;;;;:::o;7913:806::-;7962:5;7992:8;7982:80;;-1:-1:-1;8033:1:1;8047:5;;7982:80;8081:4;8071:76;;-1:-1:-1;8118:1:1;8132:5;;8071:76;8163:4;8181:1;8176:59;;;;8249:1;8244:130;;;;8156:218;;8176:59;8206:1;8197:10;;8220:5;;;8244:130;8281:3;8271:8;8268:17;8265:43;;;8288:18;;:::i;:::-;-1:-1:-1;;8344:1:1;8330:16;;8359:5;;8156:218;;8458:2;8448:8;8445:16;8439:3;8433:4;8430:13;8426:36;8420:2;8410:8;8407:16;8402:2;8396:4;8393:12;8389:35;8386:77;8383:159;;;-1:-1:-1;8495:19:1;;;8527:5;;8383:159;8574:34;8599:8;8593:4;8574:34;:::i;:::-;8644:6;8640:1;8636:6;8632:19;8623:7;8620:32;8617:58;;;8655:18;;:::i;:::-;8693:20;;7913:806;-1:-1:-1;;;7913:806:1:o;8724:140::-;8782:5;8811:47;8852:4;8842:8;8838:19;8832:4;8811:47;:::i;8869:168::-;8942:9;;;8973;;8990:15;;;8984:22;;8970:37;8960:71;;9011:18;;:::i;9863:217::-;9903:1;9929;9919:132;;9973:10;9968:3;9964:20;9961:1;9954:31;10008:4;10005:1;9998:15;10036:4;10033:1;10026:15;9919:132;-1:-1:-1;10065:9:1;;9863:217::o;10848:127::-;10909:10;10904:3;10900:20;10897:1;10890:31;10940:4;10937:1;10930:15;10964:4;10961:1;10954:15;10980:128;11047:9;;;11068:11;;;11065:37;;;11082:18;;:::i;11113:127::-;11174:10;11169:3;11165:20;11162:1;11155:31;11205:4;11202:1;11195:15;11229:4;11226:1;11219:15;11245:135;11284:3;11305:17;;;11302:43;;11325:18;;:::i;:::-;-1:-1:-1;11372:1:1;11361:13;;11245:135::o;11385:125::-;11450:9;;;11471:10;;;11468:36;;;11484:18;;:::i;12507:245::-;12574:6;12627:2;12615:9;12606:7;12602:23;12598:32;12595:52;;;12643:1;12640;12633:12;12595:52;12675:9;12669:16;12694:28;12716:5;12694:28;:::i;13113:148::-;13201:4;13180:12;;;13194;;;13176:31;;13219:13;;13216:39;;;13235:18;;:::i;17308:225::-;17412:4;17391:12;;;17405;;;17387:31;17438:22;;;;17479:24;;;17469:58;;17507:18;;:::i;:::-;17469:58;17308:225;;;;:::o;18665:251::-;18735:6;18788:2;18776:9;18767:7;18763:23;18759:32;18756:52;;;18804:1;18801;18794:12;18756:52;18836:9;18830:16;18855:31;18880:5;18855:31;:::i;18921:980::-;19183:4;19231:3;19220:9;19216:19;19262:6;19251:9;19244:25;19288:2;19326:6;19321:2;19310:9;19306:18;19299:34;19369:3;19364:2;19353:9;19349:18;19342:31;19393:6;19428;19422:13;19459:6;19451;19444:22;19497:3;19486:9;19482:19;19475:26;;19536:2;19528:6;19524:15;19510:29;;19557:1;19567:195;19581:6;19578:1;19575:13;19567:195;;;19646:13;;-1:-1:-1;;;;;19642:39:1;19630:52;;19737:15;;;;19702:12;;;;19678:1;19596:9;19567:195;;;-1:-1:-1;;;;;;;19818:32:1;;;;19813:2;19798:18;;19791:60;-1:-1:-1;;;19882:3:1;19867:19;19860:35;19779:3;18921:980;-1:-1:-1;;;18921:980:1:o;21294:306::-;21382:6;21390;21398;21451:2;21439:9;21430:7;21426:23;21422:32;21419:52;;;21467:1;21464;21457:12;21419:52;21496:9;21490:16;21480:26;;21546:2;21535:9;21531:18;21525:25;21515:35;;21590:2;21579:9;21575:18;21569:25;21559:35;;21294:306;;;;;:::o

Swarm Source

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