ETH Price: $3,397.28 (+2.45%)

Token

Rick and Morty V2 (RAM)
 

Overview

Max Total Supply

1,000,000,000,000,000,000 RAM

Holders

303

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

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:
RAM

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-16
*/

pragma solidity ^0.8.4;

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;

    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 getTime() public view returns (uint256) {
        return block.timestamp;
    }

}

// pragma solidity >=0.5.0;
interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

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

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

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

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

// pragma solidity >=0.5.0;
interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint 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 (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint 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 (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    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 (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// pragma solidity >=0.6.2;
interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

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

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

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

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

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

    address payable public marketingAddress = payable(0x45e4DE6ab4FB70F0a14A67F5a905a41699fD409f); 
    //Send to Payback address
    address payable public paybackAddress = payable(0x924b654D77B8D6A8FF02986518D8e79E5199b5F7);// 
    address public immutable deadAddress = 0x000000000000000000000000000000000000dEaD;
    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 _isExcludedFromMaxTxAmount;

    mapping (address => bool) private _isExcluded;
    address[] private _excluded;

    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 1000000000000 * 10**6 * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string private _name = "Rick and Morty V2";
    string private _symbol = "RAM";
    uint8 private _decimals = 9;


    uint256 public _taxFee = 2;
    uint256 private _previousTaxFee = _taxFee;

    uint256 public _liquidityFee = 8;
    uint256 private _previousLiquidityFee = _liquidityFee;

    uint256 public marketingDivisor = 8;

    uint256 public _maxTxAmount = 10000000000 * 10**6 * 10**9;
    uint256 private constant numTokensSellToAddToLiquidity = 1990000000 * 10**5 * 10**9;
    uint256 private constant numTokensSellToAddToBuyback = 1 * 10**5 * 10**9;
    uint256 private minimumTokensBeforeSwap = 2000000000 * 10**6 * 10**9;
    uint256 private buyBackUpperLimit = 1 * 10**18;

    uint256 public lastBuybackTimestamp;
    uint256 public minTimeToBuyback = 3; // 3 seconds

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = false;
    bool public buyBackEnabled = true;


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

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

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

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

    constructor () {
        _rOwned[_msgSender()] = _rTotal;

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;


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

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

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

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

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

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

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

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

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

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

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

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

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

    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

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

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

    function buyBackUpperLimitAmount() public view returns (uint256) {
        return buyBackUpperLimit;
    }

    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }


    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public 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;
        }
    }

    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 excludeFromReward(address account) public onlyOwner() {

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

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

    function _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(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        if(from != owner() && to != owner() && !_isExcludedFromMaxTxAmount[from]) {
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >= minimumTokensBeforeSwap;
        if (!inSwapAndLiquify && swapAndLiquifyEnabled && to == uniswapV2Pair) {
            if (overMinimumTokenBalance) {
                contractTokenBalance = numTokensSellToAddToBuyback;
                swapTokens(contractTokenBalance);
            }

	        uint256 balance = address(this).balance;
            if (buyBackEnabled && balance > uint256(1 * 10**18)) {
              uint256 tokenSwapRate = _getTokenSwapRate();
              uint256 minTransferAmountToBuyBack = tokenSwapRate.mul(buyBackUpperLimit).div(100).div(10**18);
              if (balance > buyBackUpperLimit) {
                if (amount >= minTransferAmountToBuyBack) {
                  balance = buyBackUpperLimit;
                  buyBackTokens(balance.div(100));
                } else if (block.timestamp > lastBuybackTimestamp + minTimeToBuyback) {
                  uint256 lowBuyBack = amount.mul(10**18).div(tokenSwapRate);
                  buyBackTokens(lowBuyBack);
                  lastBuybackTimestamp = block.timestamp;
                }
              }
            }
        }

        // ADDED: Automatic Liquidity
        if(contractTokenBalance >= _maxTxAmount)
        {
            contractTokenBalance = _maxTxAmount;
        }
        bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity;
        if (
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            from != uniswapV2Pair &&
            swapAndLiquifyEnabled
        ) {
            contractTokenBalance = numTokensSellToAddToLiquidity;
            //add liquidity
            swapAndLiquify(contractTokenBalance);
        }
        bool takeFee = true;
        //if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }

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

    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        // split the contract balance into halves
        uint256 half = contractTokenBalance.div(2);
        uint256 otherHalf = contractTokenBalance.sub(half);

        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        // swap tokens for ETH
        swapTokensForEth(half); //

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance.sub(initialBalance);

        // add liquidity to pancake
        addLiquidity(otherHalf, newBalance);

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapTokens(uint256 contractTokenBalance) private lockTheSwap {

        uint256 initialBalance = address(this).balance;
        swapTokensForEth(contractTokenBalance);
        uint256 transferredBalance = address(this).balance.sub(initialBalance);

        //Send to Marketing address
        transferToAddressETH(marketingAddress, transferredBalance.div(_liquidityFee).mul(marketingDivisor).mul(5).div(8));
        //Send to Payback address
        transferToAddressETH(paybackAddress, transferredBalance.div(_liquidityFee).mul(marketingDivisor).mul(3).div(8));

    }


    function buyBackTokens(uint256 amount) private lockTheSwap {
    	if (amount > 0) {
    	    swapETHForTokens(amount);
	    }
    }

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

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

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

        emit SwapTokensForETH(tokenAmount, path);
    }

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

      // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
            0, // accept any amount of Tokens
            path,
            deadAddress, // Burn address
            block.timestamp.add(300)
        );

        emit SwapETHForTokens(amount, path);
    }

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

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

    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private {
        if(!takeFee)
            removeAllFee();

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

        if(!takeFee)
            restoreAllFee();
    }

    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 _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 _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    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 _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 _getTokenSwapRate() private view returns(uint256) {
      IUniswapV2Pair pair = IUniswapV2Pair(uniswapV2Pair);
      (uint Res0, uint Res1,) = pair.getReserves();
      return Res0.div(Res1).mul(10**18); // return amount of token0 needed to buy token1
    }

    function _takeLiquidity(uint256 tLiquidity) private {
        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;
    }

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

    function isExcludedFromMaxTxAmount(address account) public view returns(bool) {
        return _isExcludedFromMaxTxAmount[account];
    }

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

    function excludeFromMaxTxAmount(address account) public onlyOwner {
        _isExcludedFromMaxTxAmount[account] = true;
    }

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

    function setTaxFeePercent(uint256 taxFee) external onlyOwner() {
        _taxFee = taxFee;
    }

    function setLiquidityFeePercent(uint256 liquidityFee) external onlyOwner() {
        _liquidityFee = liquidityFee;
    }

    function setMaxTxAmount(uint256 maxTxAmount) external onlyOwner() {
        _maxTxAmount = maxTxAmount;
    }

    function setMarketingDivisor(uint256 divisor) external onlyOwner() {
        marketingDivisor = divisor;
    }

    function setNumTokensSellToAddToLiquidity(uint256 _minimumTokensBeforeSwap) external onlyOwner() {
        minimumTokensBeforeSwap = _minimumTokensBeforeSwap;
    }

     function setBuybackUpperLimit(uint256 buyBackLimit) external onlyOwner() {
        buyBackUpperLimit = buyBackLimit * 10**18;
    }

    function setMarketingAddress(address _marketingAddress) external onlyOwner() {
        marketingAddress = payable(_marketingAddress);
    }

    //Send to Payback address
     function setpaybackAddress(address _paybackAddress) external onlyOwner() {
        paybackAddress = payable(_paybackAddress);
    }


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

    function setBuyBackEnabled(bool _enabled) public onlyOwner {
        buyBackEnabled = _enabled;
        emit BuyBackEnabledUpdated(_enabled);
    }

    function prepareForPreSale() external onlyOwner {
        setSwapAndLiquifyEnabled(false);
        _taxFee = 0;
        _liquidityFee = 0;
        _maxTxAmount = 1000000000000 * 10**6 * 10**9;
    }

     function afterPreSale() external onlyOwner {
        setSwapAndLiquifyEnabled(true);
        _taxFee = 2;
        _liquidityFee = 8;
        _maxTxAmount = 10000000000 * 10**6 * 10**9;
    }

    function transferToAddressETH(address payable recipient, uint256 amount) private {
        recipient.transfer(amount);
    }

     //to recieve ETH from uniswapV2Router when swaping
    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":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"BuyBackEnabledUpdated","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":"tokenAmount","type":"uint256"}],"name":"RewardLiquidityProviders","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":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"afterPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackUpperLimitAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxTxAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBuybackTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTimeToBuyback","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":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paybackAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prepareForPreSale","outputs":[],"stateMutability":"nonpayable","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setBuyBackEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyBackLimit","type":"uint256"}],"name":"setBuybackUpperLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidityFee","type":"uint256"}],"name":"setLiquidityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingAddress","type":"address"}],"name":"setMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setMarketingDivisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumTokensBeforeSwap","type":"uint256"}],"name":"setNumTokensSellToAddToLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFee","type":"uint256"}],"name":"setTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_paybackAddress","type":"address"}],"name":"setpaybackAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e0604052600180546001600160a01b03199081167345e4de6ab4fb70f0a14a67f5a905a41699fd409f179091556002805490911673924b654d77b8d6a8ff02986518d8e79e5199b5f71790556ddead0000000000000000000000006080526b033b2e3c9fd0803ce8000000600a8190556200007e906000196200055b565b6200008c90600019620004fa565b600b55604080518082019091526011808252702934b1b59030b7321026b7b93a3c902b1960791b6020909201918252620000c991600d9162000424565b506040805180820190915260038082526252414d60e81b6020909201918252620000f691600e9162000424565b50600f805460ff19166009179055600260108190556011556008601281905560138190556014556a084595161401484a0000006015556a01a784379d99db42000000601655670de0b6b3a76400006017556003601955601a805462ffff001916620100001790553480156200016a57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600b543360009081526003602090815260409182902092909255805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d92839263c45a01559260048083019392829003018186803b1580156200020e57600080fd5b505afa15801562000223573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002499190620004ca565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200029257600080fd5b505afa158015620002a7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002cd9190620004ca565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200031657600080fd5b505af11580156200032b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003519190620004ca565b6001600160601b0319606091821b811660c0529082901b1660a052600160066000620003856000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526006909252902080549091166001179055620003cd3390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600a546040516200041591815260200190565b60405180910390a3506200057c565b82805462000432906200051e565b90600052602060002090601f016020900481019282620004565760008555620004a1565b82601f106200047157805160ff1916838001178555620004a1565b82800160010185558215620004a1579182015b82811115620004a157825182559160200191906001019062000484565b50620004af929150620004b3565b5090565b5b80821115620004af5760008155600101620004b4565b600060208284031215620004dc578081fd5b81516001600160a01b0381168114620004f3578182fd5b9392505050565b6000828210156200051957634e487b7160e01b81526011600452602481fd5b500390565b600181811c908216806200053357607f821691505b602082108114156200055557634e487b7160e01b600052602260045260246000fd5b50919050565b6000826200057757634e487b7160e01b81526012600452602481fd5b500690565b60805160601c60a05160601c60c05160601c61324f62000609600039600081816105eb01528181611a8001528181611bdd0152611ee3015260008181610408015281816124f7015281816125cd01528181612609015281816127140152818161281e015281816128fc015261298101526000818161049f015281816128490152612953015261324f6000f3fe6080604052600436106103395760003560e01c80636bc87c3a116101ab578063a073d37f116100f7578063d3b64ecd11610095578063ea2f0b371161006f578063ea2f0b37146109cf578063ec28438a146109ef578063f0f165af14610a0f578063f2fde38b14610a2f57600080fd5b8063d3b64ecd1461093a578063d6b513cf14610973578063dd62ed3e1461098957600080fd5b8063a9059cbb116100d1578063a9059cbb146108c5578063b0cb81f1146108e5578063bdc653ef14610905578063c49b9a801461091a57600080fd5b8063a073d37f14610870578063a457c2d714610885578063a5ece941146108a557600080fd5b806382d2a4bb116101645780638da5cb5b1161013e5780638da5cb5b146107fd5780638ee88c531461081b578063906e9dd01461083b57806395d89b411461085b57600080fd5b806382d2a4bb1461078e57806388f82020146107ae5780638a04c283146107e757600080fd5b80636bc87c3a146106ed57806370a0823114610703578063715018a614610723578063763d58ea146107385780637d1db4a5146107585780637e3f56061461076e57600080fd5b80633685d419116102855780634a74bb021161022357806352390c02116101fd57806352390c02146106615780635342acb414610681578063557ed1ba146106ba5780636053a0e3146106cd57600080fd5b80634a74bb021461060d5780635134f6ab1461062c57806351b1ae0d1461064157600080fd5b80633bd5d1731161025f5780633bd5d17314610579578063437823ec146105995780634549b039146105b957806349bd5a5e146105d957600080fd5b80633685d4191461052357806339509351146105435780633b124fe71461056357600080fd5b806318160ddd116102f257806327c8f835116102cc57806327c8f8351461048d57806329370cc6146104c15780632d838119146104e1578063313ce5671461050157600080fd5b806318160ddd14610442578063218656e41461045757806323b872dd1461046d57600080fd5b8063061c82d01461034557806306fdde031461036757806307efbfdc14610392578063095ea7b3146103a757806313114a9d146103d75780631694505e146103f657600080fd5b3661034057005b600080fd5b34801561035157600080fd5b50610365610360366004612f0d565b610a4f565b005b34801561037357600080fd5b5061037c610a87565b6040516103899190612ff5565b60405180910390f35b34801561039e57600080fd5b50610365610b19565b3480156103b357600080fd5b506103c76103c2366004612e7a565b610b68565b6040519015158152602001610389565b3480156103e357600080fd5b50600c545b604051908152602001610389565b34801561040257600080fd5b5061042a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610389565b34801561044e57600080fd5b50600a546103e8565b34801561046357600080fd5b506103e860185481565b34801561047957600080fd5b506103c7610488366004612e3a565b610b7f565b34801561049957600080fd5b5061042a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104cd57600080fd5b506103656104dc366004612ea5565b610be8565b3480156104ed57600080fd5b506103e86104fc366004612f0d565b610c68565b34801561050d57600080fd5b50600f5460405160ff9091168152602001610389565b34801561052f57600080fd5b5061036561053e366004612dca565b610cec565b34801561054f57600080fd5b506103c761055e366004612e7a565b610edb565b34801561056f57600080fd5b506103e860105481565b34801561058557600080fd5b50610365610594366004612f0d565b610f11565b3480156105a557600080fd5b506103656105b4366004612dca565b610ffb565b3480156105c557600080fd5b506103e86105d4366004612f25565b611049565b3480156105e557600080fd5b5061042a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561061957600080fd5b50601a546103c790610100900460ff1681565b34801561063857600080fd5b506103656110d6565b34801561064d57600080fd5b5060025461042a906001600160a01b031681565b34801561066d57600080fd5b5061036561067c366004612dca565b611126565b34801561068d57600080fd5b506103c761069c366004612dca565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156106c657600080fd5b50426103e8565b3480156106d957600080fd5b50601a546103c79062010000900460ff1681565b3480156106f957600080fd5b506103e860125481565b34801561070f57600080fd5b506103e861071e366004612dca565b611279565b34801561072f57600080fd5b506103656112d8565b34801561074457600080fd5b50610365610753366004612dca565b61134c565b34801561076457600080fd5b506103e860155481565b34801561077a57600080fd5b50610365610789366004612dca565b611398565b34801561079a57600080fd5b506103656107a9366004612f0d565b6113e6565b3480156107ba57600080fd5b506103c76107c9366004612dca565b6001600160a01b031660009081526008602052604090205460ff1690565b3480156107f357600080fd5b506103e860195481565b34801561080957600080fd5b506000546001600160a01b031661042a565b34801561082757600080fd5b50610365610836366004612f0d565b611428565b34801561084757600080fd5b50610365610856366004612dca565b611457565b34801561086757600080fd5b5061037c6114a3565b34801561087c57600080fd5b506016546103e8565b34801561089157600080fd5b506103c76108a0366004612e7a565b6114b2565b3480156108b157600080fd5b5060015461042a906001600160a01b031681565b3480156108d157600080fd5b506103c76108e0366004612e7a565b611501565b3480156108f157600080fd5b50610365610900366004612f0d565b61150e565b34801561091157600080fd5b506017546103e8565b34801561092657600080fd5b50610365610935366004612ea5565b61153d565b34801561094657600080fd5b506103c7610955366004612dca565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561097f57600080fd5b506103e860145481565b34801561099557600080fd5b506103e86109a4366004612e02565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b3480156109db57600080fd5b506103656109ea366004612dca565b6115b0565b3480156109fb57600080fd5b50610365610a0a366004612f0d565b6115fb565b348015610a1b57600080fd5b50610365610a2a366004612f0d565b61162a565b348015610a3b57600080fd5b50610365610a4a366004612dca565b611659565b6000546001600160a01b03163314610a825760405162461bcd60e51b8152600401610a7990613048565b60405180910390fd5b601055565b6060600d8054610a9690613148565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac290613148565b8015610b0f5780601f10610ae457610100808354040283529160200191610b0f565b820191906000526020600020905b815481529060010190602001808311610af257829003601f168201915b5050505050905090565b6000546001600160a01b03163314610b435760405162461bcd60e51b8152600401610a7990613048565b610b4d600161153d565b600260105560086012556a084595161401484a000000601555565b6000610b75338484611743565b5060015b92915050565b6000610b8c848484611867565b610bde8433610bd9856040518060600160405280602881526020016131cd602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190611ca0565b611743565b5060019392505050565b6000546001600160a01b03163314610c125760405162461bcd60e51b8152600401610a7990613048565b601a8054821515620100000262ff0000199091161790556040517f3794234fa370c9f3b948dda3e3040530785b2ef1eb27dda3ffde478f4e2643c090610c5d90831515815260200190565b60405180910390a150565b6000600b54821115610ccf5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610a79565b6000610cd9611cda565b9050610ce58382611cfd565b9392505050565b6000546001600160a01b03163314610d165760405162461bcd60e51b8152600401610a7990613048565b6001600160a01b03811660009081526008602052604090205460ff16610d7e5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a79565b60005b600954811015610ed757816001600160a01b031660098281548110610db657634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610ec55760098054610de190600190613131565b81548110610dff57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600980546001600160a01b039092169183908110610e3957634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600482526040808220829055600890925220805460ff191690556009805480610e9f57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610ecf81613183565b915050610d81565b5050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610b75918590610bd99086611d3f565b3360008181526008602052604090205460ff1615610f865760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610a79565b6000610f9183611d9e565b505050506001600160a01b038416600090815260036020526040902054919250610fbd91905082611ded565b6001600160a01b038316600090815260036020526040902055600b54610fe39082611ded565b600b55600c54610ff39084611d3f565b600c55505050565b6000546001600160a01b031633146110255760405162461bcd60e51b8152600401610a7990613048565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000600a5483111561109d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610a79565b816110bc5760006110ad84611d9e565b50939550610b79945050505050565b60006110c784611d9e565b50929550610b79945050505050565b6000546001600160a01b031633146111005760405162461bcd60e51b8152600401610a7990613048565b61110a600061153d565b600060108190556012556b033b2e3c9fd0803ce8000000601555565b6000546001600160a01b031633146111505760405162461bcd60e51b8152600401610a7990613048565b6001600160a01b03811660009081526008602052604090205460ff16156111b95760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a79565b6001600160a01b03811660009081526003602052604090205415611213576001600160a01b0381166000908152600360205260409020546111f990610c68565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600860205260408120805460ff191660019081179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319169091179055565b6001600160a01b03811660009081526008602052604081205460ff16156112b657506001600160a01b031660009081526004602052604090205490565b6001600160a01b038216600090815260036020526040902054610b7990610c68565b6000546001600160a01b031633146113025760405162461bcd60e51b8152600401610a7990613048565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146113765760405162461bcd60e51b8152600401610a7990613048565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146113c25760405162461bcd60e51b8152600401610a7990613048565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000546001600160a01b031633146114105760405162461bcd60e51b8152600401610a7990613048565b61142281670de0b6b3a7640000613112565b60175550565b6000546001600160a01b031633146114525760405162461bcd60e51b8152600401610a7990613048565b601255565b6000546001600160a01b031633146114815760405162461bcd60e51b8152600401610a7990613048565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6060600e8054610a9690613148565b6000610b753384610bd9856040518060600160405280602581526020016131f5602591393360009081526005602090815260408083206001600160a01b038d1684529091529020549190611ca0565b6000610b75338484611867565b6000546001600160a01b031633146115385760405162461bcd60e51b8152600401610a7990613048565b601455565b6000546001600160a01b031633146115675760405162461bcd60e51b8152600401610a7990613048565b601a80548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610c5d90831515815260200190565b6000546001600160a01b031633146115da5760405162461bcd60e51b8152600401610a7990613048565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b031633146116255760405162461bcd60e51b8152600401610a7990613048565b601555565b6000546001600160a01b031633146116545760405162461bcd60e51b8152600401610a7990613048565b601655565b6000546001600160a01b031633146116835760405162461bcd60e51b8152600401610a7990613048565b6001600160a01b0381166116e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a79565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166117a55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a79565b6001600160a01b0382166118065760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a79565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166118cb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a79565b6001600160a01b03821661192d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a79565b6000811161198f5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610a79565b6000546001600160a01b038481169116148015906119bb57506000546001600160a01b03838116911614155b80156119e057506001600160a01b03831660009081526007602052604090205460ff16155b15611a4857601554811115611a485760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610a79565b6000611a5330611279565b601654601a549192508210159060ff16158015611a775750601a54610100900460ff165b8015611ab457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316145b15611ba6578015611ad157655af3107a40009150611ad182611e2f565b601a54479062010000900460ff168015611af25750670de0b6b3a764000081115b15611ba4576000611b01611ede565b90506000611b31670de0b6b3a7640000611b2b6064611b2b60175487611fa790919063ffffffff16565b90611cfd565b9050601754831115611ba157808610611b61576017549250611b5c611b57846064611cfd565b612026565b611ba1565b601954601854611b7191906130da565b421115611ba1576000611b9083611b2b89670de0b6b3a7640000611fa7565b9050611b9b81612026565b50426018555b50505b505b6015548210611bb55760155491505b692a23cfc614d00e60000082108015908190611bd45750601a5460ff16155b8015611c1257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614155b8015611c255750601a54610100900460ff165b15611c4057692a23cfc614d00e6000009250611c408361204f565b6001600160a01b03861660009081526006602052604090205460019060ff1680611c8257506001600160a01b03861660009081526006602052604090205460ff165b15611c8b575060005b611c97878787846120ed565b50505050505050565b60008184841115611cc45760405162461bcd60e51b8152600401610a799190612ff5565b506000611cd18486613131565b95945050505050565b6000806000611ce7612218565b9092509050611cf68282611cfd565b9250505090565b6000610ce583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506123d2565b600080611d4c83856130da565b905083811015610ce55760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a79565b6000806000806000806000806000611db58a612400565b9250925092506000806000611dd38d8686611dce611cda565b612442565b919f909e50909c50959a5093985091965092945050505050565b6000610ce583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ca0565b601a805460ff1916600117905547611e4682612492565b6000611e524783611ded565b9050611e9d600160009054906101000a90046001600160a01b0316611e986008611b2b6005611e92601454611e926012548a611cfd90919063ffffffff16565b90611fa7565b6126b6565b600254601454601254611ecf926001600160a01b031691611e9891600891611b2b91600391611e929182908a90611cfd565b5050601a805460ff1916905550565b6000807f00000000000000000000000000000000000000000000000000000000000000009050600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611f4057600080fd5b505afa158015611f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f789190612ebf565b506001600160701b039182169350169050611f9f670de0b6b3a7640000611e928484611cfd565b935050505090565b600082611fb657506000610b79565b6000611fc28385613112565b905082611fcf85836130f2565b14610ce55760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a79565b601a805460ff19166001179055801561204257612042816126f1565b50601a805460ff19169055565b601a805460ff191660011790556000612069826002611cfd565b905060006120778383611ded565b90504761208383612492565b600061208f4783611ded565b905061209b83826128f6565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601a805460ff19169055505050565b806120fa576120fa612a06565b6001600160a01b03841660009081526008602052604090205460ff16801561213b57506001600160a01b03831660009081526008602052604090205460ff16155b156121505761214b848484612a34565b6121fc565b6001600160a01b03841660009081526008602052604090205460ff1615801561219157506001600160a01b03831660009081526008602052604090205460ff165b156121a15761214b848484612b5a565b6001600160a01b03841660009081526008602052604090205460ff1680156121e157506001600160a01b03831660009081526008602052604090205460ff165b156121f15761214b848484612c03565b6121fc848484612c76565b8061221257612212601154601055601354601255565b50505050565b600b54600a546000918291825b6009548110156123a25782600360006009848154811061225557634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806122ce57508160046000600984815481106122a757634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156122e457600b54600a54945094505050509091565b612338600360006009848154811061230c57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611ded565b925061238e600460006009848154811061236257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611ded565b91508061239a81613183565b915050612225565b50600a54600b546123b291611cfd565b8210156123c957600b54600a549350935050509091565b90939092509050565b600081836123f35760405162461bcd60e51b8152600401610a799190612ff5565b506000611cd184866130f2565b60008060008061240f85612cba565b9050600061241c86612cd6565b905060006124348261242e8986611ded565b90611ded565b979296509094509092505050565b60008080806124518886611fa7565b9050600061245f8887611fa7565b9050600061246d8888611fa7565b9050600061247f8261242e8686611ded565b939b939a50919850919650505050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106124d557634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561254e57600080fd5b505afa158015612562573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125869190612de6565b816001815181106125a757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250506125f2307f000000000000000000000000000000000000000000000000000000000000000084611743565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac9479061264790859060009086903090429060040161309e565b600060405180830381600087803b15801561266157600080fd5b505af1158015612675573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a782826040516126aa92919061307d565b60405180910390a15050565b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156126ec573d6000803e3d6000fd5b505050565b6040805160028082526060820183526000926020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561276b57600080fd5b505afa15801561277f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a39190612de6565b816000815181106127c457634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061280657634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101527f00000000000000000000000000000000000000000000000000000000000000001663b6f9de95836000847f00000000000000000000000000000000000000000000000000000000000000006128744261012c611d3f565b6040518663ffffffff1660e01b81526004016128939493929190612fc0565b6000604051808303818588803b1580156128ac57600080fd5b505af11580156128c0573d6000803e3d6000fd5b50505050507f6fd378a9d8b7345c2e5b18229aaf1e39d32b177b501d0a0d26a0a858a23a962482826040516126aa92919061307d565b612921307f000000000000000000000000000000000000000000000000000000000000000084611743565b60405163f305d71960e01b81523060048201526024810183905260006044820181905260648201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660848301524260a48301527f0000000000000000000000000000000000000000000000000000000000000000169063f305d71990839060c4016060604051808303818588803b1580156129c657600080fd5b505af11580156129da573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906129ff9190612f50565b5050505050565b601054158015612a165750601254155b15612a1d57565b601080546011556012805460135560009182905555565b600080600080600080612a4687611d9e565b6001600160a01b038f16600090815260046020526040902054959b50939950919750955093509150612a789088611ded565b6001600160a01b038a16600090815260046020908152604080832093909355600390522054612aa79087611ded565b6001600160a01b03808b1660009081526003602052604080822093909355908a1681522054612ad69086611d3f565b6001600160a01b038916600090815260036020526040902055612af881612cf2565b612b028483612d7a565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612b4791815260200190565b60405180910390a3505050505050505050565b600080600080600080612b6c87611d9e565b6001600160a01b038f16600090815260036020526040902054959b50939950919750955093509150612b9e9087611ded565b6001600160a01b03808b16600090815260036020908152604080832094909455918b16815260049091522054612bd49084611d3f565b6001600160a01b038916600090815260046020908152604080832093909355600390522054612ad69086611d3f565b600080600080600080612c1587611d9e565b6001600160a01b038f16600090815260046020526040902054959b50939950919750955093509150612c479088611ded565b6001600160a01b038a16600090815260046020908152604080832093909355600390522054612b9e9087611ded565b600080600080600080612c8887611d9e565b6001600160a01b038f16600090815260036020526040902054959b50939950919750955093509150612aa79087611ded565b6000610b796064611b2b60105485611fa790919063ffffffff16565b6000610b796064611b2b60125485611fa790919063ffffffff16565b6000612cfc611cda565b90506000612d0a8383611fa7565b30600090815260036020526040902054909150612d279082611d3f565b3060009081526003602090815260408083209390935560089052205460ff16156126ec5730600090815260046020526040902054612d659084611d3f565b30600090815260046020526040902055505050565b600b54612d879083611ded565b600b55600c54612d979082611d3f565b600c555050565b80358015158114612dae57600080fd5b919050565b80516001600160701b0381168114612dae57600080fd5b600060208284031215612ddb578081fd5b8135610ce5816131b4565b600060208284031215612df7578081fd5b8151610ce5816131b4565b60008060408385031215612e14578081fd5b8235612e1f816131b4565b91506020830135612e2f816131b4565b809150509250929050565b600080600060608486031215612e4e578081fd5b8335612e59816131b4565b92506020840135612e69816131b4565b929592945050506040919091013590565b60008060408385031215612e8c578182fd5b8235612e97816131b4565b946020939093013593505050565b600060208284031215612eb6578081fd5b610ce582612d9e565b600080600060608486031215612ed3578283fd5b612edc84612db3565b9250612eea60208501612db3565b9150604084015163ffffffff81168114612f02578182fd5b809150509250925092565b600060208284031215612f1e578081fd5b5035919050565b60008060408385031215612f37578182fd5b82359150612f4760208401612d9e565b90509250929050565b600080600060608486031215612f64578283fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015612fb55781516001600160a01b031687529582019590820190600101612f90565b509495945050505050565b848152608060208201526000612fd96080830186612f7d565b6001600160a01b03949094166040830152506060015292915050565b6000602080835283518082850152825b8181101561302157858101830151858201604001528201613005565b818111156130325783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8281526040602082015260006130966040830184612f7d565b949350505050565b85815284602082015260a0604082015260006130bd60a0830186612f7d565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156130ed576130ed61319e565b500190565b60008261310d57634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561312c5761312c61319e565b500290565b6000828210156131435761314361319e565b500390565b600181811c9082168061315c57607f821691505b6020821081141561317d57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156131975761319761319e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146131c957600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206191b3e5d25d390a88b2e4fa53765724f0b95b7c0c5b1246af382dc63c16258064736f6c63430008040033

Deployed Bytecode

0x6080604052600436106103395760003560e01c80636bc87c3a116101ab578063a073d37f116100f7578063d3b64ecd11610095578063ea2f0b371161006f578063ea2f0b37146109cf578063ec28438a146109ef578063f0f165af14610a0f578063f2fde38b14610a2f57600080fd5b8063d3b64ecd1461093a578063d6b513cf14610973578063dd62ed3e1461098957600080fd5b8063a9059cbb116100d1578063a9059cbb146108c5578063b0cb81f1146108e5578063bdc653ef14610905578063c49b9a801461091a57600080fd5b8063a073d37f14610870578063a457c2d714610885578063a5ece941146108a557600080fd5b806382d2a4bb116101645780638da5cb5b1161013e5780638da5cb5b146107fd5780638ee88c531461081b578063906e9dd01461083b57806395d89b411461085b57600080fd5b806382d2a4bb1461078e57806388f82020146107ae5780638a04c283146107e757600080fd5b80636bc87c3a146106ed57806370a0823114610703578063715018a614610723578063763d58ea146107385780637d1db4a5146107585780637e3f56061461076e57600080fd5b80633685d419116102855780634a74bb021161022357806352390c02116101fd57806352390c02146106615780635342acb414610681578063557ed1ba146106ba5780636053a0e3146106cd57600080fd5b80634a74bb021461060d5780635134f6ab1461062c57806351b1ae0d1461064157600080fd5b80633bd5d1731161025f5780633bd5d17314610579578063437823ec146105995780634549b039146105b957806349bd5a5e146105d957600080fd5b80633685d4191461052357806339509351146105435780633b124fe71461056357600080fd5b806318160ddd116102f257806327c8f835116102cc57806327c8f8351461048d57806329370cc6146104c15780632d838119146104e1578063313ce5671461050157600080fd5b806318160ddd14610442578063218656e41461045757806323b872dd1461046d57600080fd5b8063061c82d01461034557806306fdde031461036757806307efbfdc14610392578063095ea7b3146103a757806313114a9d146103d75780631694505e146103f657600080fd5b3661034057005b600080fd5b34801561035157600080fd5b50610365610360366004612f0d565b610a4f565b005b34801561037357600080fd5b5061037c610a87565b6040516103899190612ff5565b60405180910390f35b34801561039e57600080fd5b50610365610b19565b3480156103b357600080fd5b506103c76103c2366004612e7a565b610b68565b6040519015158152602001610389565b3480156103e357600080fd5b50600c545b604051908152602001610389565b34801561040257600080fd5b5061042a7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610389565b34801561044e57600080fd5b50600a546103e8565b34801561046357600080fd5b506103e860185481565b34801561047957600080fd5b506103c7610488366004612e3a565b610b7f565b34801561049957600080fd5b5061042a7f000000000000000000000000000000000000000000000000000000000000dead81565b3480156104cd57600080fd5b506103656104dc366004612ea5565b610be8565b3480156104ed57600080fd5b506103e86104fc366004612f0d565b610c68565b34801561050d57600080fd5b50600f5460405160ff9091168152602001610389565b34801561052f57600080fd5b5061036561053e366004612dca565b610cec565b34801561054f57600080fd5b506103c761055e366004612e7a565b610edb565b34801561056f57600080fd5b506103e860105481565b34801561058557600080fd5b50610365610594366004612f0d565b610f11565b3480156105a557600080fd5b506103656105b4366004612dca565b610ffb565b3480156105c557600080fd5b506103e86105d4366004612f25565b611049565b3480156105e557600080fd5b5061042a7f0000000000000000000000009bed94e5344dc12e88be9bc0f2c351a00500316281565b34801561061957600080fd5b50601a546103c790610100900460ff1681565b34801561063857600080fd5b506103656110d6565b34801561064d57600080fd5b5060025461042a906001600160a01b031681565b34801561066d57600080fd5b5061036561067c366004612dca565b611126565b34801561068d57600080fd5b506103c761069c366004612dca565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156106c657600080fd5b50426103e8565b3480156106d957600080fd5b50601a546103c79062010000900460ff1681565b3480156106f957600080fd5b506103e860125481565b34801561070f57600080fd5b506103e861071e366004612dca565b611279565b34801561072f57600080fd5b506103656112d8565b34801561074457600080fd5b50610365610753366004612dca565b61134c565b34801561076457600080fd5b506103e860155481565b34801561077a57600080fd5b50610365610789366004612dca565b611398565b34801561079a57600080fd5b506103656107a9366004612f0d565b6113e6565b3480156107ba57600080fd5b506103c76107c9366004612dca565b6001600160a01b031660009081526008602052604090205460ff1690565b3480156107f357600080fd5b506103e860195481565b34801561080957600080fd5b506000546001600160a01b031661042a565b34801561082757600080fd5b50610365610836366004612f0d565b611428565b34801561084757600080fd5b50610365610856366004612dca565b611457565b34801561086757600080fd5b5061037c6114a3565b34801561087c57600080fd5b506016546103e8565b34801561089157600080fd5b506103c76108a0366004612e7a565b6114b2565b3480156108b157600080fd5b5060015461042a906001600160a01b031681565b3480156108d157600080fd5b506103c76108e0366004612e7a565b611501565b3480156108f157600080fd5b50610365610900366004612f0d565b61150e565b34801561091157600080fd5b506017546103e8565b34801561092657600080fd5b50610365610935366004612ea5565b61153d565b34801561094657600080fd5b506103c7610955366004612dca565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561097f57600080fd5b506103e860145481565b34801561099557600080fd5b506103e86109a4366004612e02565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b3480156109db57600080fd5b506103656109ea366004612dca565b6115b0565b3480156109fb57600080fd5b50610365610a0a366004612f0d565b6115fb565b348015610a1b57600080fd5b50610365610a2a366004612f0d565b61162a565b348015610a3b57600080fd5b50610365610a4a366004612dca565b611659565b6000546001600160a01b03163314610a825760405162461bcd60e51b8152600401610a7990613048565b60405180910390fd5b601055565b6060600d8054610a9690613148565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac290613148565b8015610b0f5780601f10610ae457610100808354040283529160200191610b0f565b820191906000526020600020905b815481529060010190602001808311610af257829003601f168201915b5050505050905090565b6000546001600160a01b03163314610b435760405162461bcd60e51b8152600401610a7990613048565b610b4d600161153d565b600260105560086012556a084595161401484a000000601555565b6000610b75338484611743565b5060015b92915050565b6000610b8c848484611867565b610bde8433610bd9856040518060600160405280602881526020016131cd602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190611ca0565b611743565b5060019392505050565b6000546001600160a01b03163314610c125760405162461bcd60e51b8152600401610a7990613048565b601a8054821515620100000262ff0000199091161790556040517f3794234fa370c9f3b948dda3e3040530785b2ef1eb27dda3ffde478f4e2643c090610c5d90831515815260200190565b60405180910390a150565b6000600b54821115610ccf5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610a79565b6000610cd9611cda565b9050610ce58382611cfd565b9392505050565b6000546001600160a01b03163314610d165760405162461bcd60e51b8152600401610a7990613048565b6001600160a01b03811660009081526008602052604090205460ff16610d7e5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a79565b60005b600954811015610ed757816001600160a01b031660098281548110610db657634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610ec55760098054610de190600190613131565b81548110610dff57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600980546001600160a01b039092169183908110610e3957634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600482526040808220829055600890925220805460ff191690556009805480610e9f57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610ecf81613183565b915050610d81565b5050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610b75918590610bd99086611d3f565b3360008181526008602052604090205460ff1615610f865760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610a79565b6000610f9183611d9e565b505050506001600160a01b038416600090815260036020526040902054919250610fbd91905082611ded565b6001600160a01b038316600090815260036020526040902055600b54610fe39082611ded565b600b55600c54610ff39084611d3f565b600c55505050565b6000546001600160a01b031633146110255760405162461bcd60e51b8152600401610a7990613048565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000600a5483111561109d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610a79565b816110bc5760006110ad84611d9e565b50939550610b79945050505050565b60006110c784611d9e565b50929550610b79945050505050565b6000546001600160a01b031633146111005760405162461bcd60e51b8152600401610a7990613048565b61110a600061153d565b600060108190556012556b033b2e3c9fd0803ce8000000601555565b6000546001600160a01b031633146111505760405162461bcd60e51b8152600401610a7990613048565b6001600160a01b03811660009081526008602052604090205460ff16156111b95760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a79565b6001600160a01b03811660009081526003602052604090205415611213576001600160a01b0381166000908152600360205260409020546111f990610c68565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600860205260408120805460ff191660019081179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319169091179055565b6001600160a01b03811660009081526008602052604081205460ff16156112b657506001600160a01b031660009081526004602052604090205490565b6001600160a01b038216600090815260036020526040902054610b7990610c68565b6000546001600160a01b031633146113025760405162461bcd60e51b8152600401610a7990613048565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146113765760405162461bcd60e51b8152600401610a7990613048565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146113c25760405162461bcd60e51b8152600401610a7990613048565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000546001600160a01b031633146114105760405162461bcd60e51b8152600401610a7990613048565b61142281670de0b6b3a7640000613112565b60175550565b6000546001600160a01b031633146114525760405162461bcd60e51b8152600401610a7990613048565b601255565b6000546001600160a01b031633146114815760405162461bcd60e51b8152600401610a7990613048565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6060600e8054610a9690613148565b6000610b753384610bd9856040518060600160405280602581526020016131f5602591393360009081526005602090815260408083206001600160a01b038d1684529091529020549190611ca0565b6000610b75338484611867565b6000546001600160a01b031633146115385760405162461bcd60e51b8152600401610a7990613048565b601455565b6000546001600160a01b031633146115675760405162461bcd60e51b8152600401610a7990613048565b601a80548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610c5d90831515815260200190565b6000546001600160a01b031633146115da5760405162461bcd60e51b8152600401610a7990613048565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b031633146116255760405162461bcd60e51b8152600401610a7990613048565b601555565b6000546001600160a01b031633146116545760405162461bcd60e51b8152600401610a7990613048565b601655565b6000546001600160a01b031633146116835760405162461bcd60e51b8152600401610a7990613048565b6001600160a01b0381166116e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a79565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166117a55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a79565b6001600160a01b0382166118065760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a79565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166118cb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a79565b6001600160a01b03821661192d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a79565b6000811161198f5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610a79565b6000546001600160a01b038481169116148015906119bb57506000546001600160a01b03838116911614155b80156119e057506001600160a01b03831660009081526007602052604090205460ff16155b15611a4857601554811115611a485760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610a79565b6000611a5330611279565b601654601a549192508210159060ff16158015611a775750601a54610100900460ff165b8015611ab457507f0000000000000000000000009bed94e5344dc12e88be9bc0f2c351a0050031626001600160a01b0316846001600160a01b0316145b15611ba6578015611ad157655af3107a40009150611ad182611e2f565b601a54479062010000900460ff168015611af25750670de0b6b3a764000081115b15611ba4576000611b01611ede565b90506000611b31670de0b6b3a7640000611b2b6064611b2b60175487611fa790919063ffffffff16565b90611cfd565b9050601754831115611ba157808610611b61576017549250611b5c611b57846064611cfd565b612026565b611ba1565b601954601854611b7191906130da565b421115611ba1576000611b9083611b2b89670de0b6b3a7640000611fa7565b9050611b9b81612026565b50426018555b50505b505b6015548210611bb55760155491505b692a23cfc614d00e60000082108015908190611bd45750601a5460ff16155b8015611c1257507f0000000000000000000000009bed94e5344dc12e88be9bc0f2c351a0050031626001600160a01b0316866001600160a01b031614155b8015611c255750601a54610100900460ff165b15611c4057692a23cfc614d00e6000009250611c408361204f565b6001600160a01b03861660009081526006602052604090205460019060ff1680611c8257506001600160a01b03861660009081526006602052604090205460ff165b15611c8b575060005b611c97878787846120ed565b50505050505050565b60008184841115611cc45760405162461bcd60e51b8152600401610a799190612ff5565b506000611cd18486613131565b95945050505050565b6000806000611ce7612218565b9092509050611cf68282611cfd565b9250505090565b6000610ce583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506123d2565b600080611d4c83856130da565b905083811015610ce55760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a79565b6000806000806000806000806000611db58a612400565b9250925092506000806000611dd38d8686611dce611cda565b612442565b919f909e50909c50959a5093985091965092945050505050565b6000610ce583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ca0565b601a805460ff1916600117905547611e4682612492565b6000611e524783611ded565b9050611e9d600160009054906101000a90046001600160a01b0316611e986008611b2b6005611e92601454611e926012548a611cfd90919063ffffffff16565b90611fa7565b6126b6565b600254601454601254611ecf926001600160a01b031691611e9891600891611b2b91600391611e929182908a90611cfd565b5050601a805460ff1916905550565b6000807f0000000000000000000000009bed94e5344dc12e88be9bc0f2c351a0050031629050600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611f4057600080fd5b505afa158015611f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f789190612ebf565b506001600160701b039182169350169050611f9f670de0b6b3a7640000611e928484611cfd565b935050505090565b600082611fb657506000610b79565b6000611fc28385613112565b905082611fcf85836130f2565b14610ce55760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a79565b601a805460ff19166001179055801561204257612042816126f1565b50601a805460ff19169055565b601a805460ff191660011790556000612069826002611cfd565b905060006120778383611ded565b90504761208383612492565b600061208f4783611ded565b905061209b83826128f6565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601a805460ff19169055505050565b806120fa576120fa612a06565b6001600160a01b03841660009081526008602052604090205460ff16801561213b57506001600160a01b03831660009081526008602052604090205460ff16155b156121505761214b848484612a34565b6121fc565b6001600160a01b03841660009081526008602052604090205460ff1615801561219157506001600160a01b03831660009081526008602052604090205460ff165b156121a15761214b848484612b5a565b6001600160a01b03841660009081526008602052604090205460ff1680156121e157506001600160a01b03831660009081526008602052604090205460ff165b156121f15761214b848484612c03565b6121fc848484612c76565b8061221257612212601154601055601354601255565b50505050565b600b54600a546000918291825b6009548110156123a25782600360006009848154811061225557634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806122ce57508160046000600984815481106122a757634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156122e457600b54600a54945094505050509091565b612338600360006009848154811061230c57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611ded565b925061238e600460006009848154811061236257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611ded565b91508061239a81613183565b915050612225565b50600a54600b546123b291611cfd565b8210156123c957600b54600a549350935050509091565b90939092509050565b600081836123f35760405162461bcd60e51b8152600401610a799190612ff5565b506000611cd184866130f2565b60008060008061240f85612cba565b9050600061241c86612cd6565b905060006124348261242e8986611ded565b90611ded565b979296509094509092505050565b60008080806124518886611fa7565b9050600061245f8887611fa7565b9050600061246d8888611fa7565b9050600061247f8261242e8686611ded565b939b939a50919850919650505050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106124d557634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561254e57600080fd5b505afa158015612562573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125869190612de6565b816001815181106125a757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250506125f2307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611743565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac9479061264790859060009086903090429060040161309e565b600060405180830381600087803b15801561266157600080fd5b505af1158015612675573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a782826040516126aa92919061307d565b60405180910390a15050565b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156126ec573d6000803e3d6000fd5b505050565b6040805160028082526060820183526000926020830190803683370190505090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561276b57600080fd5b505afa15801561277f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a39190612de6565b816000815181106127c457634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061280657634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1663b6f9de95836000847f000000000000000000000000000000000000000000000000000000000000dead6128744261012c611d3f565b6040518663ffffffff1660e01b81526004016128939493929190612fc0565b6000604051808303818588803b1580156128ac57600080fd5b505af11580156128c0573d6000803e3d6000fd5b50505050507f6fd378a9d8b7345c2e5b18229aaf1e39d32b177b501d0a0d26a0a858a23a962482826040516126aa92919061307d565b612921307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611743565b60405163f305d71960e01b81523060048201526024810183905260006044820181905260648201526001600160a01b037f000000000000000000000000000000000000000000000000000000000000dead811660848301524260a48301527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063f305d71990839060c4016060604051808303818588803b1580156129c657600080fd5b505af11580156129da573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906129ff9190612f50565b5050505050565b601054158015612a165750601254155b15612a1d57565b601080546011556012805460135560009182905555565b600080600080600080612a4687611d9e565b6001600160a01b038f16600090815260046020526040902054959b50939950919750955093509150612a789088611ded565b6001600160a01b038a16600090815260046020908152604080832093909355600390522054612aa79087611ded565b6001600160a01b03808b1660009081526003602052604080822093909355908a1681522054612ad69086611d3f565b6001600160a01b038916600090815260036020526040902055612af881612cf2565b612b028483612d7a565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612b4791815260200190565b60405180910390a3505050505050505050565b600080600080600080612b6c87611d9e565b6001600160a01b038f16600090815260036020526040902054959b50939950919750955093509150612b9e9087611ded565b6001600160a01b03808b16600090815260036020908152604080832094909455918b16815260049091522054612bd49084611d3f565b6001600160a01b038916600090815260046020908152604080832093909355600390522054612ad69086611d3f565b600080600080600080612c1587611d9e565b6001600160a01b038f16600090815260046020526040902054959b50939950919750955093509150612c479088611ded565b6001600160a01b038a16600090815260046020908152604080832093909355600390522054612b9e9087611ded565b600080600080600080612c8887611d9e565b6001600160a01b038f16600090815260036020526040902054959b50939950919750955093509150612aa79087611ded565b6000610b796064611b2b60105485611fa790919063ffffffff16565b6000610b796064611b2b60125485611fa790919063ffffffff16565b6000612cfc611cda565b90506000612d0a8383611fa7565b30600090815260036020526040902054909150612d279082611d3f565b3060009081526003602090815260408083209390935560089052205460ff16156126ec5730600090815260046020526040902054612d659084611d3f565b30600090815260046020526040902055505050565b600b54612d879083611ded565b600b55600c54612d979082611d3f565b600c555050565b80358015158114612dae57600080fd5b919050565b80516001600160701b0381168114612dae57600080fd5b600060208284031215612ddb578081fd5b8135610ce5816131b4565b600060208284031215612df7578081fd5b8151610ce5816131b4565b60008060408385031215612e14578081fd5b8235612e1f816131b4565b91506020830135612e2f816131b4565b809150509250929050565b600080600060608486031215612e4e578081fd5b8335612e59816131b4565b92506020840135612e69816131b4565b929592945050506040919091013590565b60008060408385031215612e8c578182fd5b8235612e97816131b4565b946020939093013593505050565b600060208284031215612eb6578081fd5b610ce582612d9e565b600080600060608486031215612ed3578283fd5b612edc84612db3565b9250612eea60208501612db3565b9150604084015163ffffffff81168114612f02578182fd5b809150509250925092565b600060208284031215612f1e578081fd5b5035919050565b60008060408385031215612f37578182fd5b82359150612f4760208401612d9e565b90509250929050565b600080600060608486031215612f64578283fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015612fb55781516001600160a01b031687529582019590820190600101612f90565b509495945050505050565b848152608060208201526000612fd96080830186612f7d565b6001600160a01b03949094166040830152506060015292915050565b6000602080835283518082850152825b8181101561302157858101830151858201604001528201613005565b818111156130325783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8281526040602082015260006130966040830184612f7d565b949350505050565b85815284602082015260a0604082015260006130bd60a0830186612f7d565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156130ed576130ed61319e565b500190565b60008261310d57634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561312c5761312c61319e565b500290565b6000828210156131435761314361319e565b500390565b600181811c9082168061315c57607f821691505b6020821081141561317d57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156131975761319761319e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146131c957600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206191b3e5d25d390a88b2e4fa53765724f0b95b7c0c5b1246af382dc63c16258064736f6c63430008040033

Deployed Bytecode Sourcemap

14350:23085:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35345:98;;;;;;;;;;-1:-1:-1;35345:98:0;;;;;:::i;:::-;;:::i;:::-;;17548:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37009:195;;;;;;;;;;;;;:::i;18460:161::-;;;;;;;;;;-1:-1:-1;18460:161:0;;;;;:::i;:::-;;:::i;:::-;;;5230:14:1;;5223:22;5205:41;;5193:2;5178:18;18460:161:0;5160:92:1;19581:87:0;;;;;;;;;;-1:-1:-1;19650:10:0;;19581:87;;;12264:25:1;;;12252:2;12237:18;19581:87:0;12219:76:1;16198:51:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4185:32:1;;;4167:51;;4155:2;4140:18;16198:51:0;4122:102:1;17825:95:0;;;;;;;;;;-1:-1:-1;17905:7:0;;17825:95;;16099:35;;;;;;;;;;;;;;;;18629:313;;;;;;;;;;-1:-1:-1;18629:313:0;;;;;:::i;:::-;;:::i;14698:81::-;;;;;;;;;;;;;;;36639:150;;;;;;;;;;-1:-1:-1;36639:150:0;;;;;:::i;:::-;;:::i;20751:253::-;;;;;;;;;;-1:-1:-1;20751:253:0;;;;;:::i;:::-;;:::i;17734:83::-;;;;;;;;;;-1:-1:-1;17800:9:0;;17734:83;;17800:9;;;;13690:36:1;;13678:2;13663:18;17734:83:0;13645:87:1;21355:479:0;;;;;;;;;;-1:-1:-1;21355:479:0;;;;;:::i;:::-;;:::i;18950:218::-;;;;;;;;;;-1:-1:-1;18950:218:0;;;;;:::i;:::-;;:::i;15508:26::-;;;;;;;;;;;;;;;;19920:377;;;;;;;;;;-1:-1:-1;19920:377:0;;;;;:::i;:::-;;:::i;34973:111::-;;;;;;;;;;-1:-1:-1;34973:111:0;;;;;:::i;:::-;;:::i;20307:436::-;;;;;;;;;;-1:-1:-1;20307:436:0;;;;;:::i;:::-;;:::i;16256:38::-;;;;;;;;;;;;;;;16331:41;;;;;;;;;;-1:-1:-1;16331:41:0;;;;;;;;;;;36797:203;;;;;;;;;;;;;:::i;14597:91::-;;;;;;;;;;-1:-1:-1;14597:91:0;;;;-1:-1:-1;;;;;14597:91:0;;;21012:335;;;;;;;;;;-1:-1:-1;21012:335:0;;;;;:::i;:::-;;:::i;34695:123::-;;;;;;;;;;-1:-1:-1;34695:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;34783:27:0;34759:4;34783:27;;;:18;:27;;;;;;;;;34695:123;6307:90;;;;;;;;;;-1:-1:-1;6374:15:0;6307:90;;16379:33;;;;;;;;;;-1:-1:-1;16379:33:0;;;;;;;;;;;15591:32;;;;;;;;;;;;;;;;17928:198;;;;;;;;;;-1:-1:-1;17928:198:0;;;;;:::i;:::-;;:::i;5895:148::-;;;;;;;;;;;;;:::i;36317:133::-;;;;;;;;;;-1:-1:-1;36317:133:0;;;;;:::i;:::-;;:::i;15736:57::-;;;;;;;;;;;;;;;;35092:127;;;;;;;;;;-1:-1:-1;35092:127:0;;;;;:::i;:::-;;:::i;35995:133::-;;;;;;;;;;-1:-1:-1;35995:133:0;;;;;:::i;:::-;;:::i;19453:120::-;;;;;;;;;;-1:-1:-1;19453:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;19545:20:0;19521:4;19545:20;;;:11;:20;;;;;;;;;19453:120;16141:35;;;;;;;;;;;;;;;;5681:79;;;;;;;;;;-1:-1:-1;5719:7:0;5746:6;-1:-1:-1;;;;;5746:6:0;5681:79;;35451:122;;;;;;;;;;-1:-1:-1;35451:122:0;;;;;:::i;:::-;;:::i;36136:141::-;;;;;;;;;;-1:-1:-1;36136:141:0;;;;;:::i;:::-;;:::i;17639:87::-;;;;;;;;;;;;;:::i;19676:120::-;;;;;;;;;;-1:-1:-1;19765:23:0;;19676:120;;19176:269;;;;;;;;;;-1:-1:-1;19176:269:0;;;;;:::i;:::-;;:::i;14465:93::-;;;;;;;;;;-1:-1:-1;14465:93:0;;;;-1:-1:-1;;;;;14465:93:0;;;18134:167;;;;;;;;;;-1:-1:-1;18134:167:0;;;;;:::i;:::-;;:::i;35700:112::-;;;;;;;;;;-1:-1:-1;35700:112:0;;;;;:::i;:::-;;:::i;19804:108::-;;;;;;;;;;-1:-1:-1;19887:17:0;;19804:108;;36460:171;;;;;;;;;;-1:-1:-1;36460:171:0;;;;;:::i;:::-;;:::i;34826:139::-;;;;;;;;;;-1:-1:-1;34826:139:0;;;;;:::i;:::-;-1:-1:-1;;;;;34922:35:0;34898:4;34922:35;;;:26;:35;;;;;;;;;34826:139;15692:35;;;;;;;;;;;;;;;;18309:143;;;;;;;;;;-1:-1:-1;18309:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;18417:18:0;;;18390:7;18417:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;18309:143;35227:110;;;;;;;;;;-1:-1:-1;35227:110:0;;;;;:::i;:::-;;:::i;35581:111::-;;;;;;;;;;-1:-1:-1;35581:111:0;;;;;:::i;:::-;;:::i;35820:166::-;;;;;;;;;;-1:-1:-1;35820:166:0;;;;;:::i;:::-;;:::i;6051:244::-;;;;;;;;;;-1:-1:-1;6051:244:0;;;;;:::i;:::-;;:::i;35345:98::-;5808:6;;-1:-1:-1;;;;;5808:6:0;156:10;5808:22;5800:67;;;;-1:-1:-1;;;5800:67:0;;;;;;;:::i;:::-;;;;;;;;;35419:7:::1;:16:::0;35345:98::o;17548:83::-;17585:13;17618:5;17611:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17548:83;:::o;37009:195::-;5808:6;;-1:-1:-1;;;;;5808:6:0;156:10;5808:22;5800:67;;;;-1:-1:-1;;;5800:67:0;;;;;;;:::i;:::-;37063:30:::1;37088:4;37063:24;:30::i;:::-;37114:1;37104:7;:11:::0;37142:1:::1;37126:13;:17:::0;37169:27:::1;37154:12;:42:::0;37009:195::o;18460:161::-;18535:4;18552:39;156:10;18575:7;18584:6;18552:8;:39::i;:::-;-1:-1:-1;18609:4:0;18460:161;;;;;:::o;18629:313::-;18727:4;18744:36;18754:6;18762:9;18773:6;18744:9;:36::i;:::-;18791:121;18800:6;156:10;18822:89;18860:6;18822:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18822:19:0;;;;;;:11;:19;;;;;;;;156:10;18822:33;;;;;;;;;;:37;:89::i;:::-;18791:8;:121::i;:::-;-1:-1:-1;18930:4:0;18629:313;;;;;:::o;36639:150::-;5808:6;;-1:-1:-1;;;;;5808:6:0;156:10;5808:22;5800:67;;;;-1:-1:-1;;;5800:67:0;;;;;;;:::i;:::-;36709:14:::1;:25:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;36709:25:0;;::::1;;::::0;;36750:31:::1;::::0;::::1;::::0;::::1;::::0;36726:8;5230:14:1;5223:22;5205:41;;5193:2;5178:18;;5160:92;36750:31:0::1;;;;;;;;36639:150:::0;:::o;20751:253::-;20817:7;20856;;20845;:18;;20837:73;;;;-1:-1:-1;;;20837:73:0;;7221:2:1;20837:73:0;;;7203:21:1;7260:2;7240:18;;;7233:30;7299:34;7279:18;;;7272:62;-1:-1:-1;;;7350:18:1;;;7343:40;7400:19;;20837:73:0;7193:232:1;20837:73:0;20921:19;20944:10;:8;:10::i;:::-;20921:33;-1:-1:-1;20972:24:0;:7;20921:33;20972:11;:24::i;:::-;20965:31;20751:253;-1:-1:-1;;;20751:253:0:o;21355:479::-;5808:6;;-1:-1:-1;;;;;5808:6:0;156:10;5808:22;5800:67;;;;-1:-1:-1;;;5800:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21437:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;21429:60;;;::::0;-1:-1:-1;;;21429:60:0;;8798:2:1;21429:60:0::1;::::0;::::1;8780:21:1::0;8837:2;8817:18;;;8810:30;8876:29;8856:18;;;8849:57;8923:18;;21429:60:0::1;8770:177:1::0;21429:60:0::1;21505:9;21500:327;21524:9;:16:::0;21520:20;::::1;21500:327;;;21582:7;-1:-1:-1::0;;;;;21566:23:0::1;:9;21576:1;21566:12;;;;;;-1:-1:-1::0;;;21566:12:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;21566:12:0::1;:23;21562:254;;;21625:9;21635:16:::0;;:20:::1;::::0;21654:1:::1;::::0;21635:20:::1;:::i;:::-;21625:31;;;;;;-1:-1:-1::0;;;21625:31:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;21610:9:::1;:12:::0;;-1:-1:-1;;;;;21625:31:0;;::::1;::::0;21620:1;;21610:12;::::1;;;-1:-1:-1::0;;;21610:12:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;21610:46:0::1;-1:-1:-1::0;;;;;21610:46:0;;::::1;;::::0;;21675:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;21714:11:::1;:20:::0;;;;:28;;-1:-1:-1;;21714:28:0::1;::::0;;21761:9:::1;:15:::0;;;::::1;;-1:-1:-1::0;;;21761:15:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;21761:15:0;;;;;-1:-1:-1;;;;;;21761:15:0::1;::::0;;;;;21500:327:::1;21355:479:::0;:::o;21562:254::-:1;21542:3:::0;::::1;::::0;::::1;:::i;:::-;;;;21500:327;;;;21355:479:::0;:::o;18950:218::-;156:10;19038:4;19087:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19087:34:0;;;;;;;;;;19038:4;;19055:83;;19078:7;;19087:50;;19126:10;19087:38;:50::i;19920:377::-;156:10;19972:14;20021:19;;;:11;:19;;;;;;;;20020:20;20012:77;;;;-1:-1:-1;;;20012:77:0;;11907:2:1;20012:77:0;;;11889:21:1;11946:2;11926:18;;;11919:30;11985:34;11965:18;;;11958:62;-1:-1:-1;;;12036:18:1;;;12029:42;12088:19;;20012:77:0;11879:234:1;20012:77:0;20101:15;20125:19;20136:7;20125:10;:19::i;:::-;-1:-1:-1;;;;;;;;;20173:15:0;;;;;;:7;:15;;;;;;20100:44;;-1:-1:-1;20173:28:0;;:15;-1:-1:-1;20100:44:0;20173:19;:28::i;:::-;-1:-1:-1;;;;;20155:15:0;;;;;;:7;:15;;;;;:46;20222:7;;:20;;20234:7;20222:11;:20::i;:::-;20212:7;:30;20266:10;;:23;;20281:7;20266:14;:23::i;:::-;20253:10;:36;-1:-1:-1;;;19920:377:0:o;34973:111::-;5808:6;;-1:-1:-1;;;;;5808:6:0;156:10;5808:22;5800:67;;;;-1:-1:-1;;;5800:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35042:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;35042:34:0::1;35072:4;35042:34;::::0;;34973:111::o;20307:436::-;20397:7;20436;;20425;:18;;20417:62;;;;-1:-1:-1;;;20417:62:0;;9154:2:1;20417:62:0;;;9136:21:1;9193:2;9173:18;;;9166:30;9232:33;9212:18;;;9205:61;9283:18;;20417:62:0;9126:181:1;20417:62:0;20495:17;20490:246;;20530:15;20554:19;20565:7;20554:10;:19::i;:::-;-1:-1:-1;20529:44:0;;-1:-1:-1;20588:14:0;;-1:-1:-1;;;;;20588:14:0;20490:246;20637:23;20668:19;20679:7;20668:10;:19::i;:::-;-1:-1:-1;20635:52:0;;-1:-1:-1;20702:22:0;;-1:-1:-1;;;;;20702:22:0;36797:203;5808:6;;-1:-1:-1;;;;;5808:6:0;156:10;5808:22;5800:67;;;;-1:-1:-1;;;5800:67:0;;;;;;;:::i;:::-;36856:31:::1;36881:5;36856:24;:31::i;:::-;36908:1;36898:7;:11:::0;;;36920:13:::1;:17:::0;36963:29:::1;36948:12;:44:::0;36797:203::o;21012:335::-;5808:6;;-1:-1:-1;;;;;5808:6:0;156:10;5808:22;5800:67;;;;-1:-1:-1;;;5800:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21097:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;21096:21;21088:61;;;::::0;-1:-1:-1;;;21088:61:0;;8798:2:1;21088:61:0::1;::::0;::::1;8780:21:1::0;8837:2;8817:18;;;8810:30;8876:29;8856:18;;;8849:57;8923:18;;21088:61:0::1;8770:177:1::0;21088:61:0::1;-1:-1:-1::0;;;;;21163:16:0;::::1;21182:1;21163:16:::0;;;:7:::1;:16;::::0;;;;;:20;21160:108:::1;;-1:-1:-1::0;;;;;21239:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;21219:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;21200:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;21160:108:::1;-1:-1:-1::0;;;;;21278:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;21278:27:0::1;21301:4;21278:27:::0;;::::1;::::0;;;21316:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;21316:23:0::1;::::0;;::::1;::::0;;21012:335::o;17928:198::-;-1:-1:-1;;;;;18018:20:0;;17994:7;18018:20;;;:11;:20;;;;;;;;18014:49;;;-1:-1:-1;;;;;;18047:16:0;;;;;:7;:16;;;;;;;17928:198::o;18014:49::-;-1:-1:-1;;;;;18101:16:0;;;;;;:7;:16;;;;;;18081:37;;:19;:37::i;5895:148::-;5808:6;;-1:-1:-1;;;;;5808:6:0;156:10;5808:22;5800:67;;;;-1:-1:-1;;;5800:67:0;;;;;;;:::i;:::-;6002:1:::1;5986:6:::0;;5965:40:::1;::::0;-1:-1:-1;;;;;5986:6:0;;::::1;::::0;5965:40:::1;::::0;6002:1;;5965:40:::1;6033:1;6016:19:::0;;-1:-1:-1;;;;;;6016:19:0::1;::::0;;5895:148::o;36317:133::-;5808:6;;-1:-1:-1;;;;;5808:6:0;156:10;5808:22;5800:67;;;;-1:-1:-1;;;5800:67:0;;;;;;;:::i;:::-;36401:14:::1;:41:::0;;-1:-1:-1;;;;;;36401:41:0::1;-1:-1:-1::0;;;;;36401:41:0;;;::::1;::::0;;;::::1;::::0;;36317:133::o;35092:127::-;5808:6;;-1:-1:-1;;;;;5808:6:0;156:10;5808:22;5800:67;;;;-1:-1:-1;;;5800:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35169:35:0::1;;::::0;;;:26:::1;:35;::::0;;;;:42;;-1:-1:-1;;35169:42:0::1;35207:4;35169:42;::::0;;35092:127::o;35995:133::-;5808:6;;-1:-1:-1;;;;;5808:6:0;156:10;5808:22;5800:67;;;;-1:-1:-1;;;5800:67:0;;;;;;;:::i;:::-;36099:21:::1;:12:::0;36114:6:::1;36099:21;:::i;:::-;36079:17;:41:::0;-1:-1:-1;35995:133:0:o;35451:122::-;5808:6;;-1:-1:-1;;;;;5808:6:0;156:10;5808:22;5800:67;;;;-1:-1:-1;;;5800:67:0;;;;;;;:::i;:::-;35537:13:::1;:28:::0;35451:122::o;36136:141::-;5808:6;;-1:-1:-1;;;;;5808:6:0;156:10;5808:22;5800:67;;;;-1:-1:-1;;;5800:67:0;;;;;;;:::i;:::-;36224:16:::1;:45:::0;;-1:-1:-1;;;;;;36224:45:0::1;-1:-1:-1::0;;;;;36224:45:0;;;::::1;::::0;;;::::1;::::0;;36136:141::o;17639:87::-;17678:13;17711:7;17704:14;;;;;:::i;19176:269::-;19269:4;19286:129;156:10;19309:7;19318:96;19357:15;19318:96;;;;;;;;;;;;;;;;;156:10;19318:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19318:34:0;;;;;;;;;;;;:38;:96::i;18134:167::-;18212:4;18229:42;156:10;18253:9;18264:6;18229:9;:42::i;35700:112::-;5808:6;;-1:-1:-1;;;;;5808:6:0;156:10;5808:22;5800:67;;;;-1:-1:-1;;;5800:67:0;;;;;;;:::i;:::-;35778:16:::1;:26:::0;35700:112::o;36460:171::-;5808:6;;-1:-1:-1;;;;;5808:6:0;156:10;5808:22;5800:67;;;;-1:-1:-1;;;5800:67:0;;;;;;;:::i;:::-;36537:21:::1;:32:::0;;;::::1;;;;-1:-1:-1::0;;36537:32:0;;::::1;;::::0;;36585:38:::1;::::0;::::1;::::0;::::1;::::0;36561:8;5230:14:1;5223:22;5205:41;;5193:2;5178:18;;5160:92;35227:110:0;5808:6;;-1:-1:-1;;;;;5808:6:0;156:10;5808:22;5800:67;;;;-1:-1:-1;;;5800:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35294:27:0::1;35324:5;35294:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;35294:35:0::1;::::0;;35227:110::o;35581:111::-;5808:6;;-1:-1:-1;;;;;5808:6:0;156:10;5808:22;5800:67;;;;-1:-1:-1;;;5800:67:0;;;;;;;:::i;:::-;35658:12:::1;:26:::0;35581:111::o;35820:166::-;5808:6;;-1:-1:-1;;;;;5808:6:0;156:10;5808:22;5800:67;;;;-1:-1:-1;;;5800:67:0;;;;;;;:::i;:::-;35928:23:::1;:50:::0;35820:166::o;6051:244::-;5808:6;;-1:-1:-1;;;;;5808:6:0;156:10;5808:22;5800:67;;;;-1:-1:-1;;;5800:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6140:22:0;::::1;6132:73;;;::::0;-1:-1:-1;;;6132:73:0;;7632:2:1;6132:73:0::1;::::0;::::1;7614:21:1::0;7671:2;7651:18;;;7644:30;7710:34;7690:18;;;7683:62;-1:-1:-1;;;7761:18:1;;;7754:36;7807:19;;6132:73:0::1;7604:228:1::0;6132:73:0::1;6242:6;::::0;;6221:38:::1;::::0;-1:-1:-1;;;;;6221:38:0;;::::1;::::0;6242:6;::::1;::::0;6221:38:::1;::::0;::::1;6270:6;:17:::0;;-1:-1:-1;;;;;;6270:17:0::1;-1:-1:-1::0;;;;;6270:17:0;;;::::1;::::0;;;::::1;::::0;;6051:244::o;21842:337::-;-1:-1:-1;;;;;21935:19:0;;21927:68;;;;-1:-1:-1;;;21927:68:0;;11502:2:1;21927:68:0;;;11484:21:1;11541:2;11521:18;;;11514:30;11580:34;11560:18;;;11553:62;-1:-1:-1;;;11631:18:1;;;11624:34;11675:19;;21927:68:0;11474:226:1;21927:68:0;-1:-1:-1;;;;;22014:21:0;;22006:68;;;;-1:-1:-1;;;22006:68:0;;8039:2:1;22006:68:0;;;8021:21:1;8078:2;8058:18;;;8051:30;8117:34;8097:18;;;8090:62;-1:-1:-1;;;8168:18:1;;;8161:32;8210:19;;22006:68:0;8011:224:1;22006:68:0;-1:-1:-1;;;;;22087:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;22139:32;;12264:25:1;;;22139:32:0;;12237:18:1;22139:32:0;;;;;;;21842:337;;;:::o;22187:2635::-;-1:-1:-1;;;;;22309:18:0;;22301:68;;;;-1:-1:-1;;;22301:68:0;;11096:2:1;22301:68:0;;;11078:21:1;11135:2;11115:18;;;11108:30;11174:34;11154:18;;;11147:62;-1:-1:-1;;;11225:18:1;;;11218:35;11270:19;;22301:68:0;11068:227:1;22301:68:0;-1:-1:-1;;;;;22388:16:0;;22380:64;;;;-1:-1:-1;;;22380:64:0;;6817:2:1;22380:64:0;;;6799:21:1;6856:2;6836:18;;;6829:30;6895:34;6875:18;;;6868:62;-1:-1:-1;;;6946:18:1;;;6939:33;6989:19;;22380:64:0;6789:225:1;22380:64:0;22472:1;22463:6;:10;22455:64;;;;-1:-1:-1;;;22455:64:0;;10686:2:1;22455:64:0;;;10668:21:1;10725:2;10705:18;;;10698:30;10764:34;10744:18;;;10737:62;-1:-1:-1;;;10815:18:1;;;10808:39;10864:19;;22455:64:0;10658:231:1;22455:64:0;5719:7;5746:6;-1:-1:-1;;;;;22533:15:0;;;5746:6;;22533:15;;;;:32;;-1:-1:-1;5719:7:0;5746:6;-1:-1:-1;;;;;22552:13:0;;;5746:6;;22552:13;;22533:32;:69;;;;-1:-1:-1;;;;;;22570:32:0;;;;;;:26;:32;;;;;;;;22569:33;22533:69;22530:176;;;22637:12;;22627:6;:22;;22619:75;;;;-1:-1:-1;;;22619:75:0;;9514:2:1;22619:75:0;;;9496:21:1;9553:2;9533:18;;;9526:30;9592:34;9572:18;;;9565:62;-1:-1:-1;;;9643:18:1;;;9636:38;9691:19;;22619:75:0;9486:230:1;22619:75:0;22718:28;22749:24;22767:4;22749:9;:24::i;:::-;22839:23;;22878:16;;22718:55;;-1:-1:-1;22815:47:0;;;;22878:16;;22877:17;:42;;;;-1:-1:-1;22898:21:0;;;;;;;22877:42;:65;;;;;22929:13;-1:-1:-1;;;;;22923:19:0;:2;-1:-1:-1;;;;;22923:19:0;;22877:65;22873:1089;;;22963:23;22959:165;;;15945:17;23007:50;;23076:32;23087:20;23076:10;:32::i;:::-;23195:14;;23155:21;;23195:14;;;;;:47;;;;;23231:10;23213:7;:29;23195:47;23191:760;;;23261:21;23285:19;:17;:19::i;:::-;23261:43;;23321:34;23358:57;23408:6;23358:45;23399:3;23358:36;23376:17;;23358:13;:17;;:36;;;;:::i;:::-;:40;;:45::i;:57::-;23321:94;;23446:17;;23436:7;:27;23432:504;;;23498:26;23488:6;:36;23484:435;;23557:17;;;-1:-1:-1;23595:31:0;23609:16;23557:17;23621:3;23609:11;:16::i;:::-;23595:13;:31::i;:::-;23484:435;;;23697:16;;23674:20;;:39;;;;:::i;:::-;23656:15;:57;23652:267;;;23736:18;23757:37;23780:13;23757:18;:6;23768;23757:10;:18::i;:37::-;23736:58;;23815:25;23829:10;23815:13;:25::i;:::-;-1:-1:-1;23884:15:0;23861:20;:38;23652:267;23191:760;;;22873:1089;;24040:12;;24016:20;:36;24013:112;;24101:12;;24078:35;;24013:112;15857:26;24162:53;;;;;;;24244;;-1:-1:-1;24281:16:0;;;;24280:17;24244:53;:91;;;;;24322:13;-1:-1:-1;;;;;24314:21:0;:4;-1:-1:-1;;;;;24314:21:0;;;24244:91;:129;;;;-1:-1:-1;24352:21:0;;;;;;;24244:129;24226:318;;;15857:26;24400:52;;24496:36;24511:20;24496:14;:36::i;:::-;-1:-1:-1;;;;;24671:24:0;;24554:12;24671:24;;;:18;:24;;;;;;24569:4;;24671:24;;;:50;;-1:-1:-1;;;;;;24699:22:0;;;;;;:18;:22;;;;;;;;24671:50;24668:96;;;-1:-1:-1;24747:5:0;24668:96;24776:38;24791:4;24796:2;24799:6;24806:7;24776:14;:38::i;:::-;22187:2635;;;;;;;:::o;1463:192::-;1549:7;1585:12;1577:6;;;;1569:29;;;;-1:-1:-1;;;1569:29:0;;;;;;;;:::i;:::-;-1:-1:-1;1609:9:0;1621:5;1625:1;1621;:5;:::i;:::-;1609:17;1463:192;-1:-1:-1;;;;;1463:192:0:o;32609:163::-;32650:7;32671:15;32688;32707:19;:17;:19::i;:::-;32670:56;;-1:-1:-1;32670:56:0;-1:-1:-1;32744:20:0;32670:56;;32744:11;:20::i;:::-;32737:27;;;;32609:163;:::o;1923:132::-;1981:7;2008:39;2012:1;2015;2008:39;;;;;;;;;;;;;;;;;:3;:39::i;1130:181::-;1188:7;;1220:5;1224:1;1220;:5;:::i;:::-;1208:17;;1249:1;1244;:6;;1236:46;;;;-1:-1:-1;;;1236:46:0;;8442:2:1;1236:46:0;;;8424:21:1;8481:2;8461:18;;;8454:30;8520:29;8500:18;;;8493:57;8567:18;;1236:46:0;8414:177:1;31407:419:0;31466:7;31475;31484;31493;31502;31511;31532:23;31557:12;31571:18;31593:20;31605:7;31593:11;:20::i;:::-;31531:82;;;;;;31625:15;31642:23;31667:12;31683:50;31695:7;31704:4;31710:10;31722;:8;:10::i;:::-;31683:11;:50::i;:::-;31624:109;;;;-1:-1:-1;31624:109:0;;-1:-1:-1;31784:15:0;;-1:-1:-1;31801:4:0;;-1:-1:-1;31807:10:0;;-1:-1:-1;31407:419:0;;-1:-1:-1;;;;;31407:419:0:o;1319:136::-;1377:7;1404:43;1408:1;1411;1404:43;;;;;;;;;;;;;;;;;:3;:43::i;25748:589::-;16931:16;:23;;-1:-1:-1;;16931:23:0;16950:4;16931:23;;;25856:21:::1;25888:38;25905:20:::0;25888:16:::1;:38::i;:::-;25937:26;25966:41;:21;25992:14:::0;25966:25:::1;:41::i;:::-;25937:70;;26057:113;26078:16;;;;;;;;;-1:-1:-1::0;;;;;26078:16:0::1;26096:73;26167:1;26096:66;26160:1;26096:59;26138:16;;26096:37;26119:13;;26096:18;:22;;:37;;;;:::i;:::-;:41:::0;::::1;:59::i;:73::-;26057:20;:113::i;:::-;26237:14;::::0;26295:16:::1;::::0;26276:13:::1;::::0;26216:111:::1;::::0;-1:-1:-1;;;;;26237:14:0::1;::::0;26253:73:::1;::::0;26324:1:::1;::::0;26253:66:::1;::::0;26317:1:::1;::::0;26253:59:::1;::::0;;;:18;;:22:::1;:37::i;26216:111::-;-1:-1:-1::0;;16977:16:0;:24;;-1:-1:-1;;16977:24:0;;;-1:-1:-1;25748:589:0:o;33343:270::-;33393:7;33411:19;33448:13;33411:51;;33472:9;33483;33497:4;-1:-1:-1;;;;;33497:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;33471:44:0;;;;-1:-1:-1;33471:44:0;;-1:-1:-1;33531:26:0;33550:6;33531:14;33471:44;;33531:8;:14::i;:26::-;33524:33;;;;;33343:270;:::o;1663:250::-;1721:7;1745:6;1741:47;;-1:-1:-1;1775:1:0;1768:8;;1741:47;1800:9;1812:5;1816:1;1812;:5;:::i;:::-;1800:17;-1:-1:-1;1845:1:0;1836:5;1840:1;1800:17;1836:5;:::i;:::-;:10;1828:56;;;;-1:-1:-1;;;1828:56:0;;9923:2:1;1828:56:0;;;9905:21:1;9962:2;9942:18;;;9935:30;10001:34;9981:18;;;9974:62;-1:-1:-1;;;10052:18:1;;;10045:31;10093:19;;1828:56:0;9895:223:1;26347:135:0;16931:16;:23;;-1:-1:-1;;16931:23:0;16950:4;16931:23;;;26418:10;;26414:61:::1;;26442:24;26459:6;26442:16;:24::i;:::-;-1:-1:-1::0;16977:16:0;:24;;-1:-1:-1;;16977:24:0;;;26347:135::o;24830:910::-;16931:16;:23;;-1:-1:-1;;16931:23:0;16950:4;16931:23;;;:16;24981:27:::1;:20:::0;25006:1:::1;24981:24;:27::i;:::-;24966:42:::0;-1:-1:-1;25019:17:0::1;25039:30;:20:::0;24966:42;25039:24:::1;:30::i;:::-;25019:50:::0;-1:-1:-1;25372:21:0::1;25438:22;25455:4:::0;25438:16:::1;:22::i;:::-;25524:18;25545:41;:21;25571:14:::0;25545:25:::1;:41::i;:::-;25524:62;;25636:35;25649:9;25660:10;25636:12;:35::i;:::-;25689:43;::::0;;13426:25:1;;;13482:2;13467:18;;13460:34;;;13510:18;;;13503:34;;;25689:43:0::1;::::0;13414:2:1;13399:18;25689:43:0::1;;;;;;;-1:-1:-1::0;;16977:16:0;:24;;-1:-1:-1;;16977:24:0;;;-1:-1:-1;;;24830:910:0:o;28259:688::-;28370:7;28366:40;;28392:14;:12;:14::i;:::-;-1:-1:-1;;;;;28423:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;28447:22:0;;;;;;:11;:22;;;;;;;;28446:23;28423:46;28419:467;;;28486:48;28508:6;28516:9;28527:6;28486:21;:48::i;:::-;28419:467;;;-1:-1:-1;;;;;28557:19:0;;;;;;:11;:19;;;;;;;;28556:20;:46;;;;-1:-1:-1;;;;;;28580:22:0;;;;;;:11;:22;;;;;;;;28556:46;28552:334;;;28619:46;28639:6;28647:9;28658:6;28619:19;:46::i;28552:334::-;-1:-1:-1;;;;;28687:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;28710:22:0;;;;;;:11;:22;;;;;;;;28687:45;28683:203;;;28749:48;28771:6;28779:9;28790:6;28749:21;:48::i;28683:203::-;28830:44;28848:6;28856:9;28867:6;28830:17;:44::i;:::-;28902:7;28898:41;;28924:15;34616;;34606:7;:25;34658:21;;34642:13;:37;34562:125;28924:15;28259:688;;;;:::o;32780:555::-;32877:7;;32913;;32830;;;;;32931:289;32955:9;:16;32951:20;;32931:289;;;33021:7;32997;:21;33005:9;33015:1;33005:12;;;;;;-1:-1:-1;;;33005:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33005:12:0;32997:21;;;;;;;;;;;;;:31;;:66;;;33056:7;33032;:21;33040:9;33050:1;33040:12;;;;;;-1:-1:-1;;;33040:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33040:12:0;33032:21;;;;;;;;;;;;;:31;32997:66;32993:97;;;33073:7;;33082;;33065:25;;;;;;;32780:555;;:::o;32993:97::-;33115:34;33127:7;:21;33135:9;33145:1;33135:12;;;;;;-1:-1:-1;;;33135:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33135:12:0;33127:21;;;;;;;;;;;;;33115:7;;:11;:34::i;:::-;33105:44;;33174:34;33186:7;:21;33194:9;33204:1;33194:12;;;;;;-1:-1:-1;;;33194:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33194:12:0;33186:21;;;;;;;;;;;;;33174:7;;:11;:34::i;:::-;33164:44;-1:-1:-1;32973:3:0;;;;:::i;:::-;;;;32931:289;;;-1:-1:-1;33256:7:0;;33244;;:20;;:11;:20::i;:::-;33234:7;:30;33230:61;;;33274:7;;33283;;33266:25;;;;;;32780:555;;:::o;33230:61::-;33310:7;;33319;;-1:-1:-1;32780:555:0;-1:-1:-1;32780:555:0:o;2063:278::-;2149:7;2184:12;2177:5;2169:28;;;;-1:-1:-1;;;2169:28:0;;;;;;;;:::i;:::-;-1:-1:-1;2208:9:0;2220:5;2224:1;2220;:5;:::i;31834:330::-;31894:7;31903;31912;31932:12;31947:24;31963:7;31947:15;:24::i;:::-;31932:39;;31982:18;32003:30;32025:7;32003:21;:30::i;:::-;31982:51;-1:-1:-1;32044:23:0;32070:33;31982:51;32070:17;:7;32082:4;32070:11;:17::i;:::-;:21;;:33::i;:::-;32044:59;32139:4;;-1:-1:-1;32145:10:0;;-1:-1:-1;31834:330:0;;-1:-1:-1;;;31834:330:0:o;32172:429::-;32287:7;;;;32343:24;:7;32355:11;32343;:24::i;:::-;32325:42;-1:-1:-1;32378:12:0;32393:21;:4;32402:11;32393:8;:21::i;:::-;32378:36;-1:-1:-1;32425:18:0;32446:27;:10;32461:11;32446:14;:27::i;:::-;32425:48;-1:-1:-1;32484:23:0;32510:33;32425:48;32510:17;:7;32522:4;32510:11;:17::i;:33::-;32562:7;;;;-1:-1:-1;32588:4:0;;-1:-1:-1;32172:429:0;;-1:-1:-1;;;;;;;32172:429:0:o;26490:658::-;26640:16;;;26654:1;26640:16;;;;;;;;26616:21;;26640:16;;;;;;;;;;-1:-1:-1;26640:16:0;26616:40;;26685:4;26667;26672:1;26667:7;;;;;;-1:-1:-1;;;26667:7:0;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;26667:23:0;;;-1:-1:-1;;;;;26667:23:0;;;;;26711:15;-1:-1:-1;;;;;26711:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26701:4;26706:1;26701:7;;;;;;-1:-1:-1;;;26701:7:0;;;;;;;;;;;;;;:32;-1:-1:-1;;;;;26701:32:0;;;-1:-1:-1;;;;;26701:32:0;;;;;26746:62;26763:4;26778:15;26796:11;26746:8;:62::i;:::-;26847:240;;-1:-1:-1;;;26847:240:0;;-1:-1:-1;;;;;26847:15:0;:66;;;;:240;;26928:11;;26954:1;;26998:4;;27025;;27061:15;;26847:240;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27105:35;27122:11;27135:4;27105:35;;;;;;;:::i;:::-;;;;;;;;26490:658;;:::o;37212:126::-;37304:26;;-1:-1:-1;;;;;37304:18:0;;;:26;;;;;37323:6;;37304:26;;;;37323:6;37304:18;:26;;;;;;;;;;;;;;;;;;;;;37212:126;;:::o;27156:570::-;27301:16;;;27315:1;27301:16;;;;;;;;27277:21;;27301:16;;;;;;;;;;-1:-1:-1;27301:16:0;27277:40;;27338:15;-1:-1:-1;;;;;27338:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27328:4;27333:1;27328:7;;;;;;-1:-1:-1;;;27328:7:0;;;;;;;;;;;;;;:32;-1:-1:-1;;;;;27328:32:0;;;-1:-1:-1;;;;;27328:32:0;;;;;27389:4;27371;27376:1;27371:7;;;;;;-1:-1:-1;;;27371:7:0;;;;;;;;;-1:-1:-1;;;;;27371:23:0;;;:7;;;;;;;;;:23;27431:15;:66;;27505:6;27527:1;27574:4;27593:11;27635:24;:15;27655:3;27635:19;:24::i;:::-;27431:239;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27688:30;27705:6;27713:4;27688:30;;;;;;;:::i;27734:517::-;27882:62;27899:4;27914:15;27932:11;27882:8;:62::i;:::-;27987:256;;-1:-1:-1;;;27987:256:0;;28059:4;27987:256;;;4794:34:1;4844:18;;;4837:34;;;-1:-1:-1;4887:18:1;;;4880:34;;;4930:18;;;4923:34;-1:-1:-1;;;;;28191:11:0;4994:15:1;;4973:19;;;4966:44;28217:15:0;5026:19:1;;;5019:35;27987:15:0;:31;;;;28026:9;;4728:19:1;;27987:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;27734:517;;:::o;34320:234::-;34366:7;;:12;:34;;;;-1:-1:-1;34382:13:0;;:18;34366:34;34363:46;;;34320:234::o;34363:46::-;34439:7;;;34421:15;:25;34481:13;;;34457:21;:37;-1:-1:-1;34507:11:0;;;;34529:17;34320:234::o;30045:560::-;30148:15;30165:23;30190:12;30204:23;30229:12;30243:18;30265:19;30276:7;30265:10;:19::i;:::-;-1:-1:-1;;;;;30310:15:0;;;;;;:7;:15;;;;;;30147:137;;-1:-1:-1;30147:137:0;;-1:-1:-1;30147:137:0;;-1:-1:-1;30147:137:0;-1:-1:-1;30147:137:0;-1:-1:-1;30147:137:0;-1:-1:-1;30310:28:0;;30330:7;30310:19;:28::i;:::-;-1:-1:-1;;;;;30292:15:0;;;;;;:7;:15;;;;;;;;:46;;;;30367:7;:15;;;;:28;;30387:7;30367:19;:28::i;:::-;-1:-1:-1;;;;;30349:15:0;;;;;;;:7;:15;;;;;;:46;;;;30427:18;;;;;;;:39;;30450:15;30427:22;:39::i;:::-;-1:-1:-1;;;;;30406:18:0;;;;;;:7;:18;;;;;:60;30477:26;30492:10;30477:14;:26::i;:::-;30514:23;30526:4;30532;30514:11;:23::i;:::-;30570:9;-1:-1:-1;;;;;30553:44:0;30562:6;-1:-1:-1;;;;;30553:44:0;;30581:15;30553:44;;;;12264:25:1;;12252:2;12237:18;;12219:76;30553:44:0;;;;;;;;30045:560;;;;;;;;;:::o;29465:572::-;29566:15;29583:23;29608:12;29622:23;29647:12;29661:18;29683:19;29694:7;29683:10;:19::i;:::-;-1:-1:-1;;;;;29728:15:0;;;;;;:7;:15;;;;;;29565:137;;-1:-1:-1;29565:137:0;;-1:-1:-1;29565:137:0;;-1:-1:-1;29565:137:0;-1:-1:-1;29565:137:0;-1:-1:-1;29565:137:0;-1:-1:-1;29728:28:0;;29565:137;29728:19;:28::i;:::-;-1:-1:-1;;;;;29710:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;29788:18;;;;;:7;:18;;;;;:39;;29811:15;29788:22;:39::i;:::-;-1:-1:-1;;;;;29767:18:0;;;;;;:7;:18;;;;;;;;:60;;;;29859:7;:18;;;;:39;;29882:15;29859:22;:39::i;30613:631::-;30716:15;30733:23;30758:12;30772:23;30797:12;30811:18;30833:19;30844:7;30833:10;:19::i;:::-;-1:-1:-1;;;;;30878:15:0;;;;;;:7;:15;;;;;;30715:137;;-1:-1:-1;30715:137:0;;-1:-1:-1;30715:137:0;;-1:-1:-1;30715:137:0;-1:-1:-1;30715:137:0;-1:-1:-1;30715:137:0;-1:-1:-1;30878:28:0;;30898:7;30878:19;:28::i;:::-;-1:-1:-1;;;;;30860:15:0;;;;;;:7;:15;;;;;;;;:46;;;;30935:7;:15;;;;:28;;30955:7;30935:19;:28::i;28955:502::-;29054:15;29071:23;29096:12;29110:23;29135:12;29149:18;29171:19;29182:7;29171:10;:19::i;:::-;-1:-1:-1;;;;;29219:15:0;;;;;;:7;:15;;;;;;29053:137;;-1:-1:-1;29053:137:0;;-1:-1:-1;29053:137:0;;-1:-1:-1;29053:137:0;-1:-1:-1;29053:137:0;-1:-1:-1;29053:137:0;-1:-1:-1;29219:28:0;;29053:137;29219:19;:28::i;33984:154::-;34048:7;34075:55;34114:5;34075:20;34087:7;;34075;:11;;:20;;;;:::i;34146:166::-;34216:7;34243:61;34288:5;34243:26;34255:13;;34243:7;:11;;:26;;;;:::i;33621:355::-;33684:19;33707:10;:8;:10::i;:::-;33684:33;-1:-1:-1;33728:18:0;33749:27;:10;33684:33;33749:14;:27::i;:::-;33828:4;33812:22;;;;:7;:22;;;;;;33728:48;;-1:-1:-1;33812:38:0;;33728:48;33812:26;:38::i;:::-;33803:4;33787:22;;;;:7;:22;;;;;;;;:63;;;;33864:11;:26;;;;;;33861:107;;;33946:4;33930:22;;;;:7;:22;;;;;;:38;;33957:10;33930:26;:38::i;:::-;33921:4;33905:22;;;;:7;:22;;;;;:63;33621:355;;;:::o;31252:147::-;31330:7;;:17;;31342:4;31330:11;:17::i;:::-;31320:7;:27;31371:10;;:20;;31386:4;31371:14;:20::i;:::-;31358:10;:33;-1:-1:-1;;31252:147:0:o;14:160:1:-;79:20;;135:13;;128:21;118:32;;108:2;;164:1;161;154:12;108:2;60:114;;;:::o;179:188::-;258:13;;-1:-1:-1;;;;;300:42:1;;290:53;;280:2;;357:1;354;347:12;372:257;431:6;484:2;472:9;463:7;459:23;455:32;452:2;;;505:6;497;490:22;452:2;549:9;536:23;568:31;593:5;568:31;:::i;634:261::-;704:6;757:2;745:9;736:7;732:23;728:32;725:2;;;778:6;770;763:22;725:2;815:9;809:16;834:31;859:5;834:31;:::i;900:398::-;968:6;976;1029:2;1017:9;1008:7;1004:23;1000:32;997:2;;;1050:6;1042;1035:22;997:2;1094:9;1081:23;1113:31;1138:5;1113:31;:::i;:::-;1163:5;-1:-1:-1;1220:2:1;1205:18;;1192:32;1233:33;1192:32;1233:33;:::i;:::-;1285:7;1275:17;;;987:311;;;;;:::o;1303:466::-;1380:6;1388;1396;1449:2;1437:9;1428:7;1424:23;1420:32;1417:2;;;1470:6;1462;1455:22;1417:2;1514:9;1501:23;1533:31;1558:5;1533:31;:::i;:::-;1583:5;-1:-1:-1;1640:2:1;1625:18;;1612:32;1653:33;1612:32;1653:33;:::i;:::-;1407:362;;1705:7;;-1:-1:-1;;;1759:2:1;1744:18;;;;1731:32;;1407:362::o;1774:325::-;1842:6;1850;1903:2;1891:9;1882:7;1878:23;1874:32;1871:2;;;1924:6;1916;1909:22;1871:2;1968:9;1955:23;1987:31;2012:5;1987:31;:::i;:::-;2037:5;2089:2;2074:18;;;;2061:32;;-1:-1:-1;;;1861:238:1:o;2104:190::-;2160:6;2213:2;2201:9;2192:7;2188:23;2184:32;2181:2;;;2234:6;2226;2219:22;2181:2;2262:26;2278:9;2262:26;:::i;2299:470::-;2386:6;2394;2402;2455:2;2443:9;2434:7;2430:23;2426:32;2423:2;;;2476:6;2468;2461:22;2423:2;2504:40;2534:9;2504:40;:::i;:::-;2494:50;;2563:49;2608:2;2597:9;2593:18;2563:49;:::i;:::-;2553:59;;2655:2;2644:9;2640:18;2634:25;2699:10;2692:5;2688:22;2681:5;2678:33;2668:2;;2730:6;2722;2715:22;2668:2;2758:5;2748:15;;;2413:356;;;;;:::o;2774:190::-;2833:6;2886:2;2874:9;2865:7;2861:23;2857:32;2854:2;;;2907:6;2899;2892:22;2854:2;-1:-1:-1;2935:23:1;;2844:120;-1:-1:-1;2844:120:1:o;2969:258::-;3034:6;3042;3095:2;3083:9;3074:7;3070:23;3066:32;3063:2;;;3116:6;3108;3101:22;3063:2;3157:9;3144:23;3134:33;;3186:35;3217:2;3206:9;3202:18;3186:35;:::i;:::-;3176:45;;3053:174;;;;;:::o;3232:316::-;3320:6;3328;3336;3389:2;3377:9;3368:7;3364:23;3360:32;3357:2;;;3410:6;3402;3395:22;3357:2;3444:9;3438:16;3428:26;;3494:2;3483:9;3479:18;3473:25;3463:35;;3538:2;3527:9;3523:18;3517:25;3507:35;;3347:201;;;;;:::o;3553:463::-;3606:3;3644:5;3638:12;3671:6;3666:3;3659:19;3697:4;3726:2;3721:3;3717:12;3710:19;;3763:2;3756:5;3752:14;3784:3;3796:195;3810:6;3807:1;3804:13;3796:195;;;3875:13;;-1:-1:-1;;;;;3871:39:1;3859:52;;3931:12;;;;3966:15;;;;3907:1;3825:9;3796:195;;;-1:-1:-1;4007:3:1;;3614:402;-1:-1:-1;;;;;3614:402:1:o;5492:510::-;5763:6;5752:9;5745:25;5806:3;5801:2;5790:9;5786:18;5779:31;5726:4;5827:57;5879:3;5868:9;5864:19;5856:6;5827:57;:::i;:::-;-1:-1:-1;;;;;5920:32:1;;;;5915:2;5900:18;;5893:60;-1:-1:-1;5984:2:1;5969:18;5962:34;5819:65;5735:267;-1:-1:-1;;5735:267:1:o;6007:603::-;6119:4;6148:2;6177;6166:9;6159:21;6209:6;6203:13;6252:6;6247:2;6236:9;6232:18;6225:34;6277:4;6290:140;6304:6;6301:1;6298:13;6290:140;;;6399:14;;;6395:23;;6389:30;6365:17;;;6384:2;6361:26;6354:66;6319:10;;6290:140;;;6448:6;6445:1;6442:13;6439:2;;;6518:4;6513:2;6504:6;6493:9;6489:22;6485:31;6478:45;6439:2;-1:-1:-1;6594:2:1;6573:15;-1:-1:-1;;6569:29:1;6554:45;;;;6601:2;6550:54;;6128:482;-1:-1:-1;;;6128:482:1:o;10123:356::-;10325:2;10307:21;;;10344:18;;;10337:30;10403:34;10398:2;10383:18;;10376:62;10470:2;10455:18;;10297:182::o;12300:332::-;12507:6;12496:9;12489:25;12550:2;12545;12534:9;12530:18;12523:30;12470:4;12570:56;12622:2;12611:9;12607:18;12599:6;12570:56;:::i;:::-;12562:64;12479:153;-1:-1:-1;;;;12479:153:1:o;12637:582::-;12936:6;12925:9;12918:25;12979:6;12974:2;12963:9;12959:18;12952:34;13022:3;13017:2;13006:9;13002:18;12995:31;12899:4;13043:57;13095:3;13084:9;13080:19;13072:6;13043:57;:::i;:::-;-1:-1:-1;;;;;13136:32:1;;;;13131:2;13116:18;;13109:60;-1:-1:-1;13200:3:1;13185:19;13178:35;13035:65;12908:311;-1:-1:-1;;;12908:311:1:o;13737:128::-;13777:3;13808:1;13804:6;13801:1;13798:13;13795:2;;;13814:18;;:::i;:::-;-1:-1:-1;13850:9:1;;13785:80::o;13870:217::-;13910:1;13936;13926:2;;-1:-1:-1;;;13961:31:1;;14015:4;14012:1;14005:15;14043:4;13968:1;14033:15;13926:2;-1:-1:-1;14072:9:1;;13916:171::o;14092:168::-;14132:7;14198:1;14194;14190:6;14186:14;14183:1;14180:21;14175:1;14168:9;14161:17;14157:45;14154:2;;;14205:18;;:::i;:::-;-1:-1:-1;14245:9:1;;14144:116::o;14265:125::-;14305:4;14333:1;14330;14327:8;14324:2;;;14338:18;;:::i;:::-;-1:-1:-1;14375:9:1;;14314:76::o;14395:380::-;14474:1;14470:12;;;;14517;;;14538:2;;14592:4;14584:6;14580:17;14570:27;;14538:2;14645;14637:6;14634:14;14614:18;14611:38;14608:2;;;14691:10;14686:3;14682:20;14679:1;14672:31;14726:4;14723:1;14716:15;14754:4;14751:1;14744:15;14608:2;;14450:325;;;:::o;14780:135::-;14819:3;-1:-1:-1;;14840:17:1;;14837:2;;;14860:18;;:::i;:::-;-1:-1:-1;14907:1:1;14896:13;;14827:88::o;14920:127::-;14981:10;14976:3;14972:20;14969:1;14962:31;15012:4;15009:1;15002:15;15036:4;15033:1;15026:15;15052:131;-1:-1:-1;;;;;15127:31:1;;15117:42;;15107:2;;15173:1;15170;15163:12;15107:2;15097:86;:::o

Swarm Source

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