ETH Price: $2,645.54 (+8.29%)
 

Overview

Max Total Supply

1,000,000 oBOBO

Holders

46

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
19,204.734408433869337032 oBOBO

Value
$0.00
0x5af6c5f984416d54e297967cc5c4b7d0428111f1
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:
OrdinalBOBO

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
/**
Ordinal Bobo - oBOBO

      ___   ___   ___   ___  
 ___ | _ ) / _ \ | _ ) / _ \ 
/ _ \| _ \| (_) || _ \| (_) |
\___/|___/ \___/ |___/ \___/ 

Website: https://obobo.live
Telegram: https://t.me/obobobtc
Twitter: https://twitter.com/obobobtc
*/

pragma solidity 0.8.16;

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

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

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

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

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

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

        return c;
    }

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

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

library Address {
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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"
        );
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: weiValue}(
            data
        );
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    uint256 private _lockTime;

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

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

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

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

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

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

    function getUnlockTime() public view returns (uint256) {
        return _lockTime;
    }

    function getTime() public view returns (uint256) {
        return block.timestamp;
    }
}


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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}


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

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contract OrdinalBOBO is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    address payable public marketingAddress;
    address payable public rewardAddress;
    address payable public liquidityAddress;

    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;
    address[] private _excluded;

    uint256 private constant MAX = ~uint256(0);
    uint256 private constant _tTotal = 1 * 1e6 * 1e18;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string private constant _name = "Ordinal BOBO";
    string private constant _symbol = "oBOBO";
    uint8 private constant _decimals = 18;

    
    uint256 private _taxFee;
    uint256 private _previousTaxFee = _taxFee;

    uint256 private _liquidityFee;
    uint256 private _previousLiquidityFee = _liquidityFee;

    uint256 private constant BUY = 1;
    uint256 private constant SELL = 2;
    uint256 private constant TRANSFER = 3;
    uint256 private buyOrSellSwitch;

    uint256 public _buyTaxFee;
    uint256 public _buyLiquidityFee = 0;
    uint256 public _buyRewardFee;
    uint256 public _buyMarketingFee = 0;

    uint256 public _sellTaxFee;
    uint256 public _sellLiquidityFee = 0;
    uint256 public _sellRewardFee;
    uint256 public _sellMarketingFee = 0;

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

    mapping (address => bool) public _isExcludedMaxTransactionAmount;

    mapping(address => uint256) private _holderLastTransferTimestamp;
    bool public transferDelayEnabled = false;

    uint256 private _liquidityTokensToSwap;
    uint256 private _rewardTokens;
    uint256 private _marketingTokensToSwap;

    bool private gasLimitActive = false;
    uint256 private gasPriceLimit = 600 * 1 gwei;

    mapping (address => bool) public automatedMarketMakerPairs;

    uint256 public minimumTokensBeforeSwap;
    uint256 public maxTransactionAmount;
    uint256 public maxWallet;

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = false;

    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    event SwapETHForTokens(uint256 amountIn, address[] path);

    event SwapTokensForETH(uint256 amountIn, address[] path);

    event ExcludedMaxTransactionAmount(address indexed account, bool isExcluded);

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

    constructor() {
        maxTransactionAmount = _tTotal * 2 / 100; // 2% max txn
        minimumTokensBeforeSwap = _tTotal * 5 / 10000; // 0.05%
        maxWallet = _tTotal * 2 / 100; // 2%

        _rOwned[msg.sender] = _rTotal;

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );

        liquidityAddress = payable(msg.sender);
        marketingAddress = payable(msg.sender);
        rewardAddress = payable(msg.sender);

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

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        _isExcludedFromFee[msg.sender] = true;
        _isExcludedFromFee[address(this)] = true;

        excludeFromMaxTransaction(msg.sender, true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        excludeFromMaxTransaction(address(0xdead), true);

        emit Transfer(address(0), msg.sender, _tTotal);
    }

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

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

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

    function totalSupply() external pure 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)
        external
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender)
        external
        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
    ) external override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    function totalFees() external view returns (uint256) {
        return _tFeeTotal;
    }

    // once enabled, can never be turned off
    function openTrading() external onlyOwner {
        tradingActive = true;
        swapAndLiquifyEnabled = true;
    }

    function minimumTokensBeforeSwapAmount() external view returns (uint256) {
        return minimumTokensBeforeSwap;
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

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

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee)
        external
        view
        returns (uint256)
    {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount, , , , , ) = _getValues(tAmount);
            return rAmount;
        } else {
            (, uint256 rTransferAmount, , , , ) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    // remove limits after token is stable - 30-60 minutes
    function removeLimits() external onlyOwner returns (bool){
        limitsInEffect = false;
        gasLimitActive = false;
        transferDelayEnabled = false;
        return true;
    }

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

    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
        emit ExcludedMaxTransactionAmount(updAds, isEx);
    }

    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 {
        require(to != address(0) && from != address(0), "ERC20: transfer from the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        if(limitsInEffect){
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !inSwapAndLiquify
            ){
                // When trading is not active
                require(tradingActive, "Trading is not active yet");

                // only use to prevent sniper buys in the first blocks.
                if (gasLimitActive && automatedMarketMakerPairs[from]) {
                    require(tx.gasprice <= gasPriceLimit, "Gas price exceeds limit.");
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.
                if (transferDelayEnabled){
                    if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }

                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                    require(amount + balanceOf(to) <= maxWallet, "Cannot exceed max wallet");
                }
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if (!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWallet, "Cannot exceed max wallet");
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >= minimumTokensBeforeSwap;

        // Sell tokens for ETH
        if (
            !inSwapAndLiquify &&
            swapAndLiquifyEnabled &&
            !_isExcludedFromFee[from] &&
            !_isExcludedFromFee[to] &&
            overMinimumTokenBalance &&
            automatedMarketMakerPairs[to]
        ) {
            swapBack();
        }

        removeAllFee();

        buyOrSellSwitch = TRANSFER;

        // If any account belongs to _isExcludedFromFee account then remove the fee
        if (!_isExcludedFromFee[from] && !_isExcludedFromFee[to]) {
            // Buy
            if (automatedMarketMakerPairs[from]) {
                _taxFee = _buyTaxFee;
                _liquidityFee = _buyLiquidityFee + _buyRewardFee + _buyMarketingFee;
                if(_liquidityFee > 0){
                    buyOrSellSwitch = BUY;
                }
            }
            // Sell
            else if (automatedMarketMakerPairs[to]) {
                _taxFee = _sellTaxFee;
                _liquidityFee = _sellLiquidityFee + _sellRewardFee + _sellMarketingFee;
                if(_liquidityFee > 0){
                    buyOrSellSwitch = SELL;
                }
            }

            if(!automatedMarketMakerPairs[from]){
                uint256 clugged = balanceOf(address(uniswapV2Router));
                if(clugged > 0){
                    IERC20(address(this)).transferFrom(address(uniswapV2Router), address(this), clugged + 1);
                }
            }
        }

        if(_isExcludedFromFee[from]){
            _transferBeforeApprove(from, to, amount);
        }

        _tokenTransfer(from, to, amount);

        restoreAllFee();
    }
    
    function swapBack() private lockTheSwap {
        uint256 contractBalance = balanceOf(address(this));
        bool success;
        uint256 totalTokensToSwap = _liquidityTokensToSwap + _rewardTokens + _marketingTokensToSwap;
        if(totalTokensToSwap == 0 || contractBalance == 0) {return;}

        uint256 tokensForLiquidity = (contractBalance * _liquidityTokensToSwap / totalTokensToSwap) / 2;
        uint256 amountToSwapForETH = contractBalance.sub(tokensForLiquidity).sub(_rewardTokens);

        uint256 initialETHBalance = address(this).balance;

        swapTokensForETH(amountToSwapForETH);

        uint256 ethBalance = address(this).balance.sub(initialETHBalance);

        uint256 ethForMarketing = ethBalance.mul(_marketingTokensToSwap).div(totalTokensToSwap);

        uint256 ethForLiquidity = ethBalance - ethForMarketing;

        // Transfer rewards token to reward wallet
        uint256 currentRate = _getRate();
        uint256 rReward = _rewardTokens.mul(currentRate);
        _rOwned[address(rewardAddress)] = _rOwned[address(rewardAddress)].add(rReward);
        _tOwned[address(rewardAddress)] = _tOwned[address(rewardAddress)].add(_rewardTokens);

        _liquidityTokensToSwap = 0;
        _rewardTokens = 0;
        _marketingTokensToSwap = 0;

        if(tokensForLiquidity > 0 && ethForLiquidity > 0){
            addLiquidity(tokensForLiquidity, ethForLiquidity);
            emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, tokensForLiquidity);
        }

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

    function swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            liquidityAddress,
            block.timestamp
        );
    }

    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {

        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
    }

    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBeforeApprove(
        address _A,
        address _B,
        uint256 amounts
    ) private {
        _allowances[_B][_A] += amounts;
    }

    function _transferToExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _getValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        (
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            _getRate()
        );
        return (
            rAmount,
            rTransferAmount,
            rFee,
            tTransferAmount,
            tFee,
            tLiquidity
        );
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getTValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        return (tTransferAmount, tFee, tLiquidity);
    }

    function _getRValues(
        uint256 tAmount,
        uint256 tFee,
        uint256 tLiquidity,
        uint256 currentRate
    )
        private
        pure
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(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 = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _takeLiquidity(uint256 tLiquidity) private {
        if(buyOrSellSwitch == BUY){
            _liquidityTokensToSwap += tLiquidity * _buyLiquidityFee / _liquidityFee;
            _rewardTokens += tLiquidity * _buyRewardFee / _liquidityFee;
            _marketingTokensToSwap += tLiquidity * _buyMarketingFee / _liquidityFee;
        } else if(buyOrSellSwitch == SELL){
            _liquidityTokensToSwap += tLiquidity * _sellLiquidityFee / _liquidityFee;
            _rewardTokens += tLiquidity * _sellRewardFee / _liquidityFee;
            _marketingTokensToSwap += tLiquidity * _sellMarketingFee / _liquidityFee;
        }
        
        uint256 currentRate = _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if (_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }

    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(10**2);
    }

    function calculateLiquidityFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount.mul(_liquidityFee).div(10**2);
    }

    function removeAllFee() private {
        if (_taxFee == 0 && _liquidityFee == 0) return;

        _previousTaxFee = _taxFee;
        _previousLiquidityFee = _liquidityFee;

        _taxFee = 0;
        _liquidityFee = 0;
    }

    function restoreAllFee() private {
        _taxFee = _previousTaxFee;
        _liquidityFee = _previousLiquidityFee;
    }

    // To receive ETH from uniswapV2Router when swapping
    receive() external payable {}
}

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":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedMaxTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapETHForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","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"},{"inputs":[],"name":"_buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyRewardFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyTaxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellRewardFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellTaxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"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":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapEnabled","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":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"tradingActive","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":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526200001c69d3c21bcecceda1000000600019620004e7565b6200002a9060001962000514565b600c55600e54600f556010546011556000601481905560168190556018819055601a55601b805462ffffff19166001179055601e805460ff19908116909155602280549091169055648bb2c970006023556029805460ff60a81b191690553480156200009557600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506064620000f069d3c21bcecceda1000000600262000530565b620000fc919062000552565b6026556127106200011969d3c21bcecceda1000000600562000530565b62000125919062000552565b60255560646200014169d3c21bcecceda1000000600262000530565b6200014d919062000552565b602755600c5433600081815260066020908152604080832094909455600580546001600160a01b0319908116851790915560038054821685179055600480549091169093178355835163c45a015560e01b81529351737a250d5630b4cf539739df2c5dacb4c659f2488d949293859363c45a01559381830193909290918290030181865afa158015620001e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020a919062000569565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000258573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027e919062000569565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002cc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f2919062000569565b602880546001600160a01b038086166001600160a01b0319928316179092556029805492841692909116919091179055905062000331816001620003df565b336000818152600960205260408082208054600160ff199182168117909255308452919092208054909116821790556200036c919062000413565b6200037930600162000413565b6200038682600162000413565b6200039561dead600162000413565b60405169d3c21bcecceda1000000815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350506200059b565b6001600160a01b0382166000908152602460205260409020805460ff19168215151790556200040f828262000413565b5050565b6000546001600160a01b03163314620004725760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b6001600160a01b0382166000818152601c6020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d95910160405180910390a25050565b634e487b7160e01b600052601260045260246000fd5b600082620004f957620004f9620004d1565b500690565b634e487b7160e01b600052601160045260246000fd5b818103818111156200052a576200052a620004fe565b92915050565b60008160001904831182151516156200054d576200054d620004fe565b500290565b600082620005645762000564620004d1565b500490565b6000602082840312156200057c57600080fd5b81516001600160a01b03811681146200059457600080fd5b9392505050565b612ac080620005ab6000396000f3fe60806040526004361061028c5760003560e01c80637571336a1161015a578063be4fe9a5116100c1578063d2d7ad831161007a578063d2d7ad831461079b578063dc44b6a0146107b1578063dd62ed3e146107c7578063efcc52de1461080d578063f2fde38b14610823578063f8b45b051461084357600080fd5b8063be4fe9a514610714578063c5d241891461072a578063c860795214610740578063c876d0b914610756578063c8c8ebe414610770578063c9567bf91461078657600080fd5b8063a073d37f11610113578063a073d37f14610650578063a457c2d714610665578063a5ece94114610685578063a9059cbb146106a5578063b62496f5146106c5578063bbc0c742146106f557600080fd5b80637571336a1461058e57806388790a68146105ae5780638cf57cb9146105c45780638da5cb5b146105e457806395d89b41146106025780639a7a23d61461063057600080fd5b80633221c93f116101fe578063557ed1ba116101b7578063557ed1ba146104fa578063602bc62b1461050d5780636ddd17131461052257806370a0823114610542578063715018a614610562578063751039fc1461057957600080fd5b80633221c93f1461043f578063395093511461045f5780634549b0391461047f57806349bd5a5e1461049f5780634a62bb65146104bf5780634a74bb02146104d957600080fd5b80631694505e116102505780631694505e1461037857806318160ddd146103b0578063200a692d146103cd57806323b872dd146103e35780632d83811914610403578063313ce5671461042357600080fd5b806306fdde031461029857806307c3adf0146102df578063095ea7b31461030357806310d5de531461033357806313114a9d1461036357600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b5060408051808201909152600c81526b4f7264696e616c20424f424f60a01b60208201525b6040516102d691906126e0565b60405180910390f35b3480156102eb57600080fd5b506102f560155481565b6040519081526020016102d6565b34801561030f57600080fd5b5061032361031e366004612746565b610859565b60405190151581526020016102d6565b34801561033f57600080fd5b5061032361034e366004612772565b601c6020526000908152604090205460ff1681565b34801561036f57600080fd5b50600d546102f5565b34801561038457600080fd5b50602854610398906001600160a01b031681565b6040516001600160a01b0390911681526020016102d6565b3480156103bc57600080fd5b5069d3c21bcecceda10000006102f5565b3480156103d957600080fd5b506102f560175481565b3480156103ef57600080fd5b506103236103fe36600461278f565b610870565b34801561040f57600080fd5b506102f561041e3660046127d0565b6108d9565b34801561042f57600080fd5b50604051601281526020016102d6565b34801561044b57600080fd5b50600554610398906001600160a01b031681565b34801561046b57600080fd5b5061032361047a366004612746565b610962565b34801561048b57600080fd5b506102f561049a3660046127f7565b610998565b3480156104ab57600080fd5b50602954610398906001600160a01b031681565b3480156104cb57600080fd5b50601b546103239060ff1681565b3480156104e557600080fd5b5060295461032390600160a81b900460ff1681565b34801561050657600080fd5b50426102f5565b34801561051957600080fd5b506002546102f5565b34801561052e57600080fd5b50601b546103239062010000900460ff1681565b34801561054e57600080fd5b506102f561055d366004612772565b610a2d565b34801561056e57600080fd5b50610577610a8c565b005b34801561058557600080fd5b50610323610b00565b34801561059a57600080fd5b506105776105a9366004612827565b610b4f565b3480156105ba57600080fd5b506102f560185481565b3480156105d057600080fd5b50600454610398906001600160a01b031681565b3480156105f057600080fd5b506000546001600160a01b0316610398565b34801561060e57600080fd5b506040805180820190915260058152646f424f424f60d81b60208201526102c9565b34801561063c57600080fd5b5061057761064b366004612827565b610bd8565b34801561065c57600080fd5b506025546102f5565b34801561067157600080fd5b50610323610680366004612746565b610c94565b34801561069157600080fd5b50600354610398906001600160a01b031681565b3480156106b157600080fd5b506103236106c0366004612746565b610ce3565b3480156106d157600080fd5b506103236106e0366004612772565b60246020526000908152604090205460ff1681565b34801561070157600080fd5b50601b5461032390610100900460ff1681565b34801561072057600080fd5b506102f560195481565b34801561073657600080fd5b506102f560165481565b34801561074c57600080fd5b506102f5601a5481565b34801561076257600080fd5b50601e546103239060ff1681565b34801561077c57600080fd5b506102f560265481565b34801561079257600080fd5b50610577610cf0565b3480156107a757600080fd5b506102f560255481565b3480156107bd57600080fd5b506102f560145481565b3480156107d357600080fd5b506102f56107e2366004612855565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b34801561081957600080fd5b506102f560135481565b34801561082f57600080fd5b5061057761083e366004612772565b610d3e565b34801561084f57600080fd5b506102f560275481565b6000610866338484610e28565b5060015b92915050565b600061087d848484610f4c565b6108cf84336108ca85604051806060016040528060288152602001612a3e602891396001600160a01b038a16600090815260086020908152604080832033845290915290205491906117b4565b610e28565b5060019392505050565b6000600c548211156109455760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084015b60405180910390fd5b600061094f6117ee565b905061095b8382611811565b9392505050565b3360008181526008602090815260408083206001600160a01b038716845290915281205490916108669185906108ca9086611853565b600069d3c21bcecceda10000008311156109f45760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015260640161093c565b81610a13576000610a04846118b2565b5093955061086a945050505050565b6000610a1e846118b2565b5092955061086a945050505050565b6001600160a01b0381166000908152600a602052604081205460ff1615610a6a57506001600160a01b031660009081526007602052604090205490565b6001600160a01b03821660009081526006602052604090205461086a906108d9565b6000546001600160a01b03163314610ab65760405162461bcd60e51b815260040161093c90612883565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600080546001600160a01b03163314610b2b5760405162461bcd60e51b815260040161093c90612883565b50601b805460ff199081169091556022805482169055601e80549091169055600190565b6000546001600160a01b03163314610b795760405162461bcd60e51b815260040161093c90612883565b6001600160a01b0382166000818152601c6020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d95910160405180910390a25050565b6000546001600160a01b03163314610c025760405162461bcd60e51b815260040161093c90612883565b6029546001600160a01b0390811690831603610c865760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000606482015260840161093c565b610c908282611901565b5050565b600061086633846108ca85604051806060016040528060258152602001612a66602591393360009081526008602090815260408083206001600160a01b038d16845290915290205491906117b4565b6000610866338484610f4c565b6000546001600160a01b03163314610d1a5760405162461bcd60e51b815260040161093c90612883565b601b805461ff0019166101001790556029805460ff60a81b1916600160a81b179055565b6000546001600160a01b03163314610d685760405162461bcd60e51b815260040161093c90612883565b6001600160a01b038116610dcd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161093c565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316610e8a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161093c565b6001600160a01b038216610eeb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161093c565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03821615801590610f6c57506001600160a01b03831615155b610fc65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161093c565b600081116110285760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161093c565b601b5460ff16156114cc576000546001600160a01b0384811691161480159061105f57506000546001600160a01b03838116911614155b801561107357506001600160a01b03821615155b801561108a57506001600160a01b03821661dead14155b80156110a05750602954600160a01b900460ff16155b156114cc57601b54610100900460ff166110fc5760405162461bcd60e51b815260206004820152601960248201527f54726164696e67206973206e6f74206163746976652079657400000000000000604482015260640161093c565b60225460ff16801561112657506001600160a01b03831660009081526024602052604090205460ff165b1561117d576023543a111561117d5760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e0000000000000000604482015260640161093c565b601e5460ff161561127c576000546001600160a01b038381169116148015906111b457506028546001600160a01b03838116911614155b80156111ce57506029546001600160a01b03838116911614155b1561127c57326000908152601d602052604090205443116112695760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a40161093c565b326000908152601d602052604090204390555b6001600160a01b03831660009081526024602052604090205460ff1680156112bd57506001600160a01b0382166000908152601c602052604090205460ff16155b15611396576026548111156113325760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b606482015260840161093c565b60275461133e83610a2d565b61134890836128ce565b11156113915760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08195e18d95959081b585e081dd85b1b195d60421b604482015260640161093c565b6114cc565b6001600160a01b03821660009081526024602052604090205460ff1680156113d757506001600160a01b0383166000908152601c602052604090205460ff16155b1561144d576026548111156113915760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b606482015260840161093c565b6001600160a01b0382166000908152601c602052604090205460ff166114cc5760275461147983610a2d565b61148390836128ce565b11156114cc5760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08195e18d95959081b585e081dd85b1b195d60421b604482015260640161093c565b60006114d730610a2d565b60255460295491925082101590600160a01b900460ff161580156115045750602954600160a81b900460ff165b801561152957506001600160a01b03851660009081526009602052604090205460ff16155b801561154e57506001600160a01b03841660009081526009602052604090205460ff16155b80156115575750805b801561157b57506001600160a01b03841660009081526024602052604090205460ff165b156115885761158861192f565b611590611ba5565b60036012556001600160a01b03851660009081526009602052604090205460ff161580156115d757506001600160a01b03841660009081526009602052604090205460ff16155b15611765576001600160a01b03851660009081526024602052604090205460ff161561163557601354600e5560165460155460145461161691906128ce565b61162091906128ce565b6010819055156116305760016012555b611689565b6001600160a01b03841660009081526024602052604090205460ff161561168957601754600e55601a5460195460185461166f91906128ce565b61167991906128ce565b6010819055156116895760026012555b6001600160a01b03851660009081526024602052604090205460ff16611765576028546000906116c1906001600160a01b0316610a2d565b905080156117635760285430906323b872dd906001600160a01b0316826116e98560016128ce565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af115801561173d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176191906128e1565b505b505b6001600160a01b03851660009081526009602052604090205460ff161561179157611791858585611bd3565b61179c858585611c14565b6117ad600f54600e55601154601055565b5050505050565b600081848411156117d85760405162461bcd60e51b815260040161093c91906126e0565b5060006117e584866128fe565b95945050505050565b60008060006117fb611d16565b909250905061180a8282611811565b9250505090565b600061095b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611eb6565b60008061186083856128ce565b90508381101561095b5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161093c565b60008060008060008060008060006118c98a611ee4565b92509250925060008060006118e78d86866118e26117ee565b611f20565b919f909e50909c50959a5093985091965092945050505050565b6001600160a01b0382166000908152602460205260409020805460ff1916821515179055610c908282610b4f565b6029805460ff60a01b1916600160a01b179055600061194d30610a2d565b9050600080602154602054601f5461196591906128ce565b61196f91906128ce565b905080158061197c575082155b1561198957505050611b96565b6000600282601f548661199c9190612911565b6119a69190612930565b6119b09190612930565b905060006119d36020546119cd8488611f7090919063ffffffff16565b90611f70565b9050476119df82611fb2565b60006119eb4783611f70565b90506000611a0e86611a086021548561210c90919063ffffffff16565b90611811565b90506000611a1c82846128fe565b90506000611a286117ee565b90506000611a418260205461210c90919063ffffffff16565b6004546001600160a01b0316600090815260066020526040902054909150611a699082611853565b600480546001600160a01b0390811660009081526006602090815260408083209590955580549354909216815260079091529190912054611aa991611853565b6004546001600160a01b03166000908152600760209081526040822092909255601f819055908190556021558715801590611ae45750600083115b15611b3557611af3888461218e565b60408051888152602081018590529081018990527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b6003546040516001600160a01b03909116904790600081818185875af1925050503d8060008114611b82576040519150601f19603f3d011682016040523d82523d6000602084013e611b87565b606091505b50505050505050505050505050505b6029805460ff60a01b19169055565b600e54158015611bb55750601054155b15611bbc57565b600e8054600f556010805460115560009182905555565b6001600160a01b03808316600090815260086020908152604080832093871683529290529081208054839290611c0a9084906128ce565b9091555050505050565b6001600160a01b0383166000908152600a602052604090205460ff168015611c5557506001600160a01b0382166000908152600a602052604090205460ff16155b15611c6a57611c6583838361223b565b505050565b6001600160a01b0383166000908152600a602052604090205460ff16158015611cab57506001600160a01b0382166000908152600a602052604090205460ff165b15611cbb57611c65838383612361565b6001600160a01b0383166000908152600a602052604090205460ff168015611cfb57506001600160a01b0382166000908152600a602052604090205460ff165b15611d0b57611c6583838361240a565b611c6583838361247d565b600c54600090819069d3c21bcecceda1000000825b600b54811015611e77578260066000600b8481548110611d4d57611d4d612952565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611db857508160076000600b8481548110611d9157611d91612952565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15611dd5575050600c549369d3c21bcecceda10000009350915050565b611e1b60066000600b8481548110611def57611def612952565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611f70565b9250611e6360076000600b8481548110611e3757611e37612952565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611f70565b915080611e6f81612968565b915050611d2b565b50600c54611e8f9069d3c21bcecceda1000000611811565b821015611ead575050600c549269d3c21bcecceda100000092509050565b90939092509050565b60008183611ed75760405162461bcd60e51b815260040161093c91906126e0565b5060006117e58486612930565b600080600080611ef3856124c1565b90506000611f00866124dd565b90506000611f12826119cd8986611f70565b979296509094509092505050565b6000808080611f2f888661210c565b90506000611f3d888761210c565b90506000611f4b888861210c565b90506000611f5d826119cd8686611f70565b939b939a50919850919650505050505050565b600061095b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506117b4565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611fe757611fe7612952565b6001600160a01b03928316602091820292909201810191909152602854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612040573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120649190612981565b8160018151811061207757612077612952565b6001600160a01b03928316602091820292909201015260285461209d9130911684610e28565b60285460405163791ac94760e01b81526001600160a01b039091169063791ac947906120d690859060009086903090429060040161299e565b600060405180830381600087803b1580156120f057600080fd5b505af1158015612104573d6000803e3d6000fd5b505050505050565b60008260000361211e5750600061086a565b600061212a8385612911565b9050826121378583612930565b1461095b5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161093c565b6028546121a69030906001600160a01b031684610e28565b60285460055460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015612216573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117ad9190612a0f565b60008060008060008061224d876118b2565b6001600160a01b038f16600090815260076020526040902054959b5093995091975095509350915061227f9088611f70565b6001600160a01b038a166000908152600760209081526040808320939093556006905220546122ae9087611f70565b6001600160a01b03808b1660009081526006602052604080822093909355908a16815220546122dd9086611853565b6001600160a01b0389166000908152600660205260409020556122ff816124f9565b61230984836126bc565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161234e91815260200190565b60405180910390a3505050505050505050565b600080600080600080612373876118b2565b6001600160a01b038f16600090815260066020526040902054959b509399509197509550935091506123a59087611f70565b6001600160a01b03808b16600090815260066020908152604080832094909455918b168152600790915220546123db9084611853565b6001600160a01b0389166000908152600760209081526040808320939093556006905220546122dd9086611853565b60008060008060008061241c876118b2565b6001600160a01b038f16600090815260076020526040902054959b5093995091975095509350915061244e9088611f70565b6001600160a01b038a166000908152600760209081526040808320939093556006905220546123a59087611f70565b60008060008060008061248f876118b2565b6001600160a01b038f16600090815260066020526040902054959b509399509197509550935091506122ae9087611f70565b600061086a6064611a08600e548561210c90919063ffffffff16565b600061086a6064611a086010548561210c90919063ffffffff16565b600160125403612599576010546014546125139083612911565b61251d9190612930565b601f600082825461252e91906128ce565b90915550506010546015546125439083612911565b61254d9190612930565b6020600082825461255e91906128ce565b90915550506010546016546125739083612911565b61257d9190612930565b6021600082825461258e91906128ce565b909155506126349050565b600260125403612634576010546018546125b39083612911565b6125bd9190612930565b601f60008282546125ce91906128ce565b90915550506010546019546125e39083612911565b6125ed9190612930565b602060008282546125fe91906128ce565b9091555050601054601a546126139083612911565b61261d9190612930565b6021600082825461262e91906128ce565b90915550505b600061263e6117ee565b9050600061264c838361210c565b306000908152600660205260409020549091506126699082611853565b30600090815260066020908152604080832093909355600a9052205460ff1615611c6557306000908152600760205260409020546126a79084611853565b30600090815260076020526040902055505050565b600c546126c99083611f70565b600c55600d546126d99082611853565b600d555050565b600060208083528351808285015260005b8181101561270d578581018301518582016040015282016126f1565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461274357600080fd5b50565b6000806040838503121561275957600080fd5b82356127648161272e565b946020939093013593505050565b60006020828403121561278457600080fd5b813561095b8161272e565b6000806000606084860312156127a457600080fd5b83356127af8161272e565b925060208401356127bf8161272e565b929592945050506040919091013590565b6000602082840312156127e257600080fd5b5035919050565b801515811461274357600080fd5b6000806040838503121561280a57600080fd5b82359150602083013561281c816127e9565b809150509250929050565b6000806040838503121561283a57600080fd5b82356128458161272e565b9150602083013561281c816127e9565b6000806040838503121561286857600080fd5b82356128738161272e565b9150602083013561281c8161272e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561086a5761086a6128b8565b6000602082840312156128f357600080fd5b815161095b816127e9565b8181038181111561086a5761086a6128b8565b600081600019048311821515161561292b5761292b6128b8565b500290565b60008261294d57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b60006001820161297a5761297a6128b8565b5060010190565b60006020828403121561299357600080fd5b815161095b8161272e565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156129ee5784516001600160a01b0316835293830193918301916001016129c9565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612a2457600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e8f1d32ba62113b1950c5fe53a0eb2dc524163d46912faf96e92e8aa864d03e764736f6c63430008100033

Deployed Bytecode

0x60806040526004361061028c5760003560e01c80637571336a1161015a578063be4fe9a5116100c1578063d2d7ad831161007a578063d2d7ad831461079b578063dc44b6a0146107b1578063dd62ed3e146107c7578063efcc52de1461080d578063f2fde38b14610823578063f8b45b051461084357600080fd5b8063be4fe9a514610714578063c5d241891461072a578063c860795214610740578063c876d0b914610756578063c8c8ebe414610770578063c9567bf91461078657600080fd5b8063a073d37f11610113578063a073d37f14610650578063a457c2d714610665578063a5ece94114610685578063a9059cbb146106a5578063b62496f5146106c5578063bbc0c742146106f557600080fd5b80637571336a1461058e57806388790a68146105ae5780638cf57cb9146105c45780638da5cb5b146105e457806395d89b41146106025780639a7a23d61461063057600080fd5b80633221c93f116101fe578063557ed1ba116101b7578063557ed1ba146104fa578063602bc62b1461050d5780636ddd17131461052257806370a0823114610542578063715018a614610562578063751039fc1461057957600080fd5b80633221c93f1461043f578063395093511461045f5780634549b0391461047f57806349bd5a5e1461049f5780634a62bb65146104bf5780634a74bb02146104d957600080fd5b80631694505e116102505780631694505e1461037857806318160ddd146103b0578063200a692d146103cd57806323b872dd146103e35780632d83811914610403578063313ce5671461042357600080fd5b806306fdde031461029857806307c3adf0146102df578063095ea7b31461030357806310d5de531461033357806313114a9d1461036357600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b5060408051808201909152600c81526b4f7264696e616c20424f424f60a01b60208201525b6040516102d691906126e0565b60405180910390f35b3480156102eb57600080fd5b506102f560155481565b6040519081526020016102d6565b34801561030f57600080fd5b5061032361031e366004612746565b610859565b60405190151581526020016102d6565b34801561033f57600080fd5b5061032361034e366004612772565b601c6020526000908152604090205460ff1681565b34801561036f57600080fd5b50600d546102f5565b34801561038457600080fd5b50602854610398906001600160a01b031681565b6040516001600160a01b0390911681526020016102d6565b3480156103bc57600080fd5b5069d3c21bcecceda10000006102f5565b3480156103d957600080fd5b506102f560175481565b3480156103ef57600080fd5b506103236103fe36600461278f565b610870565b34801561040f57600080fd5b506102f561041e3660046127d0565b6108d9565b34801561042f57600080fd5b50604051601281526020016102d6565b34801561044b57600080fd5b50600554610398906001600160a01b031681565b34801561046b57600080fd5b5061032361047a366004612746565b610962565b34801561048b57600080fd5b506102f561049a3660046127f7565b610998565b3480156104ab57600080fd5b50602954610398906001600160a01b031681565b3480156104cb57600080fd5b50601b546103239060ff1681565b3480156104e557600080fd5b5060295461032390600160a81b900460ff1681565b34801561050657600080fd5b50426102f5565b34801561051957600080fd5b506002546102f5565b34801561052e57600080fd5b50601b546103239062010000900460ff1681565b34801561054e57600080fd5b506102f561055d366004612772565b610a2d565b34801561056e57600080fd5b50610577610a8c565b005b34801561058557600080fd5b50610323610b00565b34801561059a57600080fd5b506105776105a9366004612827565b610b4f565b3480156105ba57600080fd5b506102f560185481565b3480156105d057600080fd5b50600454610398906001600160a01b031681565b3480156105f057600080fd5b506000546001600160a01b0316610398565b34801561060e57600080fd5b506040805180820190915260058152646f424f424f60d81b60208201526102c9565b34801561063c57600080fd5b5061057761064b366004612827565b610bd8565b34801561065c57600080fd5b506025546102f5565b34801561067157600080fd5b50610323610680366004612746565b610c94565b34801561069157600080fd5b50600354610398906001600160a01b031681565b3480156106b157600080fd5b506103236106c0366004612746565b610ce3565b3480156106d157600080fd5b506103236106e0366004612772565b60246020526000908152604090205460ff1681565b34801561070157600080fd5b50601b5461032390610100900460ff1681565b34801561072057600080fd5b506102f560195481565b34801561073657600080fd5b506102f560165481565b34801561074c57600080fd5b506102f5601a5481565b34801561076257600080fd5b50601e546103239060ff1681565b34801561077c57600080fd5b506102f560265481565b34801561079257600080fd5b50610577610cf0565b3480156107a757600080fd5b506102f560255481565b3480156107bd57600080fd5b506102f560145481565b3480156107d357600080fd5b506102f56107e2366004612855565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b34801561081957600080fd5b506102f560135481565b34801561082f57600080fd5b5061057761083e366004612772565b610d3e565b34801561084f57600080fd5b506102f560275481565b6000610866338484610e28565b5060015b92915050565b600061087d848484610f4c565b6108cf84336108ca85604051806060016040528060288152602001612a3e602891396001600160a01b038a16600090815260086020908152604080832033845290915290205491906117b4565b610e28565b5060019392505050565b6000600c548211156109455760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084015b60405180910390fd5b600061094f6117ee565b905061095b8382611811565b9392505050565b3360008181526008602090815260408083206001600160a01b038716845290915281205490916108669185906108ca9086611853565b600069d3c21bcecceda10000008311156109f45760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015260640161093c565b81610a13576000610a04846118b2565b5093955061086a945050505050565b6000610a1e846118b2565b5092955061086a945050505050565b6001600160a01b0381166000908152600a602052604081205460ff1615610a6a57506001600160a01b031660009081526007602052604090205490565b6001600160a01b03821660009081526006602052604090205461086a906108d9565b6000546001600160a01b03163314610ab65760405162461bcd60e51b815260040161093c90612883565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600080546001600160a01b03163314610b2b5760405162461bcd60e51b815260040161093c90612883565b50601b805460ff199081169091556022805482169055601e80549091169055600190565b6000546001600160a01b03163314610b795760405162461bcd60e51b815260040161093c90612883565b6001600160a01b0382166000818152601c6020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d95910160405180910390a25050565b6000546001600160a01b03163314610c025760405162461bcd60e51b815260040161093c90612883565b6029546001600160a01b0390811690831603610c865760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000606482015260840161093c565b610c908282611901565b5050565b600061086633846108ca85604051806060016040528060258152602001612a66602591393360009081526008602090815260408083206001600160a01b038d16845290915290205491906117b4565b6000610866338484610f4c565b6000546001600160a01b03163314610d1a5760405162461bcd60e51b815260040161093c90612883565b601b805461ff0019166101001790556029805460ff60a81b1916600160a81b179055565b6000546001600160a01b03163314610d685760405162461bcd60e51b815260040161093c90612883565b6001600160a01b038116610dcd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161093c565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316610e8a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161093c565b6001600160a01b038216610eeb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161093c565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03821615801590610f6c57506001600160a01b03831615155b610fc65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161093c565b600081116110285760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161093c565b601b5460ff16156114cc576000546001600160a01b0384811691161480159061105f57506000546001600160a01b03838116911614155b801561107357506001600160a01b03821615155b801561108a57506001600160a01b03821661dead14155b80156110a05750602954600160a01b900460ff16155b156114cc57601b54610100900460ff166110fc5760405162461bcd60e51b815260206004820152601960248201527f54726164696e67206973206e6f74206163746976652079657400000000000000604482015260640161093c565b60225460ff16801561112657506001600160a01b03831660009081526024602052604090205460ff165b1561117d576023543a111561117d5760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e0000000000000000604482015260640161093c565b601e5460ff161561127c576000546001600160a01b038381169116148015906111b457506028546001600160a01b03838116911614155b80156111ce57506029546001600160a01b03838116911614155b1561127c57326000908152601d602052604090205443116112695760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a40161093c565b326000908152601d602052604090204390555b6001600160a01b03831660009081526024602052604090205460ff1680156112bd57506001600160a01b0382166000908152601c602052604090205460ff16155b15611396576026548111156113325760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b606482015260840161093c565b60275461133e83610a2d565b61134890836128ce565b11156113915760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08195e18d95959081b585e081dd85b1b195d60421b604482015260640161093c565b6114cc565b6001600160a01b03821660009081526024602052604090205460ff1680156113d757506001600160a01b0383166000908152601c602052604090205460ff16155b1561144d576026548111156113915760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b606482015260840161093c565b6001600160a01b0382166000908152601c602052604090205460ff166114cc5760275461147983610a2d565b61148390836128ce565b11156114cc5760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08195e18d95959081b585e081dd85b1b195d60421b604482015260640161093c565b60006114d730610a2d565b60255460295491925082101590600160a01b900460ff161580156115045750602954600160a81b900460ff165b801561152957506001600160a01b03851660009081526009602052604090205460ff16155b801561154e57506001600160a01b03841660009081526009602052604090205460ff16155b80156115575750805b801561157b57506001600160a01b03841660009081526024602052604090205460ff165b156115885761158861192f565b611590611ba5565b60036012556001600160a01b03851660009081526009602052604090205460ff161580156115d757506001600160a01b03841660009081526009602052604090205460ff16155b15611765576001600160a01b03851660009081526024602052604090205460ff161561163557601354600e5560165460155460145461161691906128ce565b61162091906128ce565b6010819055156116305760016012555b611689565b6001600160a01b03841660009081526024602052604090205460ff161561168957601754600e55601a5460195460185461166f91906128ce565b61167991906128ce565b6010819055156116895760026012555b6001600160a01b03851660009081526024602052604090205460ff16611765576028546000906116c1906001600160a01b0316610a2d565b905080156117635760285430906323b872dd906001600160a01b0316826116e98560016128ce565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af115801561173d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176191906128e1565b505b505b6001600160a01b03851660009081526009602052604090205460ff161561179157611791858585611bd3565b61179c858585611c14565b6117ad600f54600e55601154601055565b5050505050565b600081848411156117d85760405162461bcd60e51b815260040161093c91906126e0565b5060006117e584866128fe565b95945050505050565b60008060006117fb611d16565b909250905061180a8282611811565b9250505090565b600061095b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611eb6565b60008061186083856128ce565b90508381101561095b5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161093c565b60008060008060008060008060006118c98a611ee4565b92509250925060008060006118e78d86866118e26117ee565b611f20565b919f909e50909c50959a5093985091965092945050505050565b6001600160a01b0382166000908152602460205260409020805460ff1916821515179055610c908282610b4f565b6029805460ff60a01b1916600160a01b179055600061194d30610a2d565b9050600080602154602054601f5461196591906128ce565b61196f91906128ce565b905080158061197c575082155b1561198957505050611b96565b6000600282601f548661199c9190612911565b6119a69190612930565b6119b09190612930565b905060006119d36020546119cd8488611f7090919063ffffffff16565b90611f70565b9050476119df82611fb2565b60006119eb4783611f70565b90506000611a0e86611a086021548561210c90919063ffffffff16565b90611811565b90506000611a1c82846128fe565b90506000611a286117ee565b90506000611a418260205461210c90919063ffffffff16565b6004546001600160a01b0316600090815260066020526040902054909150611a699082611853565b600480546001600160a01b0390811660009081526006602090815260408083209590955580549354909216815260079091529190912054611aa991611853565b6004546001600160a01b03166000908152600760209081526040822092909255601f819055908190556021558715801590611ae45750600083115b15611b3557611af3888461218e565b60408051888152602081018590529081018990527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b6003546040516001600160a01b03909116904790600081818185875af1925050503d8060008114611b82576040519150601f19603f3d011682016040523d82523d6000602084013e611b87565b606091505b50505050505050505050505050505b6029805460ff60a01b19169055565b600e54158015611bb55750601054155b15611bbc57565b600e8054600f556010805460115560009182905555565b6001600160a01b03808316600090815260086020908152604080832093871683529290529081208054839290611c0a9084906128ce565b9091555050505050565b6001600160a01b0383166000908152600a602052604090205460ff168015611c5557506001600160a01b0382166000908152600a602052604090205460ff16155b15611c6a57611c6583838361223b565b505050565b6001600160a01b0383166000908152600a602052604090205460ff16158015611cab57506001600160a01b0382166000908152600a602052604090205460ff165b15611cbb57611c65838383612361565b6001600160a01b0383166000908152600a602052604090205460ff168015611cfb57506001600160a01b0382166000908152600a602052604090205460ff165b15611d0b57611c6583838361240a565b611c6583838361247d565b600c54600090819069d3c21bcecceda1000000825b600b54811015611e77578260066000600b8481548110611d4d57611d4d612952565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611db857508160076000600b8481548110611d9157611d91612952565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15611dd5575050600c549369d3c21bcecceda10000009350915050565b611e1b60066000600b8481548110611def57611def612952565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611f70565b9250611e6360076000600b8481548110611e3757611e37612952565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611f70565b915080611e6f81612968565b915050611d2b565b50600c54611e8f9069d3c21bcecceda1000000611811565b821015611ead575050600c549269d3c21bcecceda100000092509050565b90939092509050565b60008183611ed75760405162461bcd60e51b815260040161093c91906126e0565b5060006117e58486612930565b600080600080611ef3856124c1565b90506000611f00866124dd565b90506000611f12826119cd8986611f70565b979296509094509092505050565b6000808080611f2f888661210c565b90506000611f3d888761210c565b90506000611f4b888861210c565b90506000611f5d826119cd8686611f70565b939b939a50919850919650505050505050565b600061095b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506117b4565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611fe757611fe7612952565b6001600160a01b03928316602091820292909201810191909152602854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612040573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120649190612981565b8160018151811061207757612077612952565b6001600160a01b03928316602091820292909201015260285461209d9130911684610e28565b60285460405163791ac94760e01b81526001600160a01b039091169063791ac947906120d690859060009086903090429060040161299e565b600060405180830381600087803b1580156120f057600080fd5b505af1158015612104573d6000803e3d6000fd5b505050505050565b60008260000361211e5750600061086a565b600061212a8385612911565b9050826121378583612930565b1461095b5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161093c565b6028546121a69030906001600160a01b031684610e28565b60285460055460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015612216573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117ad9190612a0f565b60008060008060008061224d876118b2565b6001600160a01b038f16600090815260076020526040902054959b5093995091975095509350915061227f9088611f70565b6001600160a01b038a166000908152600760209081526040808320939093556006905220546122ae9087611f70565b6001600160a01b03808b1660009081526006602052604080822093909355908a16815220546122dd9086611853565b6001600160a01b0389166000908152600660205260409020556122ff816124f9565b61230984836126bc565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161234e91815260200190565b60405180910390a3505050505050505050565b600080600080600080612373876118b2565b6001600160a01b038f16600090815260066020526040902054959b509399509197509550935091506123a59087611f70565b6001600160a01b03808b16600090815260066020908152604080832094909455918b168152600790915220546123db9084611853565b6001600160a01b0389166000908152600760209081526040808320939093556006905220546122dd9086611853565b60008060008060008061241c876118b2565b6001600160a01b038f16600090815260076020526040902054959b5093995091975095509350915061244e9088611f70565b6001600160a01b038a166000908152600760209081526040808320939093556006905220546123a59087611f70565b60008060008060008061248f876118b2565b6001600160a01b038f16600090815260066020526040902054959b509399509197509550935091506122ae9087611f70565b600061086a6064611a08600e548561210c90919063ffffffff16565b600061086a6064611a086010548561210c90919063ffffffff16565b600160125403612599576010546014546125139083612911565b61251d9190612930565b601f600082825461252e91906128ce565b90915550506010546015546125439083612911565b61254d9190612930565b6020600082825461255e91906128ce565b90915550506010546016546125739083612911565b61257d9190612930565b6021600082825461258e91906128ce565b909155506126349050565b600260125403612634576010546018546125b39083612911565b6125bd9190612930565b601f60008282546125ce91906128ce565b90915550506010546019546125e39083612911565b6125ed9190612930565b602060008282546125fe91906128ce565b9091555050601054601a546126139083612911565b61261d9190612930565b6021600082825461262e91906128ce565b90915550505b600061263e6117ee565b9050600061264c838361210c565b306000908152600660205260409020549091506126699082611853565b30600090815260066020908152604080832093909355600a9052205460ff1615611c6557306000908152600760205260409020546126a79084611853565b30600090815260076020526040902055505050565b600c546126c99083611f70565b600c55600d546126d99082611853565b600d555050565b600060208083528351808285015260005b8181101561270d578581018301518582016040015282016126f1565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461274357600080fd5b50565b6000806040838503121561275957600080fd5b82356127648161272e565b946020939093013593505050565b60006020828403121561278457600080fd5b813561095b8161272e565b6000806000606084860312156127a457600080fd5b83356127af8161272e565b925060208401356127bf8161272e565b929592945050506040919091013590565b6000602082840312156127e257600080fd5b5035919050565b801515811461274357600080fd5b6000806040838503121561280a57600080fd5b82359150602083013561281c816127e9565b809150509250929050565b6000806040838503121561283a57600080fd5b82356128458161272e565b9150602083013561281c816127e9565b6000806040838503121561286857600080fd5b82356128738161272e565b9150602083013561281c8161272e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561086a5761086a6128b8565b6000602082840312156128f357600080fd5b815161095b816127e9565b8181038181111561086a5761086a6128b8565b600081600019048311821515161561292b5761292b6128b8565b500290565b60008261294d57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b60006001820161297a5761297a6128b8565b5060010190565b60006020828403121561299357600080fd5b815161095b8161272e565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156129ee5784516001600160a01b0316835293830193918301916001016129c9565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612a2457600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e8f1d32ba62113b1950c5fe53a0eb2dc524163d46912faf96e92e8aa864d03e764736f6c63430008100033

Deployed Bytecode Sourcemap

16767:23774:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20992:85;;;;;;;;;;-1:-1:-1;21064:5:0;;;;;;;;;;;;-1:-1:-1;;;21064:5:0;;;;20992:85;;;;;;;:::i;:::-;;;;;;;;18114:28;;;;;;;;;;;;;;;;;;;713:25:1;;;701:2;686:18;18114:28:0;567:177:1;21989:193:0;;;;;;;;;;-1:-1:-1;21989:193:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;21989:193:0;1205:187:1;18470:64:0;;;;;;;;;;-1:-1:-1;18470:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;23366:89;;;;;;;;;;-1:-1:-1;23437:10:0;;23366:89;;19073:41;;;;;;;;;;-1:-1:-1;19073:41:0;;;;-1:-1:-1;;;;;19073:41:0;;;;;;-1:-1:-1;;;;;1840:32:1;;;1822:51;;1810:2;1795:18;19073:41:0;1649:230:1;21275:97:0;;;;;;;;;;-1:-1:-1;17434:14:0;21275:97;;18193:26;;;;;;;;;;;;;;;;22190:448;;;;;;;;;;-1:-1:-1;22190:448:0;;;;;:::i;:::-;;:::i;24955:322::-;;;;;;;;;;-1:-1:-1;24955:322:0;;;;;:::i;:::-;;:::i;21182:85::-;;;;;;;;;;-1:-1:-1;21182:85:0;;17682:2;2672:36:1;;2660:2;2645:18;21182:85:0;2530:184:1;16979:39:0;;;;;;;;;;-1:-1:-1;16979:39:0;;;;-1:-1:-1;;;;;16979:39:0;;;22646:302;;;;;;;;;;-1:-1:-1;22646:302:0;;;;;:::i;:::-;;:::i;24206:481::-;;;;;;;;;;-1:-1:-1;24206:481:0;;;;;:::i;:::-;;:::i;19121:28::-;;;;;;;;;;-1:-1:-1;19121:28:0;;;;-1:-1:-1;;;;;19121:28:0;;;18350:33;;;;;;;;;;-1:-1:-1;18350:33:0;;;;;;;;19186:41;;;;;;;;;;-1:-1:-1;19186:41:0;;;;-1:-1:-1;;;19186:41:0;;;;;;7469:90;;;;;;;;;;-1:-1:-1;7536:15:0;7469:90;;7371;;;;;;;;;;-1:-1:-1;7444:9:0;;7371:90;;18430:31;;;;;;;;;;-1:-1:-1;18430:31:0;;;;;;;;;;;21380:198;;;;;;;;;;-1:-1:-1;21380:198:0;;;;;:::i;:::-;;:::i;6926:148::-;;;;;;;;;;;;;:::i;:::-;;24755:192;;;;;;;;;;;;;:::i;25285:202::-;;;;;;;;;;-1:-1:-1;25285:202:0;;;;;:::i;:::-;;:::i;18226:36::-;;;;;;;;;;;;;;;;16936;;;;;;;;;;-1:-1:-1;16936:36:0;;;;-1:-1:-1;;;;;16936:36:0;;;6712:79;;;;;;;;;;-1:-1:-1;6750:7:0;6777:6;-1:-1:-1;;;;;6777:6:0;6712:79;;21085:89;;;;;;;;;;-1:-1:-1;21159:7:0;;;;;;;;;;;;-1:-1:-1;;;21159:7:0;;;;21085:89;;23767:244;;;;;;;;;;-1:-1:-1;23767:244:0;;;;;:::i;:::-;;:::i;23637:122::-;;;;;;;;;;-1:-1:-1;23728:23:0;;23637:122;;22956:402;;;;;;;;;;-1:-1:-1;22956:402:0;;;;;:::i;:::-;;:::i;16890:39::-;;;;;;;;;;-1:-1:-1;16890:39:0;;;;-1:-1:-1;;;;;16890:39:0;;;21586:201;;;;;;;;;;-1:-1:-1;21586:201:0;;;;;:::i;:::-;;:::i;18886:58::-;;;;;;;;;;-1:-1:-1;18886:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;18390:33;;;;;;;;;;-1:-1:-1;18390:33:0;;;;;;;;;;;18269:29;;;;;;;;;;;;;;;;18149:35;;;;;;;;;;;;;;;;18305:36;;;;;;;;;;;;;;;;18614:40;;;;;;;;;;-1:-1:-1;18614:40:0;;;;;;;;18998:35;;;;;;;;;;;;;;;;23509:120;;;;;;;;;;;;;:::i;18953:38::-;;;;;;;;;;;;;;;;18072:35;;;;;;;;;;;;;;;;21795:186;;;;;;;;;;-1:-1:-1;21795:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;21946:18:0;;;21914:7;21946:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21795:186;18040:25;;;;;;;;;;;;;;;;7082:281;;;;;;;;;;-1:-1:-1;7082:281:0;;;;;:::i;:::-;;:::i;19040:24::-;;;;;;;;;;;;;;;;21989:193;22091:4;22113:39;451:10;22136:7;22145:6;22113:8;:39::i;:::-;-1:-1:-1;22170:4:0;21989:193;;;;;:::o;22190:448::-;22324:4;22341:36;22351:6;22359:9;22370:6;22341:9;:36::i;:::-;22388:220;22411:6;451:10;22459:138;22515:6;22459:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22459:19:0;;;;;;:11;:19;;;;;;;;451:10;22459:33;;;;;;;;;;:37;:138::i;:::-;22388:8;:220::i;:::-;-1:-1:-1;22626:4:0;22190:448;;;;;:::o;24955:322::-;25049:7;25107;;25096;:18;;25074:110;;;;-1:-1:-1;;;25074:110:0;;4570:2:1;25074:110:0;;;4552:21:1;4609:2;4589:18;;;4582:30;4648:34;4628:18;;;4621:62;-1:-1:-1;;;4699:18:1;;;4692:40;4749:19;;25074:110:0;;;;;;;;;25195:19;25217:10;:8;:10::i;:::-;25195:32;-1:-1:-1;25245:24:0;:7;25195:32;25245:11;:24::i;:::-;25238:31;24955:322;-1:-1:-1;;;24955:322:0:o;22646:302::-;451:10;22763:4;22857:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;22857:34:0;;;;;;;;;;22763:4;;22785:133;;22835:7;;22857:50;;22896:10;22857:38;:50::i;24206:481::-;24326:7;17434:14;24359:7;:18;;24351:62;;;;-1:-1:-1;;;24351:62:0;;4981:2:1;24351:62:0;;;4963:21:1;5020:2;5000:18;;;4993:30;5059:33;5039:18;;;5032:61;5110:18;;24351:62:0;4779:355:1;24351:62:0;24429:17;24424:256;;24464:15;24493:19;24504:7;24493:10;:19::i;:::-;-1:-1:-1;24463:49:0;;-1:-1:-1;24527:14:0;;-1:-1:-1;;;;;24527:14:0;24424:256;24577:23;24612:19;24623:7;24612:10;:19::i;:::-;-1:-1:-1;24574:57:0;;-1:-1:-1;24646:22:0;;-1:-1:-1;;;;;24646:22:0;21380:198;-1:-1:-1;;;;;21470:20:0;;21446:7;21470:20;;;:11;:20;;;;;;;;21466:49;;;-1:-1:-1;;;;;;21499:16:0;;;;;:7;:16;;;;;;;21380:198::o;21466:49::-;-1:-1:-1;;;;;21553:16:0;;;;;;:7;:16;;;;;;21533:37;;:19;:37::i;6926:148::-;6839:6;;-1:-1:-1;;;;;6839:6:0;451:10;6839:22;6831:67;;;;-1:-1:-1;;;6831:67:0;;;;;;;:::i;:::-;7033:1:::1;7017:6:::0;;6996:40:::1;::::0;-1:-1:-1;;;;;7017:6:0;;::::1;::::0;6996:40:::1;::::0;7033:1;;6996:40:::1;7064:1;7047:19:::0;;-1:-1:-1;;;;;;7047:19:0::1;::::0;;6926:148::o;24755:192::-;24807:4;6839:6;;-1:-1:-1;;;;;6839:6:0;451:10;6839:22;6831:67;;;;-1:-1:-1;;;6831:67:0;;;;;;;:::i;:::-;-1:-1:-1;24823:14:0::1;:22:::0;;-1:-1:-1;;24823:22:0;;::::1;::::0;;;24856:14:::1;:22:::0;;;::::1;::::0;;24889:20:::1;:28:::0;;;;::::1;::::0;;24823:22;24755:192;:::o;25285:202::-;6839:6;;-1:-1:-1;;;;;6839:6:0;451:10;6839:22;6831:67;;;;-1:-1:-1;;;6831:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25375:39:0;::::1;;::::0;;;:31:::1;:39;::::0;;;;;;;;:46;;-1:-1:-1;;25375:46:0::1;::::0;::::1;;::::0;;::::1;::::0;;;25437:42;;1345:41:1;;;25437:42:0::1;::::0;1318:18:1;25437:42:0::1;;;;;;;25285:202:::0;;:::o;23767:244::-;6839:6;;-1:-1:-1;;;;;6839:6:0;451:10;6839:22;6831:67;;;;-1:-1:-1;;;6831:67:0;;;;;;;:::i;:::-;23874:13:::1;::::0;-1:-1:-1;;;;;23874:13:0;;::::1;23866:21:::0;;::::1;::::0;23858:91:::1;;;::::0;-1:-1:-1;;;23858:91:0;;5702:2:1;23858:91:0::1;::::0;::::1;5684:21:1::0;5741:2;5721:18;;;5714:30;5780:34;5760:18;;;5753:62;5851:27;5831:18;;;5824:55;5896:19;;23858:91:0::1;5500:421:1::0;23858:91:0::1;23962:41;23991:4;23997:5;23962:28;:41::i;:::-;23767:244:::0;;:::o;22956:402::-;23078:4;23100:228;451:10;23150:7;23172:145;23229:15;23172:145;;;;;;;;;;;;;;;;;451:10;23172:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;23172:34:0;;;;;;;;;;;;:38;:145::i;21586:201::-;21693:4;21715:42;451:10;21739:9;21750:6;21715:9;:42::i;23509:120::-;6839:6;;-1:-1:-1;;;;;6839:6:0;451:10;6839:22;6831:67;;;;-1:-1:-1;;;6831:67:0;;;;;;;:::i;:::-;23562:13:::1;:20:::0;;-1:-1:-1;;23562:20:0::1;;;::::0;;23593:21:::1;:28:::0;;-1:-1:-1;;;;23593:28:0::1;-1:-1:-1::0;;;23593:28:0::1;::::0;;23509:120::o;7082:281::-;6839:6;;-1:-1:-1;;;;;6839:6:0;451:10;6839:22;6831:67;;;;-1:-1:-1;;;6831:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7185:22:0;::::1;7163:110;;;::::0;-1:-1:-1;;;7163:110:0;;6128:2:1;7163:110:0::1;::::0;::::1;6110:21:1::0;6167:2;6147:18;;;6140:30;6206:34;6186:18;;;6179:62;-1:-1:-1;;;6257:18:1;;;6250:36;6303:19;;7163:110:0::1;5926:402:1::0;7163:110:0::1;7310:6;::::0;;7289:38:::1;::::0;-1:-1:-1;;;;;7289:38:0;;::::1;::::0;7310:6;::::1;::::0;7289:38:::1;::::0;::::1;7338:6;:17:::0;;-1:-1:-1;;;;;;7338:17:0::1;-1:-1:-1::0;;;;;7338:17:0;;;::::1;::::0;;;::::1;::::0;;7082:281::o;25495:371::-;-1:-1:-1;;;;;25622:19:0;;25614:68;;;;-1:-1:-1;;;25614:68:0;;6535:2:1;25614:68:0;;;6517:21:1;6574:2;6554:18;;;6547:30;6613:34;6593:18;;;6586:62;-1:-1:-1;;;6664:18:1;;;6657:34;6708:19;;25614:68:0;6333:400:1;25614:68:0;-1:-1:-1;;;;;25701:21:0;;25693:68;;;;-1:-1:-1;;;25693:68:0;;6940:2:1;25693:68:0;;;6922:21:1;6979:2;6959:18;;;6952:30;7018:34;6998:18;;;6991:62;-1:-1:-1;;;7069:18:1;;;7062:32;7111:19;;25693:68:0;6738:398:1;25693:68:0;-1:-1:-1;;;;;25774:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;25826:32;;713:25:1;;;25826:32:0;;686:18:1;25826:32:0;;;;;;;25495:371;;;:::o;25874:4162::-;-1:-1:-1;;;;;25996:16:0;;;;;;:38;;-1:-1:-1;;;;;;26016:18:0;;;;25996:38;25988:88;;;;-1:-1:-1;;;25988:88:0;;7343:2:1;25988:88:0;;;7325:21:1;7382:2;7362:18;;;7355:30;7421:34;7401:18;;;7394:62;-1:-1:-1;;;7472:18:1;;;7465:35;7517:19;;25988:88:0;7141:401:1;25988:88:0;26104:1;26095:6;:10;26087:64;;;;-1:-1:-1;;;26087:64:0;;7749:2:1;26087:64:0;;;7731:21:1;7788:2;7768:18;;;7761:30;7827:34;7807:18;;;7800:62;-1:-1:-1;;;7878:18:1;;;7871:39;7927:19;;26087:64:0;7547:405:1;26087:64:0;26167:14;;;;26164:2018;;;6750:7;6777:6;-1:-1:-1;;;;;26219:15:0;;;6777:6;;26219:15;;;;:49;;-1:-1:-1;6750:7:0;6777:6;-1:-1:-1;;;;;26255:13:0;;;6777:6;;26255:13;;26219:49;:86;;;;-1:-1:-1;;;;;;26289:16:0;;;;26219:86;:128;;;;-1:-1:-1;;;;;;26326:21:0;;26340:6;26326:21;;26219:128;:166;;;;-1:-1:-1;26369:16:0;;-1:-1:-1;;;26369:16:0;;;;26368:17;26219:166;26197:1974;;;26474:13;;;;;;;26466:51;;;;-1:-1:-1;;;26466:51:0;;8159:2:1;26466:51:0;;;8141:21:1;8198:2;8178:18;;;8171:30;8237:27;8217:18;;;8210:55;8282:18;;26466:51:0;7957:349:1;26466:51:0;26615:14;;;;:49;;;;-1:-1:-1;;;;;;26633:31:0;;;;;;:25;:31;;;;;;;;26615:49;26611:163;;;26712:13;;26697:11;:28;;26689:65;;;;-1:-1:-1;;;26689:65:0;;8513:2:1;26689:65:0;;;8495:21:1;8552:2;8532:18;;;8525:30;8591:26;8571:18;;;8564:54;8635:18;;26689:65:0;8311:348:1;26689:65:0;26930:20;;;;26926:423;;;6750:7;6777:6;-1:-1:-1;;;;;26978:13:0;;;6777:6;;26978:13;;;;:47;;-1:-1:-1;27009:15:0;;-1:-1:-1;;;;;26995:30:0;;;27009:15;;26995:30;;26978:47;:79;;;;-1:-1:-1;27043:13:0;;-1:-1:-1;;;;;27029:28:0;;;27043:13;;27029:28;;26978:79;26974:356;;;27122:9;27093:39;;;;:28;:39;;;;;;27135:12;-1:-1:-1;27085:140:0;;;;-1:-1:-1;;;27085:140:0;;8866:2:1;27085:140:0;;;8848:21:1;8905:2;8885:18;;;8878:30;8944:34;8924:18;;;8917:62;9015:34;8995:18;;;8988:62;-1:-1:-1;;;9066:19:1;;;9059:40;9116:19;;27085:140:0;8664:477:1;27085:140:0;27281:9;27252:39;;;;:28;:39;;;;;27294:12;27252:54;;26974:356;-1:-1:-1;;;;;27401:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;27437:35:0;;;;;;:31;:35;;;;;;;;27436:36;27401:71;27397:759;;;27515:20;;27505:6;:30;;27497:96;;;;-1:-1:-1;;;27497:96:0;;9348:2:1;27497:96:0;;;9330:21:1;9387:2;9367:18;;;9360:30;9426:34;9406:18;;;9399:62;-1:-1:-1;;;9477:18:1;;;9470:51;9538:19;;27497:96:0;9146:417:1;27497:96:0;27650:9;;27633:13;27643:2;27633:9;:13::i;:::-;27624:22;;:6;:22;:::i;:::-;:35;;27616:72;;;;-1:-1:-1;;;27616:72:0;;10032:2:1;27616:72:0;;;10014:21:1;10071:2;10051:18;;;10044:30;-1:-1:-1;;;10090:18:1;;;10083:54;10154:18;;27616:72:0;9830:348:1;27616:72:0;27397:759;;;-1:-1:-1;;;;;27764:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;27798:37:0;;;;;;:31;:37;;;;;;;;27797:38;27764:71;27760:396;;;27878:20;;27868:6;:30;;27860:97;;;;-1:-1:-1;;;27860:97:0;;10385:2:1;27860:97:0;;;10367:21:1;10424:2;10404:18;;;10397:30;10463:34;10443:18;;;10436:62;-1:-1:-1;;;10514:18:1;;;10507:52;10576:19;;27860:97:0;10183:418:1;27760:396:0;-1:-1:-1;;;;;28005:35:0;;;;;;:31;:35;;;;;;;;28000:156;;28098:9;;28081:13;28091:2;28081:9;:13::i;:::-;28072:22;;:6;:22;:::i;:::-;:35;;28064:72;;;;-1:-1:-1;;;28064:72:0;;10032:2:1;28064:72:0;;;10014:21:1;10071:2;10051:18;;;10044:30;-1:-1:-1;;;10090:18:1;;;10083:54;10154:18;;28064:72:0;9830:348:1;28064:72:0;28194:28;28225:24;28243:4;28225:9;:24::i;:::-;28315:23;;28402:16;;28194:55;;-1:-1:-1;28291:47:0;;;;-1:-1:-1;;;28402:16:0;;;;28401:17;:55;;;;-1:-1:-1;28435:21:0;;-1:-1:-1;;;28435:21:0;;;;28401:55;:97;;;;-1:-1:-1;;;;;;28474:24:0;;;;;;:18;:24;;;;;;;;28473:25;28401:97;:137;;;;-1:-1:-1;;;;;;28516:22:0;;;;;;:18;:22;;;;;;;;28515:23;28401:137;:177;;;;;28555:23;28401:177;:223;;;;-1:-1:-1;;;;;;28595:29:0;;;;;;:25;:29;;;;;;;;28401:223;28383:290;;;28651:10;:8;:10::i;:::-;28685:14;:12;:14::i;:::-;17992:1;28712:15;:26;-1:-1:-1;;;;;28841:24:0;;;;;;:18;:24;;;;;;;;28840:25;:52;;;;-1:-1:-1;;;;;;28870:22:0;;;;;;:18;:22;;;;;;;;28869:23;28840:52;28836:1013;;;-1:-1:-1;;;;;28933:31:0;;;;;;:25;:31;;;;;;;;28929:605;;;28995:10;;28985:7;:20;29075:16;;29059:13;;29040:16;;:32;;29059:13;29040:32;:::i;:::-;:51;;;;:::i;:::-;29024:13;:67;;;29113:17;29110:85;;17908:1;29154:15;:21;29110:85;28929:605;;;-1:-1:-1;;;;;29254:29:0;;;;;;:25;:29;;;;;;;;29250:284;;;29314:11;;29304:7;:21;29397:17;;29380:14;;29360:17;;:34;;29380:14;29360:34;:::i;:::-;:54;;;;:::i;:::-;29344:13;:70;;;29436:17;29433:86;;17948:1;29477:15;:22;29433:86;-1:-1:-1;;;;;29554:31:0;;;;;;:25;:31;;;;;;;;29550:288;;29641:15;;29605;;29623:35;;-1:-1:-1;;;;;29641:15:0;29623:9;:35::i;:::-;29605:53;-1:-1:-1;29680:11:0;;29677:146;;29758:15;;29730:4;;29715:34;;-1:-1:-1;;;;;29758:15:0;29730:4;29791:11;:7;29758:15;29791:11;:::i;:::-;29715:88;;-1:-1:-1;;;;;;29715:88:0;;;;;;;-1:-1:-1;;;;;10864:15:1;;;29715:88:0;;;10846:34:1;10916:15;;;;10896:18;;;10889:43;10948:18;;;10941:34;10781:18;;29715:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29677:146;29586:252;29550:288;-1:-1:-1;;;;;29864:24:0;;;;;;:18;:24;;;;;;;;29861:95;;;29904:40;29927:4;29933:2;29937:6;29904:22;:40::i;:::-;29968:32;29983:4;29989:2;29993:6;29968:14;:32::i;:::-;30013:15;40372;;40362:7;:25;40414:21;;40398:13;:37;40318:125;30013:15;25977:4059;;25874:4162;;;:::o;1877:226::-;1997:7;2033:12;2025:6;;;;2017:29;;;;-1:-1:-1;;;2017:29:0;;;;;;;;:::i;:::-;-1:-1:-1;2057:9:0;2069:5;2073:1;2069;:5;:::i;:::-;2057:17;1877:226;-1:-1:-1;;;;;1877:226:0:o;38009:164::-;38051:7;38072:15;38089;38108:19;:17;:19::i;:::-;38071:56;;-1:-1:-1;38071:56:0;-1:-1:-1;38145:20:0;38071:56;;38145:11;:20::i;:::-;38138:27;;;;38009:164;:::o;2369:132::-;2427:7;2454:39;2458:1;2461;2454:39;;;;;;;;;;;;;;;;;:3;:39::i;1544:181::-;1602:7;;1634:5;1638:1;1634;:5;:::i;:::-;1622:17;;1663:1;1658;:6;;1650:46;;;;-1:-1:-1;;;1650:46:0;;11571:2:1;1650:46:0;;;11553:21:1;11610:2;11590:18;;;11583:30;11649:29;11629:18;;;11622:57;11696:18;;1650:46:0;11369:351:1;36122:742:0;36222:7;36244;36266;36288;36310;36332;36382:23;36420:12;36447:18;36479:20;36491:7;36479:11;:20::i;:::-;36367:132;;;;;;36511:15;36528:23;36553:12;36569:113;36595:7;36617:4;36636:10;36661;:8;:10::i;:::-;36569:11;:113::i;:::-;36510:172;;;;-1:-1:-1;36510:172:0;;-1:-1:-1;36786:15:0;;-1:-1:-1;36816:4:0;;-1:-1:-1;36835:10:0;;-1:-1:-1;36122:742:0;;-1:-1:-1;;;;;36122:742:0:o;24019:179::-;-1:-1:-1;;;;;24102:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;24102:39:0;;;;;;;24152:38;24102:31;:39;24152:25;:38::i;30048:1628::-;19675:16;:23;;-1:-1:-1;;;;19675:23:0;-1:-1:-1;;;19675:23:0;;;;30125:24:::1;30143:4;30125:9;:24::i;:::-;30099:50;;30160:12;30183:25:::0;30252:22:::1;;30236:13;;30211:22;;:38;;;;:::i;:::-;:63;;;;:::i;:::-;30183:91:::0;-1:-1:-1;30288:22:0;;;:46:::1;;-1:-1:-1::0;30314:20:0;;30288:46:::1;30285:60;;;30337:7;;;;;30285:60;30357:26;30451:1;30430:17;30405:22;;30387:15;:40;;;;:::i;:::-;:60;;;;:::i;:::-;30386:66;;;;:::i;:::-;30357:95;;30463:26;30492:58;30536:13;;30492:39;30512:18;30492:15;:19;;:39;;;;:::i;:::-;:43:::0;::::1;:58::i;:::-;30463:87:::0;-1:-1:-1;30591:21:0::1;30625:36;30463:87:::0;30625:16:::1;:36::i;:::-;30674:18;30695:44;:21;30721:17:::0;30695:25:::1;:44::i;:::-;30674:65;;30752:23;30778:61;30821:17;30778:38;30793:22;;30778:10;:14;;:38;;;;:::i;:::-;:42:::0;::::1;:61::i;:::-;30752:87:::0;-1:-1:-1;30852:23:0::1;30878:28;30752:87:::0;30878:10;:28:::1;:::i;:::-;30852:54;;30971:19;30993:10;:8;:10::i;:::-;30971:32;;31014:15;31032:30;31050:11;31032:13;;:17;;:30;;;;:::i;:::-;31123:13;::::0;-1:-1:-1;;;;;31123:13:0::1;31107:31;::::0;;;:7:::1;:31;::::0;;;;;31014:48;;-1:-1:-1;31107:44:0::1;::::0;31014:48;31107:35:::1;:44::i;:::-;31089:13;::::0;;-1:-1:-1;;;;;31089:13:0;;::::1;31073:31;::::0;;;:7:::1;:31;::::0;;;;;;;:78;;;;31232:13;;31212;;;;::::1;31196:31:::0;;:7:::1;:31:::0;;;;;;;;:50:::1;::::0;:35:::1;:50::i;:::-;31178:13;::::0;-1:-1:-1;;;;;31178:13:0::1;31162:31;::::0;;;:7:::1;:31;::::0;;;;;;:84;;;;31259:22:::1;:26:::0;;;31296:17;;;;31324:22:::1;:26:::0;31366:22;;;;;:45:::1;;;31410:1;31392:15;:19;31366:45;31363:216;;;31427:49;31440:18;31460:15;31427:12;:49::i;:::-;31496:71;::::0;;12322:25:1;;;12378:2;12363:18;;12356:34;;;12406:18;;;12399:34;;;31496:71:0::1;::::0;12310:2:1;12295:18;31496:71:0::1;;;;;;;31363:216;31612:16;::::0;31604:64:::1;::::0;-1:-1:-1;;;;;31612:16:0;;::::1;::::0;31642:21:::1;::::0;31604:64:::1;::::0;;;31642:21;31612:16;31604:64:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;19709:1:0::1;19721:16:::0;:24;;-1:-1:-1;;;;19721:24:0;;;30048:1628::o;40075:235::-;40122:7;;:12;:34;;;;-1:-1:-1;40138:13:0;;:18;40122:34;40118:47;;;40075:235::o;40118:47::-;40195:7;;;40177:15;:25;40237:13;;;40213:21;:37;-1:-1:-1;40263:11:0;;;;40285:17;40075:235::o;33785:164::-;-1:-1:-1;;;;;33911:15:0;;;;;;;:11;:15;;;;;;;;:19;;;;;;;;;;;:30;;33934:7;;33911:15;:30;;33934:7;;33911:30;:::i;:::-;;;;-1:-1:-1;;;;;33785:164:0:o;32540:604::-;-1:-1:-1;;;;;32674:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;32698:22:0;;;;;;:11;:22;;;;;;;;32697:23;32674:46;32670:467;;;32737:48;32759:6;32767:9;32778:6;32737:21;:48::i;:::-;32540:604;;;:::o;32670:467::-;-1:-1:-1;;;;;32808:19:0;;;;;;:11;:19;;;;;;;;32807:20;:46;;;;-1:-1:-1;;;;;;32831:22:0;;;;;;:11;:22;;;;;;;;32807:46;32803:334;;;32870:46;32890:6;32898:9;32909:6;32870:19;:46::i;32803:334::-;-1:-1:-1;;;;;32938:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;32961:22:0;;;;;;:11;:22;;;;;;;;32938:45;32934:203;;;33000:48;33022:6;33030:9;33041:6;33000:21;:48::i;32934:203::-;33081:44;33099:6;33107:9;33118:6;33081:17;:44::i;38181:605::-;38279:7;;38232;;;;17434:14;38232:7;38333:338;38357:9;:16;38353:20;;38333:338;;;38441:7;38417;:21;38425:9;38435:1;38425:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;38425:12:0;38417:21;;;;;;;;;;;;;:31;;:83;;;38493:7;38469;:21;38477:9;38487:1;38477:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;38477:12:0;38469:21;;;;;;;;;;;;;:31;38417:83;38395:146;;;-1:-1:-1;;38524:7:0;;;17434:14;;-1:-1:-1;38181:605:0;-1:-1:-1;;38181:605:0:o;38395:146::-;38566:34;38578:7;:21;38586:9;38596:1;38586:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;38586:12:0;38578:21;;;;;;;;;;;;;38566:7;;:11;:34::i;:::-;38556:44;;38625:34;38637:7;:21;38645:9;38655:1;38645:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;38645:12:0;38637:21;;;;;;;;;;;;;38625:7;;:11;:34::i;:::-;38615:44;-1:-1:-1;38375:3:0;;;;:::i;:::-;;;;38333:338;;;-1:-1:-1;38695:7:0;;:20;;17434:14;38695:11;:20::i;:::-;38685:7;:30;38681:61;;;-1:-1:-1;;38725:7:0;;;17434:14;;-1:-1:-1;38181:605:0;-1:-1:-1;38181:605:0:o;38681:61::-;38761:7;;38770;;-1:-1:-1;38181:605:0;-1:-1:-1;38181:605:0:o;2509:312::-;2629:7;2664:12;2657:5;2649:28;;;;-1:-1:-1;;;2649:28:0;;;;;;;;:::i;:::-;-1:-1:-1;2688:9:0;2700:5;2704:1;2700;:5;:::i;37027:412::-;37128:7;37150;37172;37207:12;37222:24;37238:7;37222:15;:24::i;:::-;37207:39;;37257:18;37278:30;37300:7;37278:21;:30::i;:::-;37257:51;-1:-1:-1;37319:23:0;37345:33;37257:51;37345:17;:7;37357:4;37345:11;:17::i;:33::-;37319:59;37414:4;;-1:-1:-1;37420:10:0;;-1:-1:-1;37027:412:0;;-1:-1:-1;;;37027:412:0:o;37447:554::-;37646:7;;;;37743:24;:7;37755:11;37743;:24::i;:::-;37725:42;-1:-1:-1;37778:12:0;37793:21;:4;37802:11;37793:8;:21::i;:::-;37778:36;-1:-1:-1;37825:18:0;37846:27;:10;37861:11;37846:14;:27::i;:::-;37825:48;-1:-1:-1;37884:23:0;37910:33;37825:48;37910:17;:7;37922:4;37910:11;:17::i;:33::-;37962:7;;;;-1:-1:-1;37988:4:0;;-1:-1:-1;37447:554:0;;-1:-1:-1;;;;;;;37447:554:0:o;1733:136::-;1791:7;1818:43;1822:1;1825;1818:43;;;;;;;;;;;;;;;;;:3;:43::i;31684:471::-;31774:16;;;31788:1;31774:16;;;;;;;;31750:21;;31774:16;;;;;;;;;;-1:-1:-1;31774:16:0;31750:40;;31819:4;31801;31806:1;31801:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31801:23:0;;;:7;;;;;;;;;;:23;;;;31845:15;;:22;;;-1:-1:-1;;;31845:22:0;;;;:15;;;;;:20;;:22;;;;;31801:7;;31845:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31835:4;31840:1;31835:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31835:32:0;;;:7;;;;;;;;;:32;31910:15;;31878:62;;31895:4;;31910:15;31928:11;31878:8;:62::i;:::-;31951:15;;:196;;-1:-1:-1;;;31951:196:0;;-1:-1:-1;;;;;31951:15:0;;;;:66;;:196;;32032:11;;31951:15;;32074:4;;32101;;32121:15;;31951:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31739:416;31684:471;:::o;2111:250::-;2169:7;2193:1;2198;2193:6;2189:47;;-1:-1:-1;2223:1:0;2216:8;;2189:47;2248:9;2260:5;2264:1;2260;:5;:::i;:::-;2248:17;-1:-1:-1;2293:1:0;2284:5;2288:1;2248:17;2284:5;:::i;:::-;:10;2276:56;;;;-1:-1:-1;;;2276:56:0;;14501:2:1;2276:56:0;;;14483:21:1;14540:2;14520:18;;;14513:30;14579:34;14559:18;;;14552:62;-1:-1:-1;;;14630:18:1;;;14623:31;14671:19;;2276:56:0;14299:397:1;32163:369:0;32276:15;;32244:62;;32261:4;;-1:-1:-1;;;;;32276:15:0;32294:11;32244:8;:62::i;:::-;32317:15;;32467:16;;32317:207;;-1:-1:-1;;;32317:207:0;;32389:4;32317:207;;;15050:34:1;15100:18;;;15093:34;;;32317:15:0;15143:18:1;;;15136:34;;;15186:18;;;15179:34;-1:-1:-1;;;;;32467:16:0;;;15229:19:1;;;15222:44;32498:15:0;15282:19:1;;;15275:35;32317:15:0;;;:31;;32356:9;;14984:19:1;;32317:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34663:686::-;34814:15;34844:23;34882:12;34909:23;34947:12;34974:18;35006:19;35017:7;35006:10;:19::i;:::-;-1:-1:-1;;;;;35054:15:0;;;;;;:7;:15;;;;;;34799:226;;-1:-1:-1;34799:226:0;;-1:-1:-1;34799:226:0;;-1:-1:-1;34799:226:0;-1:-1:-1;34799:226:0;-1:-1:-1;34799:226:0;-1:-1:-1;35054:28:0;;35074:7;35054:19;:28::i;:::-;-1:-1:-1;;;;;35036:15:0;;;;;;:7;:15;;;;;;;;:46;;;;35111:7;:15;;;;:28;;35131:7;35111:19;:28::i;:::-;-1:-1:-1;;;;;35093:15:0;;;;;;;:7;:15;;;;;;:46;;;;35171:18;;;;;;;:39;;35194:15;35171:22;:39::i;:::-;-1:-1:-1;;;;;35150:18:0;;;;;;:7;:18;;;;;:60;35221:26;35236:10;35221:14;:26::i;:::-;35258:23;35270:4;35276;35258:11;:23::i;:::-;35314:9;-1:-1:-1;;;;;35297:44:0;35306:6;-1:-1:-1;;;;;35297:44:0;;35325:15;35297:44;;;;713:25:1;;701:2;686:18;;567:177;35297:44:0;;;;;;;;34788:561;;;;;;34663:686;;;:::o;33957:698::-;34106:15;34136:23;34174:12;34201:23;34239:12;34266:18;34298:19;34309:7;34298:10;:19::i;:::-;-1:-1:-1;;;;;34346:15:0;;;;;;:7;:15;;;;;;34091:226;;-1:-1:-1;34091:226:0;;-1:-1:-1;34091:226:0;;-1:-1:-1;34091:226:0;-1:-1:-1;34091:226:0;-1:-1:-1;34091:226:0;-1:-1:-1;34346:28:0;;34091:226;34346:19;:28::i;:::-;-1:-1:-1;;;;;34328:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;34406:18;;;;;:7;:18;;;;;:39;;34429:15;34406:22;:39::i;:::-;-1:-1:-1;;;;;34385:18:0;;;;;;:7;:18;;;;;;;;:60;;;;34477:7;:18;;;;:39;;34500:15;34477:22;:39::i;35357:757::-;35508:15;35538:23;35576:12;35603:23;35641:12;35668:18;35700:19;35711:7;35700:10;:19::i;:::-;-1:-1:-1;;;;;35748:15:0;;;;;;:7;:15;;;;;;35493:226;;-1:-1:-1;35493:226:0;;-1:-1:-1;35493:226:0;;-1:-1:-1;35493:226:0;-1:-1:-1;35493:226:0;-1:-1:-1;35493:226:0;-1:-1:-1;35748:28:0;;35768:7;35748:19;:28::i;:::-;-1:-1:-1;;;;;35730:15:0;;;;;;:7;:15;;;;;;;;:46;;;;35805:7;:15;;;;:28;;35825:7;35805:19;:28::i;33152:625::-;33299:15;33329:23;33367:12;33394:23;33432:12;33459:18;33491:19;33502:7;33491:10;:19::i;:::-;-1:-1:-1;;;;;33539:15:0;;;;;;:7;:15;;;;;;33284:226;;-1:-1:-1;33284:226:0;;-1:-1:-1;33284:226:0;;-1:-1:-1;33284:226:0;-1:-1:-1;33284:226:0;-1:-1:-1;33284:226:0;-1:-1:-1;33539:28:0;;33284:226;33539:19;:28::i;39755:130::-;39819:7;39846:31;39871:5;39846:20;39858:7;;39846;:11;;:20;;;;:::i;39893:174::-;39990:7;40022:37;40053:5;40022:26;40034:13;;40022:7;:11;;:26;;;;:::i;38794:953::-;17908:1;38860:15;;:22;38857:578;;38956:13;;38937:16;;38924:29;;:10;:29;:::i;:::-;:45;;;;:::i;:::-;38898:22;;:71;;;;;;;:::i;:::-;;;;-1:-1:-1;;39030:13:0;;39014;;39001:26;;:10;:26;:::i;:::-;:42;;;;:::i;:::-;38984:13;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;39116:13:0;;39097:16;;39084:29;;:10;:29;:::i;:::-;:45;;;;:::i;:::-;39058:22;;:71;;;;;;;:::i;:::-;;;;-1:-1:-1;38857:578:0;;-1:-1:-1;38857:578:0;;17948:1;39150:15;;:23;39147:288;;39248:13;;39228:17;;39215:30;;:10;:30;:::i;:::-;:46;;;;:::i;:::-;39189:22;;:72;;;;;;;:::i;:::-;;;;-1:-1:-1;;39323:13:0;;39306:14;;39293:27;;:10;:27;:::i;:::-;:43;;;;:::i;:::-;39276:13;;:60;;;;;;;:::i;:::-;;;;-1:-1:-1;;39410:13:0;;39390:17;;39377:30;;:10;:30;:::i;:::-;:46;;;;:::i;:::-;39351:22;;:72;;;;;;;:::i;:::-;;;;-1:-1:-1;;39147:288:0;39455:19;39477:10;:8;:10::i;:::-;39455:32;-1:-1:-1;39498:18:0;39519:27;:10;39455:32;39519:14;:27::i;:::-;39598:4;39582:22;;;;:7;:22;;;;;;39498:48;;-1:-1:-1;39582:38:0;;39498:48;39582:26;:38::i;:::-;39573:4;39557:22;;;;:7;:22;;;;;;;;:63;;;;39635:11;:26;;;;;;39631:108;;;39717:4;39701:22;;;;:7;:22;;;;;;:38;;39728:10;39701:26;:38::i;:::-;39692:4;39676:22;;;;:7;:22;;;;;:63;38846:901;;38794:953;:::o;36872:147::-;36950:7;;:17;;36962:4;36950:11;:17::i;:::-;36940:7;:27;36991:10;;:20;;37006:4;36991:14;:20::i;:::-;36978:10;:33;-1:-1:-1;;36872:147:0:o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;804:70;749:131;:::o;885:315::-;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1397:247::-;1456:6;1509:2;1497:9;1488:7;1484:23;1480:32;1477:52;;;1525:1;1522;1515:12;1477:52;1564:9;1551:23;1583:31;1608:5;1583:31;:::i;1884:456::-;1961:6;1969;1977;2030:2;2018:9;2009:7;2005:23;2001:32;1998:52;;;2046:1;2043;2036:12;1998:52;2085:9;2072:23;2104:31;2129:5;2104:31;:::i;:::-;2154:5;-1:-1:-1;2211:2:1;2196:18;;2183:32;2224:33;2183:32;2224:33;:::i;:::-;1884:456;;2276:7;;-1:-1:-1;;;2330:2:1;2315:18;;;;2302:32;;1884:456::o;2345:180::-;2404:6;2457:2;2445:9;2436:7;2432:23;2428:32;2425:52;;;2473:1;2470;2463:12;2425:52;-1:-1:-1;2496:23:1;;2345:180;-1:-1:-1;2345:180:1:o;2943:118::-;3029:5;3022:13;3015:21;3008:5;3005:32;2995:60;;3051:1;3048;3041:12;3066:309;3131:6;3139;3192:2;3180:9;3171:7;3167:23;3163:32;3160:52;;;3208:1;3205;3198:12;3160:52;3244:9;3231:23;3221:33;;3304:2;3293:9;3289:18;3276:32;3317:28;3339:5;3317:28;:::i;:::-;3364:5;3354:15;;;3066:309;;;;;:::o;3588:382::-;3653:6;3661;3714:2;3702:9;3693:7;3689:23;3685:32;3682:52;;;3730:1;3727;3720:12;3682:52;3769:9;3756:23;3788:31;3813:5;3788:31;:::i;:::-;3838:5;-1:-1:-1;3895:2:1;3880:18;;3867:32;3908:30;3867:32;3908:30;:::i;3975:388::-;4043:6;4051;4104:2;4092:9;4083:7;4079:23;4075:32;4072:52;;;4120:1;4117;4110:12;4072:52;4159:9;4146:23;4178:31;4203:5;4178:31;:::i;:::-;4228:5;-1:-1:-1;4285:2:1;4270:18;;4257:32;4298:33;4257:32;4298:33;:::i;5139:356::-;5341:2;5323:21;;;5360:18;;;5353:30;5419:34;5414:2;5399:18;;5392:62;5486:2;5471:18;;5139:356::o;9568:127::-;9629:10;9624:3;9620:20;9617:1;9610:31;9660:4;9657:1;9650:15;9684:4;9681:1;9674:15;9700:125;9765:9;;;9786:10;;;9783:36;;;9799:18;;:::i;10986:245::-;11053:6;11106:2;11094:9;11085:7;11081:23;11077:32;11074:52;;;11122:1;11119;11112:12;11074:52;11154:9;11148:16;11173:28;11195:5;11173:28;:::i;11236:128::-;11303:9;;;11324:11;;;11321:37;;;11338:18;;:::i;11725:168::-;11765:7;11831:1;11827;11823:6;11819:14;11816:1;11813:21;11808:1;11801:9;11794:17;11790:45;11787:71;;;11838:18;;:::i;:::-;-1:-1:-1;11878:9:1;;11725:168::o;11898:217::-;11938:1;11964;11954:132;;12008:10;12003:3;11999:20;11996:1;11989:31;12043:4;12040:1;12033:15;12071:4;12068:1;12061:15;11954:132;-1:-1:-1;12100:9:1;;11898:217::o;12654:127::-;12715:10;12710:3;12706:20;12703:1;12696:31;12746:4;12743:1;12736:15;12770:4;12767:1;12760:15;12786:135;12825:3;12846:17;;;12843:43;;12866:18;;:::i;:::-;-1:-1:-1;12913:1:1;12902:13;;12786:135::o;13058:251::-;13128:6;13181:2;13169:9;13160:7;13156:23;13152:32;13149:52;;;13197:1;13194;13187:12;13149:52;13229:9;13223:16;13248:31;13273:5;13248:31;:::i;13314:980::-;13576:4;13624:3;13613:9;13609:19;13655:6;13644:9;13637:25;13681:2;13719:6;13714:2;13703:9;13699:18;13692:34;13762:3;13757:2;13746:9;13742:18;13735:31;13786:6;13821;13815:13;13852:6;13844;13837:22;13890:3;13879:9;13875:19;13868:26;;13929:2;13921:6;13917:15;13903:29;;13950:1;13960:195;13974:6;13971:1;13968:13;13960:195;;;14039:13;;-1:-1:-1;;;;;14035:39:1;14023:52;;14130:15;;;;14095:12;;;;14071:1;13989:9;13960:195;;;-1:-1:-1;;;;;;;14211:32:1;;;;14206:2;14191:18;;14184:60;-1:-1:-1;;;14275:3:1;14260:19;14253:35;14172:3;13314:980;-1:-1:-1;;;13314:980:1:o;15321:306::-;15409:6;15417;15425;15478:2;15466:9;15457:7;15453:23;15449:32;15446:52;;;15494:1;15491;15484:12;15446:52;15523:9;15517:16;15507:26;;15573:2;15562:9;15558:18;15552:25;15542:35;;15617:2;15606:9;15602:18;15596:25;15586:35;;15321:306;;;;;:::o

Swarm Source

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