MATIC Price: $0.720433 (-3.42%)
Gas: 33 GWei
 

Overview

Max Total Supply

10,000,000,000 PAY

Holders

4,115 (0.00%)

Market

Price

$0.00 @ 0.000062 MATIC

Onchain Market Cap

$447,100.00

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
PayBolt: PAY Token
Balance
74,448,633.533506215652615911 PAY

Value
$3,328.60 ( ~4,620.2788 MATIC) [0.7445%]
0xe580074a10360404af3abfe2d524d5806d993ea3
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

PayBolt is a Web3 cross-chain crypto payment ecosystem built exclusively for commerce. With its native $PAY token and cross-chain bridge capabilities, $PAY allows lightning-fast transactions. $PAY tokens also incentivize investors and businesses, accelerating the adoption of crypto for payments.

Market

Volume (24H):$30.68
Market Capitalization:$0.00
Circulating Supply:0.00 PAY
Market Data Source: Coinmarketcap

Contract Source Code Verified (Exact Match)

Contract Name:
PayBolt

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-01-21
*/

/*

PayBolt - The future of crypto payments

Pay expenses, earn $PAY rewards with your crypto tokens in near-instant time. Start spending your tokens at cafe, restaurant and everywhere.

*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.11;

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

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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

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

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

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

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

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

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

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address owner) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint256);
    function price1CumulativeLast() external view returns (uint256);
    function kLast() external view returns (uint256);

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

    function initialize(address, address) external;
}

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

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

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

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

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

contract ERC20 is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;
    
    address payable public teamAddress = payable(0x7Ccb537E8A041977A9B32Cda7Ff987ea0920FdAF); // Team Address
    address payable public treasuryAddress = payable(0x307942ea000c44F32a7f97a8b4f8ab12F1Bc98e6); // Treasury Address
    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) internal isBlacklisted;
    mapping (address => bool) internal isWhitelistedMerchant;

    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private _isOriginExcludedFromFee;
    mapping (address => bool) private _isDestinationExcludedFromFee;
    mapping (address => bool) private _isExcludedFromReward;
    address[] private _excludedFromReward;
   
    string private _name;
    string private _symbol;
    uint8 private _decimals = 18;

    uint256 private constant _MAX = ~uint256(0);
    uint256 private _tTotal = 10 * 10**9 * 10**_decimals;
    uint256 private _rTotal = (_MAX - (_MAX % _tTotal));
    uint256 private _tFeeTotal;

    // payment fee in percentage, 100% = 10000; 1% = 100; 0.1% = 10
    uint256 public paymentFee = 0; 

    // rewards to holder in percentage, 100% = 10000; 1% = 100; 0.1% = 10
    uint256 public taxFee = 300; 
    uint256 private _previousTaxFee = taxFee;

    // in percentage, 100% = 10000; 1% = 100; 0.1% = 10
    uint256 public taxTeamPercent = 400;
    uint256 public taxTreasuryPercent = 100;
    uint256 public taxLPPercent = 200;
    uint256 public liquidityFee = 700;   // Team + Treasury + LP
    uint256 private _previousLiquidityFee = liquidityFee;
    
    uint256 public maxTxAmount = 100 * 10**6 * 10**_decimals;
    uint256 public minimumTokensBeforeSwap = 2 * 10**6 * 10**_decimals; 

    uint256 public holders = 0;

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;
    
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;

    event RouterAddressUpdated(address prevAddress, address newAddress);
    event RewardLiquidityProviders(uint256 tokenAmount);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event ApplyTax(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    event SwapTokensForETH(uint256 amountIn, address[] path);
    event AddLiquidity(uint256 tokenAmount, uint256 ethAmount);
    event ExcludeFromReward(address account);
    event IncludeInReward(address account);
    event ExcludeFromFee(address account);
    event IncludeInFee(address account);
    event ExcludeOriginFromFee(address account);
    event IncludeOriginInFee(address account);
    event ExcludeDestinationFromFee(address account);
    event IncludeDestinationInFee(address account);
    event BlackList(address account);
    event RemoveFromBlacklist(address account);
    event WhitelistMerchant(address account);
    event RemoveFromWhitelistMerchant(address account);
    event SetTaxFeePercent(uint256 taxFee);
    event SetPaymentFeePercent(uint256 percent);
    event SetMaxTxAmount(uint256 maxTxAmount);
    event SetLiquidityFeePercent(uint256 _iquidityFee);
    event SetTaxTeamPercent(uint256 percent);
    event SetTaxTreasuryPercent(uint256 percent);
    event SetTaxLPPercent(uint256 percent);
    event SetNumTokensSellToAddToLiquidity(uint256 minimumTokensBeforeSwap);
    event SetTeamAddress(address teamAddress);
    event SetTreasuryAddress(address treasuryAddress);
    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    
    constructor (string memory name_, string memory symbol_, address routerAddress_) {
        _name = name_;
        _symbol = symbol_;
        
        _rOwned[_msgSender()] = _rTotal;

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

        uniswapV2Router = _uniswapV2Router;

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

        holders = 1;
        
        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 (_isExcludedFromReward[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] + 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 totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }
    
    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 / currentRate;
    }

    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(!isBlacklisted[from], "Address is backlisted");
        require(!isBlacklisted[to], "Address is backlisted");
        require(amount > 0, "Transfer amount must be greater than zero");
        if(from != owner() && to != owner()) {
            require(amount <= maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
        }

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

        if (!inSwapAndLiquify && swapAndLiquifyEnabled && to == uniswapV2Pair) {
            if (overMinimumTokenBalance) {
                applyTax(minimumTokensBeforeSwap); 
            }
        }

        bool takeFee = true;
        
        //if any account belongs to _isExcludedFromFee account then remove the fee
        //if origin account belongs to _isOriginExcludedFromFee account then remove the fee
        //if destination account belongs to _isDestinationExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to] || _isOriginExcludedFromFee[from] || _isDestinationExcludedFromFee[to]){
            takeFee = false;
        }
        
        _tokenTransfer(from, to, amount, takeFee);
    }

    function applyTax(uint256 contractTokenBalance) private lockTheSwap {
        // ethPortion = team + treasury + LP/2
        uint256 halfLP = taxLPPercent / 2;
        uint256 totalEthPortion = taxTeamPercent + taxTreasuryPercent + halfLP;
        uint256 toSwapIntoEth = contractTokenBalance / liquidityFee * totalEthPortion;

        uint256 initialBalance = address(this).balance;
        swapTokensForEth(address(this), address(this), toSwapIntoEth);
        uint256 transferredBalance = address(this).balance - initialBalance;

        uint256 teamPortion = transferredBalance / totalEthPortion * taxTeamPercent;
        uint256 treasuryPortion = transferredBalance / totalEthPortion * taxTreasuryPercent;

        // Send to Team address
        transferToAddressETH(teamAddress, teamPortion);

        // Send to Treasury address
        transferToAddressETH(treasuryAddress, treasuryPortion);

        // add liquidity to uniswap
        uint256 leftOverToken = contractTokenBalance - toSwapIntoEth;
        uint256 leftOverEth = transferredBalance - teamPortion - treasuryPortion;
        addLiquidity(leftOverToken, leftOverEth);
        
        emit ApplyTax(toSwapIntoEth, transferredBalance, leftOverToken);
    }

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

        IERC20(tokenAddress).approve(address(uniswapV2Router), tokenAmount);

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

        emit SwapTokensForETH(tokenAmount, 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
            owner(),
            block.timestamp
        );

        emit AddLiquidity(tokenAmount, ethAmount);
    }

    function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFee) private {
        if(!takeFee)
            removeAllFee();
        
        if (_isExcludedFromReward[sender] && !_isExcludedFromReward[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcludedFromReward[sender] && _isExcludedFromReward[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (_isExcludedFromReward[sender] && _isExcludedFromReward[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);

        uint256 senderBefore = _rOwned[sender];
        uint256 senderAfter = _rOwned[sender] - rAmount;
        _rOwned[sender] = senderAfter;

        uint256 recipientBefore = _rOwned[recipient];
        uint256 recipientAfter = _rOwned[recipient] + rTransferAmount;
        _rOwned[recipient] = recipientAfter;

        _updateHolderCount(senderBefore, senderAfter, recipientBefore, recipientAfter);

        _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);
        
        uint256 senderBefore = _rOwned[sender];
        uint256 senderAfter = _rOwned[sender] - rAmount;
        _rOwned[sender] = senderAfter;

        uint256 recipientBefore = _tOwned[recipient];
        uint256 recipientAfter = _tOwned[recipient] + tTransferAmount;
        _tOwned[recipient] = recipientAfter;
        _rOwned[recipient] = _rOwned[recipient] + rTransferAmount; 
        
        _updateHolderCount(senderBefore, senderAfter, recipientBefore, recipientAfter);
     
        _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);
        
        uint256 senderBefore = _tOwned[sender];
        uint256 senderAfter = _tOwned[sender] - tAmount;
        _tOwned[sender] = senderAfter;
        _rOwned[sender] = _rOwned[sender] - rAmount;

        uint256 recipientBefore = _rOwned[recipient];
        uint256 recipientAfter = _rOwned[recipient] + rTransferAmount;
        _rOwned[recipient] = recipientAfter;

        _updateHolderCount(senderBefore, senderAfter, recipientBefore, recipientAfter);

        _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);
        
        uint256 senderBefore = _tOwned[sender];
        uint256 senderAfter = _tOwned[sender] - tAmount;
        _tOwned[sender] = senderAfter;
        _rOwned[sender] = _rOwned[sender] - rAmount;

        uint256 recipientBefore = _tOwned[recipient];
        uint256 recipientAfter = _tOwned[recipient] + tTransferAmount;
        _tOwned[recipient] = recipientAfter;
        _rOwned[recipient] = _rOwned[recipient] + rTransferAmount; 

        _updateHolderCount(senderBefore, senderAfter, recipientBefore, recipientAfter);
     
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal - rFee;
        _tFeeTotal = _tFeeTotal + 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 - tFee - tLiquidity;
        return (tTransferAmount, tFee, tLiquidity);
    }

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

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

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;      
        for (uint256 i = 0; i < _excludedFromReward.length; i++) {
            if (_rOwned[_excludedFromReward[i]] > rSupply || _tOwned[_excludedFromReward[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply - _rOwned[_excludedFromReward[i]];
            tSupply = tSupply - _tOwned[_excludedFromReward[i]];
        }
        if (rSupply < _rTotal / _tTotal) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
    
    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity * currentRate;
        _rOwned[address(this)] = _rOwned[address(this)] + rLiquidity;
        if(_isExcludedFromReward[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)] + tLiquidity;
    }
    
    function _updateHolderCount(uint256 senderBefore, uint256 senderAfter, uint256 recipientBefore, uint256 recipientAfter) private {
        if (recipientBefore == 0 && recipientAfter > 0) {
            holders = holders + 1;
        }

        if (senderBefore > 0 && senderAfter == 0) {
            holders = holders - 1;
        }
    }

    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount * taxFee / 10000;
    }
    
    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
        return _amount * liquidityFee / 10000;
    }

    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 isExcludedFromReward(address account) public view returns (bool) {
        return _isExcludedFromReward[account];
    }

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

        emit ExcludeFromReward(account);
    }

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

    function setRouterAddress(address routerAddress) external onlyOwner {
        require(
            routerAddress != address(0),
            "routerAddress should not be the zero address"
        );

        address prevAddress = address(uniswapV2Router);
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(routerAddress); 
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).getPair(
            address(this),
            _uniswapV2Router.WETH()
        );

        uniswapV2Router = _uniswapV2Router;
        emit RouterAddressUpdated(prevAddress, routerAddress);
    }

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }
    
    function excludeFromFee(address account) public onlyOwner {
        require(!_isExcludedFromFee[account], "Account is already excluded");
        _isExcludedFromFee[account] = true;
        emit ExcludeFromFee(account);
    }
    
    function includeInFee(address account) public onlyOwner {
        require(_isExcludedFromFee[account], "Account is already included");
        _isExcludedFromFee[account] = false;
        emit IncludeInFee(account);
    }
    
    function isOriginExcludedFromFee(address account) public view returns(bool) {
        return _isOriginExcludedFromFee[account];
    }
    
    function excludeOriginFromFee(address account) public onlyOwner {
        require(!_isOriginExcludedFromFee[account], "Account is already excluded");
        _isOriginExcludedFromFee[account] = true;
        emit ExcludeOriginFromFee(account);
    }
    
    function includeOriginInFee(address account) public onlyOwner {
        require(_isOriginExcludedFromFee[account], "Account is already included");
        _isOriginExcludedFromFee[account] = false;
        emit IncludeOriginInFee(account);
    }
    
    function isDestinationExcludedFromFee(address account) public view returns(bool) {
        return _isDestinationExcludedFromFee[account];
    }
    
    function excludeDestinationFromFee(address account) public onlyOwner {
        require(!_isDestinationExcludedFromFee[account], "Account is already excluded");
        _isDestinationExcludedFromFee[account] = true;
        emit ExcludeDestinationFromFee(account);
    }
    
    function includeDestinationInFee(address account) public onlyOwner {
        require(_isDestinationExcludedFromFee[account], "Account is already included");
        _isDestinationExcludedFromFee[account] = false;
        emit IncludeDestinationInFee(account);
    }

    function isAddressBlacklisted(address account) public view returns(bool) {
        return isBlacklisted[account];
    }
    
    function blackList(address account) public onlyOwner {
        require(!isBlacklisted[account], "User already blacklisted");
        isBlacklisted[account] = true;
        emit BlackList(account);
    }
    
    function removeFromBlacklist(address account) public onlyOwner {
        require(isBlacklisted[account], "User is not blacklisted");
        isBlacklisted[account] = false;
        emit RemoveFromBlacklist(account);
    }
    
    function isAddressWhitelistedMerchant(address account) public view returns(bool) {
        return isWhitelistedMerchant[account];
    }
    
    function whitelistMerchant(address account) public onlyOwner {
        require(!isWhitelistedMerchant[account], "Account is already whitelisted");
        isWhitelistedMerchant[account] = true;
        emit WhitelistMerchant(account);
    }
    
    function removeFromWhitelistMerchant(address account) public onlyOwner {
        require(isWhitelistedMerchant[account], "Account is not whitelisted");
        isWhitelistedMerchant[account] = false;
        emit RemoveFromWhitelistMerchant(account);
    }
    
    function setTaxFeePercent(uint256 _taxFee) external onlyOwner {
        require(_taxFee <= 1000, "Input must be below or equal to 10% (1000 = 10%; 10000 = 100%)");
        taxFee = _taxFee;
        emit SetTaxFeePercent(_taxFee);
    }
    
    function setPaymentFeePercent(uint256 _percent) external onlyOwner {
        require(_percent <= 1000, "Input must be below or equal to 10% (1000 = 10%; 10000 = 100%)");
        paymentFee = _percent;
        emit SetPaymentFeePercent(_percent);
    }
    
    function setMaxTxAmount(uint256 _maxTxAmount) external onlyOwner {
        require(_maxTxAmount > 0, "Input must be greater than zero");
        maxTxAmount = _maxTxAmount;
        emit SetMaxTxAmount(_maxTxAmount);
    }
    
    function setLiquidityFeePercent(uint256 _liquidityFee) external onlyOwner {
        require(_liquidityFee <= 1000, "Input must be below or equal to 10% (1000 = 10%; 10000 = 100%)");
        liquidityFee = _liquidityFee;
        emit SetLiquidityFeePercent(_liquidityFee);
    }
    
    function setTaxTeamPercent(uint256 _percent) external onlyOwner {
        require(_percent <= 1000, "Input must be below or equal to 10% (1000 = 10%; 10000 = 100%)");
        taxTeamPercent = _percent;
        emit SetTaxTeamPercent(_percent);
    }
    
    function setTaxTreasuryPercent(uint256 _percent) external onlyOwner {
        require(_percent <= 1000, "Input must be below or equal to 10% (1000 = 10%; 10000 = 100%)");
        taxTreasuryPercent = _percent;
        emit SetTaxTreasuryPercent(_percent);
    }
    
    function setTaxLPPercent(uint256 _percent) external onlyOwner {
        require(_percent <= 1000, "Input must be below or equal to 10% (1000 = 10%; 10000 = 100%)");
        taxLPPercent = _percent;
        emit SetTaxLPPercent(_percent);
    }
    
    function setNumTokensSellToAddToLiquidity(uint256 _minimumTokensBeforeSwap) external onlyOwner() {
        minimumTokensBeforeSwap = _minimumTokensBeforeSwap;
        emit SetNumTokensSellToAddToLiquidity(_minimumTokensBeforeSwap);
    }
    
    function setTeamAddress(address _teamAddress) external onlyOwner {
        require(_teamAddress != address(0), "Address should not be the zero address");
        teamAddress = payable(_teamAddress);
        emit SetTeamAddress(_teamAddress);
    }

    function setTreasuryAddress(address _treasuryAddress) external onlyOwner {
        require(_treasuryAddress != address(0), "Address should not be the zero address");
        treasuryAddress = payable(_treasuryAddress);
        emit SetTreasuryAddress(_treasuryAddress);
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }
    
    function transferToAddressETH(address payable recipient, uint256 amount) private {
        recipient.transfer(amount);
    }
    
    function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) public view returns (uint256 amountB) {
        return uniswapV2Router.quote(amountA, reserveA, reserveB);
    }

    function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) public view returns (uint256 amountOut) {
        return uniswapV2Router.getAmountOut(amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) public view returns (uint256 amountIn) {
        return uniswapV2Router.getAmountIn(amountOut, reserveIn, reserveOut);
    }

    function getAmountsOut(uint256 amountIn, address[] calldata path) public view returns (uint256[] memory amounts) {
        return uniswapV2Router.getAmountsOut(amountIn, path);
    }

    function getAmountsIn(uint256 amountOut, address[] calldata path) public view returns (uint256[] memory amounts) {
        return uniswapV2Router.getAmountsIn(amountOut, path);
    }

    //to receive ETH from uniswapV2Router when swaping
    receive() external payable {}

    fallback() external payable {}
}

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC1363 is IERC20, IERC165 {
    function transferAndCall(address to, uint256 value) external returns (bool);
    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);
    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);
    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);
    function approveAndCall(address spender, uint256 value) external returns (bool);
    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
    function transferOtherTokenAndCall(address tokenIn, address to, uint256 value, uint256 minValue) external returns (bool);
    function transferOtherTokenAndCall(address tokenIn, address to, uint256 value, uint256 minValue, bytes memory data) external returns (bool);
}

interface IERC1363Receiver {
    function onTransferReceived(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4); // solhint-disable-line  max-line-length
}

interface IERC1363Spender {
    function onApprovalReceived(address owner, uint256 value, bytes calldata data) external returns (bytes4);
}

library ERC165Checker {
    // As per the EIP-165 spec, no interface should ever match 0xffffffff
    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;

    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    function supportsERC165(address account) internal view returns (bool) {
        // Any contract that implements ERC165 must explicitly indicate support of
        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid
        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&
            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);
    }

    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {
        // query support of both ERC165 as per the spec and support of _interfaceId
        return supportsERC165(account) &&
            _supportsERC165Interface(account, interfaceId);
    }

    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {
        // query support of ERC165 itself
        if (!supportsERC165(account)) {
            return false;
        }

        // query support of each interface in _interfaceIds
        for (uint256 i = 0; i < interfaceIds.length; i++) {
            if (!_supportsERC165Interface(account, interfaceIds[i])) {
                return false;
            }
        }

        // all interfaces supported
        return true;
    }

    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {
        // success determines whether the staticcall succeeded and result determines
        // whether the contract at account indicates support of _interfaceId
        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);

        return (success && result);
    }

    function _callERC165SupportsInterface(address account, bytes4 interfaceId)
        private
        view
        returns (bool, bool)
    {
        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);
        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);
        if (result.length < 32) return (false, false);
        return (success, abi.decode(result, (bool)));
    }
}

contract ERC165 is IERC165 {
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

contract ERC1363 is ReentrancyGuard, ERC20, IERC1363, ERC165 {
    using SafeMath for uint256;

    event TransferAndCall(address to, uint256 value, uint256 valueAfterFee, bytes data);
    event TransferFromAndCall(address from, address to, uint256 value, uint256 valueAfterFee, bytes data);
    event ApproveAndCall(address spender, uint256 value, bytes data);
    event TransferOtherTokenAndCall(address tokenIn, address to, uint256 value, uint256 valueAfterFee, uint256 minValue, bytes data);

    using Address for address;

    bytes4 internal constant _INTERFACE_ID_ERC1363_TRANSFER = 0x4bbee2df;

    bytes4 internal constant _INTERFACE_ID_ERC1363_APPROVE = 0xfb9ec8ce;

    bytes4 private constant _ERC1363_RECEIVED = 0x88a7ca5c;

    bytes4 private constant _ERC1363_APPROVED = 0x7b04a2d0;

    constructor (string memory name, string memory symbol, address routerAddress) ERC20(name, symbol, routerAddress) {
        // register the supported interfaces to conform to ERC1363 via ERC165
        _registerInterface(_INTERFACE_ID_ERC1363_TRANSFER);
        _registerInterface(_INTERFACE_ID_ERC1363_APPROVE);
    }

    // ERC1363 transferAndCall
    function transferAndCall(address to, uint256 value) public override returns (bool) {
        return transferAndCall(to, value, "");
    }

    // ERC1363 transferAndCall
    function transferAndCall(address to, uint256 value, bytes memory data) public override returns (bool) {
        require(!isBlacklisted[to], "Address is backlisted");
        require(isWhitelistedMerchant[to], "Merchant is not whitelisted");  

        // in percentage, 100% = 10000; 1% = 100; 0.1% = 10
        uint256 txPaymentFee = value / 10000 * paymentFee;
        uint256 valueAfterFee = value - txPaymentFee;

        transfer(to, valueAfterFee);
        require(_checkAndCallTransfer(_msgSender(), to, valueAfterFee, data), "ERC1363: _checkAndCallTransfer reverts");

        if (paymentFee > 0) {
            transfer(teamAddress, txPaymentFee);
        }

        emit TransferAndCall(to, value, valueAfterFee, data);
        return true;
    }

    // ERC1363 transferFromAndCall
    function transferFromAndCall(address from, address to, uint256 value) public override returns (bool) {
        return transferFromAndCall(from, to, value, "");
    }

    // ERC1363 transferFromAndCall
    function transferFromAndCall(address from, address to, uint256 value, bytes memory data) public override returns (bool) {
        require(!isBlacklisted[from], "Address is backlisted");
        require(!isBlacklisted[to], "Address is backlisted");
        require(isWhitelistedMerchant[to], "Merchant is not whitelisted");

        // in percentage, 100% = 10000; 1% = 100; 0.1% = 10
        uint256 txPaymentFee = value / 10000 * paymentFee;
        uint256 valueAfterFee = value - txPaymentFee;

        transferFrom(from, to, valueAfterFee);
        require(_checkAndCallTransfer(from, to, valueAfterFee, data), "ERC1363: _checkAndCallTransfer reverts");
        
        if (paymentFee > 0) {
            transfer(teamAddress, txPaymentFee);
        }

        emit TransferFromAndCall(from, to, value, valueAfterFee, data);
        return true;
    }

    // ERC1363 approveAndCall
    function approveAndCall(address spender, uint256 value) public override returns (bool) {
        return approveAndCall(spender, value, "");
    }

    // ERC1363 approveAndCall
    function approveAndCall(address spender, uint256 value, bytes memory data) public override returns (bool) {
        require(!isBlacklisted[spender], "Address is backlisted");
        require(isWhitelistedMerchant[spender], "Merchant is not whitelisted");

        approve(spender, value);
        require(_checkAndCallApprove(spender, value, data), "ERC1363: _checkAndCallApprove reverts");
        emit ApproveAndCall(spender, value, data);
        return true;
    }

    function transferOtherTokenAndCall(address tokenIn, address to, uint256 value, uint256 minValue) public override returns (bool) {
        return transferOtherTokenAndCall(tokenIn, to, value, minValue, "");
    }

    function transferOtherTokenAndCall(address tokenIn, address to, uint256 value, uint256 minValue, bytes memory data) public override returns (bool) {
        require(!isBlacklisted[to], "Address is backlisted");
        require(isWhitelistedMerchant[to], "Merchant is not whitelisted");

        IERC20(tokenIn).transferFrom(msg.sender, address(this), value);

        IERC20(tokenIn).approve(address(uniswapV2Router), value);

        address[] memory path = new address[](3);
        path[0] = tokenIn;
        path[1] = uniswapV2Router.WETH(); //WETH
        path[2] = address(this);
        
        // if taking payment fee, swaps resulted amount to sender and distribute from sender address accordingly;
        // if not taking payment fee, swaps resulted amount to merchant address directly
        address targetAddress = to;
        if (paymentFee > 0) {
            targetAddress = msg.sender;
        }

        uint256 initialBalance = balanceOf(targetAddress);
        
        uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            value,
            minValue,
            path,
            targetAddress,
            block.timestamp + 120
            );

        uint256 amountReceived = balanceOf(targetAddress) - initialBalance;
        
        // in percentage, 100% = 10000; 1% = 100; 0.1% = 10
        uint256 txPaymentFee = amountReceived / 10000 * paymentFee;
        uint256 valueAfterFee = amountReceived - txPaymentFee;

        if (paymentFee > 0) {
            // transfer to merchant
            transfer(to, valueAfterFee);
            // transfer to team
            transfer(teamAddress, txPaymentFee);
        }

        require(_checkAndCallTransfer(msg.sender, to, valueAfterFee, data), "ERC1363: _checkAndCallTransfer reverts");

        emit TransferOtherTokenAndCall(tokenIn, to, value, valueAfterFee, minValue, data);

        return true;
    }

    function _checkAndCallTransfer(address from, address to, uint256 value, bytes memory data) internal nonReentrant returns (bool) {
        if (!to.isContract()) {
            return false;
        }
        bytes4 retval = IERC1363Receiver(to).onTransferReceived(
            _msgSender(), from, value, data
        );
        return (retval == _ERC1363_RECEIVED);
    }

    function _checkAndCallApprove(address spender, uint256 value, bytes memory data) internal nonReentrant returns (bool) {
        if (!spender.isContract()) {
            return false;
        }
        bytes4 retval = IERC1363Spender(spender).onApprovalReceived(
            _msgSender(), value, data
        );
        return (retval == _ERC1363_APPROVED);
    }
}

contract PayBolt is ERC1363 {
    constructor (address routerAddress)
        ERC1363("PayBolt", "PAY", routerAddress) {
    }

    function paySecurelyWithPaybolt(address to, uint256 value) public returns (bool) {
        return transferAndCall(to, value, "");
    }

    function paySecurelyWithPaybolt(address to, uint256 value, bytes memory data) public returns (bool) {
        return transferAndCall(to, value, data);
    }

    function authorizeSecurelyWithPaybolt(address spender, uint256 value) public returns (bool) {
        return approveAndCall(spender, value, "");
    }

    function authorizeSecurelyWithPaybolt(address spender, uint256 value, bytes memory data) public returns (bool) {
        return approveAndCall(spender, value, data);
    }

    function paySecurelyWithAnyToken(address tokenIn, address to, uint256 value, uint256 minValue) public returns (bool) {
        return transferOtherTokenAndCall(tokenIn, to, value, minValue, "");
    }

    function paySecurelyWithAnyToken(address tokenIn, address to, uint256 value, uint256 minValue, bytes memory data) public returns (bool) {
        return transferOtherTokenAndCall(tokenIn, to, value, minValue, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"routerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"AddLiquidity","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":"ApplyTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"ApproveAndCall","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"BlackList","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeDestinationFromFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeOriginFromFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"IncludeDestinationInFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"IncludeInFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"IncludeInReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"IncludeOriginInFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"RemoveFromBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"RemoveFromWhitelistMerchant","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"RewardLiquidityProviders","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"prevAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"RouterAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_iquidityFee","type":"uint256"}],"name":"SetLiquidityFeePercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxTxAmount","type":"uint256"}],"name":"SetMaxTxAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minimumTokensBeforeSwap","type":"uint256"}],"name":"SetNumTokensSellToAddToLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"percent","type":"uint256"}],"name":"SetPaymentFeePercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"taxFee","type":"uint256"}],"name":"SetTaxFeePercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"percent","type":"uint256"}],"name":"SetTaxLPPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"percent","type":"uint256"}],"name":"SetTaxTeamPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"percent","type":"uint256"}],"name":"SetTaxTreasuryPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"teamAddress","type":"address"}],"name":"SetTeamAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasuryAddress","type":"address"}],"name":"SetTreasuryAddress","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":"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"valueAfterFee","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"TransferAndCall","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"valueAfterFee","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"TransferFromAndCall","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"valueAfterFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minValue","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"TransferOtherTokenAndCall","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistMerchant","type":"event"},{"stateMutability":"payable","type":"fallback"},{"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":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approveAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"approveAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"authorizeSecurelyWithPaybolt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"authorizeSecurelyWithPaybolt","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":[{"internalType":"address","name":"account","type":"address"}],"name":"blackList","outputs":[],"stateMutability":"nonpayable","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":"address","name":"account","type":"address"}],"name":"excludeDestinationFromFee","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":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeOriginFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeDestinationInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeOriginInFee","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":"isAddressBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAddressWhitelistedMerchant","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isDestinationExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOriginExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"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":"minimumTokensBeforeSwap","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":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"minValue","type":"uint256"}],"name":"paySecurelyWithAnyToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"minValue","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"paySecurelyWithAnyToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"paySecurelyWithPaybolt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"paySecurelyWithPaybolt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paymentFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeFromWhitelistMerchant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"setLiquidityFeePercent","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":"uint256","name":"_percent","type":"uint256"}],"name":"setPaymentFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"routerAddress","type":"address"}],"name":"setRouterAddress","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":"uint256","name":"_percent","type":"uint256"}],"name":"setTaxLPPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percent","type":"uint256"}],"name":"setTaxTeamPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percent","type":"uint256"}],"name":"setTaxTreasuryPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_teamAddress","type":"address"}],"name":"setTeamAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddress","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLPPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxTeamPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxTreasuryPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"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":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferAndCall","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferFromAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFromAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"minValue","type":"uint256"}],"name":"transferOtherTokenAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"minValue","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferOtherTokenAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"whitelistMerchant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600280546001600160a01b0319908116737ccb537e8a041977a9b32cda7ff987ea0920fdaf179091556003805490911673307942ea000c44f32a7f97a8b4f8ab12f1bc98e61790556010805460ff191660129081179091556200006990600a6200072f565b6200007a906402540be40062000747565b60118190556200008d9060001962000769565b6200009b906000196200078c565b601255600060145561012c6015819055601655610190601755606460185560c86019556102bc601a819055601b55601054620000dc9060ff16600a6200072f565b620000ec906305f5e10062000747565b601c55601054620001029060ff16600a6200072f565b6200011190621e848062000747565b601d556000601e556020805460ff60a81b1916600160a81b1790553480156200013957600080fd5b5060405162005838380380620058388339810160408190526200015c91620007a6565b6040518060400160405280600781526020016614185e509bdb1d60ca1b8152506040518060400160405280600381526020016250415960e81b8152508282828260016000819055506000620001b6620004ec60201b60201c565b600180546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35082516200021990600e90602086019062000574565b5081516200022f90600f90602085019062000574565b506012543360009081526004602081815260409283902093909355815163c45a015560e01b8152915184936001600160a01b0385169363c45a01559381810193918290030181865afa1580156200028a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b09190620007a6565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003249190620007a6565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000372573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003989190620007a6565b602080546001600160a01b03199081166001600160a01b0393841617909155601f8054909116918316919091179055600160096000620003e06001546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260099093528183208054851660019081179091556002548216845282842080548616821790556003549091168352912080549092168117909155601e55620004563390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6011546040516200049e91815260200190565b60405180910390a350620004be92506301ffc9a760e01b915050620004f0565b620004d0634bbee2df60e01b620004f0565b620004e2637dcf646760e11b620004f0565b505050506200080e565b3390565b6001600160e01b031980821614156200054f5760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015260640160405180910390fd5b6001600160e01b0319166000908152602160205260409020805460ff19166001179055565b8280546200058290620007d1565b90600052602060002090601f016020900481019282620005a65760008555620005f1565b82601f10620005c157805160ff1916838001178555620005f1565b82800160010185558215620005f1579182015b82811115620005f1578251825591602001919060010190620005d4565b50620005ff92915062000603565b5090565b5b80821115620005ff576000815560010162000604565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620006715781600019048211156200065557620006556200061a565b808516156200066357918102915b93841c939080029062000635565b509250929050565b6000826200068a5750600162000729565b81620006995750600062000729565b8160018114620006b25760028114620006bd57620006dd565b600191505062000729565b60ff841115620006d157620006d16200061a565b50506001821b62000729565b5060208310610133831016604e8410600b841016171562000702575081810a62000729565b6200070e838362000630565b80600019048211156200072557620007256200061a565b0290505b92915050565b60006200074060ff84168362000679565b9392505050565b60008160001904831182151516156200076457620007646200061a565b500290565b6000826200078757634e487b7160e01b600052601260045260246000fd5b500690565b600082821015620007a157620007a16200061a565b500390565b600060208284031215620007b957600080fd5b81516001600160a01b03811681146200074057600080fd5b600181811c90821680620007e657607f821691505b602082108114156200080857634e487b7160e01b600052602260045260246000fd5b50919050565b61501a806200081e6000396000f3fe6080604052600436106104515760003560e01c80636674398e1161023d578063a9059cbb11610138578063d2d7ad83116100bb578063dd62ed3e11610082578063dd62ed3e14610dcf578063e5807ef014610e15578063ea2f0b3714610e35578063ec28438a14610e55578063f0f165af14610e75578063f2fde38b14610e9557005b8063d2d7ad8314610d20578063d4d9e63214610d36578063d80ad97a14610d56578063d8fbe99414610d76578063dc6e552314610d9657005b8063c49b9a80116100ff578063c49b9a8014610c80578063c5f956af14610ca0578063c8cbc22014610cc0578063cae9ca5114610ce0578063d06ca61f14610d0057005b8063a9059cbb14610be0578063ad615dec14610c00578063b6d5675314610c20578063bca4c6ef14610c40578063c1d34b8914610c6057005b80638c0b5e22116101c057806395d89b411161018757806395d89b4114610b5f57806398118cb414610b74578063a071dcf414610b8a578063a1ee1cac14610ba0578063a457c2d714610bc057005b80638c0b5e2214610a995780638da5cb5b14610aaf5780638ee88c5314610acd57806390683e8c14610aed5780639171a8d314610b2657005b806370a082311161020457806370a08231146109f5578063715018a614610a155780638188f71c14610a2a57806385f8c25914610a4057806388f8202014610a6057005b80636674398e146109505780636690864e146109705780636697a3f9146109905780636b8d853b146109c95780636ef06a08146109df57005b80633177029f1161034d57806349bd5a5e116102d0578063537df3b611610297578063537df3b6146108ba578063562589d1146108da5780635724c03a146108fa5780635cb73ee8146109105780636605bfda1461093057005b806349bd5a5e146108005780634a74bb02146108205780634d39225b1461084157806352390c02146108615780635342acb41461088157005b80634000aea0116103145780634000aea01461076057806341cb87fc14610780578063437823ec146107a05780634549b039146107c05780634838d165146107e057005b80633177029f146105ae5780633685d41914610700578063380b654f14610688578063395093511461072057806339a865911461074057005b80631694505e116103d55780632a1128bb1161039c5780632a1128bb146106885780632b27d57c146105795780632cbc7a62146106a85780632d838119146106be578063313ce567146106de57005b80631694505e146105ce57806318160ddd146106065780631c75f0851461061b5780631f00ca741461063b57806323b872dd1461066857005b806306fdde031161041957806306fdde0314610537578063095ea7b3146105595780631296ee621461057957806313114a9d1461059957806314af9a7b146105ae57005b8062b3779e1461045a57806301ffc9a71461048f578063054d50d4146104c9578063061c82d0146104f757806306410ceb1461051757005b3661045857005b005b34801561046657600080fd5b5061047a610475366004614530565b610eb5565b60405190151581526020015b60405180910390f35b34801561049b57600080fd5b5061047a6104aa36600461459f565b6001600160e01b03191660009081526021602052604090205460ff1690565b3480156104d557600080fd5b506104e96104e43660046145bc565b610eca565b604051908152602001610486565b34801561050357600080fd5b506104586105123660046145e8565b610f47565b34801561052357600080fd5b506104586105323660046145e8565b610fd8565b34801561054357600080fd5b5061054c611059565b604051610486919061464e565b34801561056557600080fd5b5061047a610574366004614661565b6110eb565b34801561058557600080fd5b5061047a610594366004614661565b611102565b3480156105a557600080fd5b506013546104e9565b3480156105ba57600080fd5b5061047a6105c9366004614661565b611125565b3480156105da57600080fd5b50601f546105ee906001600160a01b031681565b6040516001600160a01b039091168152602001610486565b34801561061257600080fd5b506011546104e9565b34801561062757600080fd5b506002546105ee906001600160a01b031681565b34801561064757600080fd5b5061065b61065636600461468d565b611141565b604051610486919061470c565b34801561067457600080fd5b5061047a610683366004614750565b6111bb565b34801561069457600080fd5b5061047a6106a3366004614791565b611224565b3480156106b457600080fd5b506104e960185481565b3480156106ca57600080fd5b506104e96106d93660046145e8565b61124b565b3480156106ea57600080fd5b5060105460405160ff9091168152602001610486565b34801561070c57600080fd5b5061045861071b3660046147d7565b6112c8565b34801561072c57600080fd5b5061047a61073b366004614661565b611486565b34801561074c57600080fd5b5061045861075b3660046147d7565b6114bd565b34801561076c57600080fd5b5061047a61077b366004614530565b6115a0565b34801561078c57600080fd5b5061045861079b3660046147d7565b6116d9565b3480156107ac57600080fd5b506104586107bb3660046147d7565b611930565b3480156107cc57600080fd5b506104e96107db366004614802565b6119e7565b3480156107ec57600080fd5b506104586107fb3660046147d7565b611a74565b34801561080c57600080fd5b506020546105ee906001600160a01b031681565b34801561082c57600080fd5b5060205461047a90600160a81b900460ff1681565b34801561084d57600080fd5b5061047a61085c366004614832565b611b5b565b34801561086d57600080fd5b5061045861087c3660046147d7565b611b74565b34801561088d57600080fd5b5061047a61089c3660046147d7565b6001600160a01b031660009081526009602052604090205460ff1690565b3480156108c657600080fd5b506104586108d53660046147d7565b611cc7565b3480156108e657600080fd5b506104586108f53660046145e8565b611daa565b34801561090657600080fd5b506104e960195481565b34801561091c57600080fd5b5061045861092b3660046147d7565b611e2b565b34801561093c57600080fd5b5061045861094b3660046147d7565b611ee2565b34801561095c57600080fd5b5061045861096b3660046147d7565b611f80565b34801561097c57600080fd5b5061045861098b3660046147d7565b612033565b34801561099c57600080fd5b5061047a6109ab3660046147d7565b6001600160a01b03166000908152600b602052604090205460ff1690565b3480156109d557600080fd5b506104e960175481565b3480156109eb57600080fd5b506104e960145481565b348015610a0157600080fd5b506104e9610a103660046147d7565b6120d1565b348015610a2157600080fd5b50610458612130565b348015610a3657600080fd5b506104e9601e5481565b348015610a4c57600080fd5b506104e9610a5b3660046145bc565b6121a4565b348015610a6c57600080fd5b5061047a610a7b3660046147d7565b6001600160a01b03166000908152600c602052604090205460ff1690565b348015610aa557600080fd5b506104e9601c5481565b348015610abb57600080fd5b506001546001600160a01b03166105ee565b348015610ad957600080fd5b50610458610ae83660046145e8565b6121e4565b348015610af957600080fd5b5061047a610b083660046147d7565b6001600160a01b031660009081526007602052604090205460ff1690565b348015610b3257600080fd5b5061047a610b413660046147d7565b6001600160a01b03166000908152600a602052604090205460ff1690565b348015610b6b57600080fd5b5061054c612265565b348015610b8057600080fd5b506104e9601a5481565b348015610b9657600080fd5b506104e960155481565b348015610bac57600080fd5b50610458610bbb3660046147d7565b612274565b348015610bcc57600080fd5b5061047a610bdb366004614661565b61232b565b348015610bec57600080fd5b5061047a610bfb366004614661565b61237a565b348015610c0c57600080fd5b506104e9610c1b3660046145bc565b612387565b348015610c2c57600080fd5b5061047a610c3b366004614832565b6123c7565b348015610c4c57600080fd5b5061047a610c5b366004614530565b6127b4565b348015610c6c57600080fd5b5061047a610c7b3660046148a8565b6127c1565b348015610c8c57600080fd5b50610458610c9b366004614914565b612937565b348015610cac57600080fd5b506003546105ee906001600160a01b031681565b348015610ccc57600080fd5b50610458610cdb3660046147d7565b6129ab565b348015610cec57600080fd5b5061047a610cfb366004614530565b612a92565b348015610d0c57600080fd5b5061065b610d1b36600461468d565b612bb8565b348015610d2c57600080fd5b506104e9601d5481565b348015610d4257600080fd5b50610458610d513660046147d7565b612bed565b348015610d6257600080fd5b50610458610d713660046145e8565b612ca0565b348015610d8257600080fd5b5061047a610d91366004614750565b612d21565b348015610da257600080fd5b5061047a610db13660046147d7565b6001600160a01b031660009081526008602052604090205460ff1690565b348015610ddb57600080fd5b506104e9610dea366004614931565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b348015610e2157600080fd5b50610458610e303660046145e8565b612d3e565b348015610e4157600080fd5b50610458610e503660046147d7565b612dbf565b348015610e6157600080fd5b50610458610e703660046145e8565b612e72565b348015610e8157600080fd5b50610458610e903660046145e8565b612f21565b348015610ea157600080fd5b50610458610eb03660046147d7565b612f80565b6000610ec2848484612a92565b949350505050565b601f54604051630153543560e21b81526004810185905260248101849052604481018390526000916001600160a01b03169063054d50d4906064015b602060405180830381865afa158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec2919061495f565b6001546001600160a01b03163314610f7a5760405162461bcd60e51b8152600401610f7190614978565b60405180910390fd5b6103e8811115610f9c5760405162461bcd60e51b8152600401610f71906149ad565b60158190556040518181527f19da908cae03512cf29c19a5842b2904a06fd24ef9982759c78f9379831ed70f906020015b60405180910390a150565b6001546001600160a01b031633146110025760405162461bcd60e51b8152600401610f7190614978565b6103e88111156110245760405162461bcd60e51b8152600401610f71906149ad565b60198190556040518181527f7d5722d9fd8cecd31661b869d373efda77b50f4f57b64c16230d0699bcbdf00290602001610fcd565b6060600e805461106890614a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461109490614a0a565b80156110e15780601f106110b6576101008083540402835291602001916110e1565b820191906000526020600020905b8154815290600101906020018083116110c457829003601f168201915b5050505050905090565b60006110f833848461306b565b5060015b92915050565b600061111e8383604051806020016040528060008152506115a0565b9392505050565b600061111e838360405180602001604052806000815250612a92565b601f546040516307c0329d60e21b81526060916001600160a01b031690631f00ca749061117690879087908790600401614a45565b600060405180830381865afa158015611193573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ec29190810190614a9d565b60006111c884848461318f565b61121a843361121585604051806060016040528060288152602001614f98602891396001600160a01b038a16600090815260066020908152604080832033845290915290205491906134c9565b61306b565b5060019392505050565b600061124285858585604051806020016040528060008152506123c7565b95945050505050565b60006012548211156112b25760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610f71565b60006112bc6134fa565b905061111e8184614b59565b6001546001600160a01b031633146112f25760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b0381166000908152600c602052604090205460ff1661132a5760405162461bcd60e51b8152600401610f7190614b7b565b60005b600d5481101561144c57816001600160a01b0316600d828154811061135457611354614bb2565b6000918252602090912001546001600160a01b0316141561143a57600d805461137f90600190614bc8565b8154811061138f5761138f614bb2565b600091825260209091200154600d80546001600160a01b0390921691839081106113bb576113bb614bb2565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600582526040808220829055600c90925220805460ff19169055600d80548061141357611413614bdf565b600082815260209020810160001990810180546001600160a01b031916905501905561144c565b8061144481614bf5565b91505061132d565b506040516001600160a01b03821681527fb31990b399410eeea874c2c81063feb4b5e55f66f46004a8306f10a81f031d3f90602001610fcd565b3360008181526006602090815260408083206001600160a01b038716845290915281205490916110f8918590611215908690614c10565b6001546001600160a01b031633146114e75760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b03811660009081526008602052604090205460ff1661154f5760405162461bcd60e51b815260206004820152601a60248201527f4163636f756e74206973206e6f742077686974656c69737465640000000000006044820152606401610f71565b6001600160a01b038116600081815260086020908152604091829020805460ff1916905590519182527f881cfb40ba38a725388f282e96a3e5d7b7cf5ed333e8b3d505ac91b9fb9d3d9d9101610fcd565b6001600160a01b03831660009081526007602052604081205460ff16156115d95760405162461bcd60e51b8152600401610f7190614c28565b6001600160a01b03841660009081526008602052604090205460ff166116115760405162461bcd60e51b8152600401610f7190614c57565b60145460009061162361271086614b59565b61162d9190614c8e565b9050600061163b8286614bc8565b9050611647868261237a565b506116543387838761351d565b6116705760405162461bcd60e51b8152600401610f7190614cad565b601454156116905760025461168e906001600160a01b03168361237a565b505b7f1b34d89317ed7b2223ad1611b57e057e1a1d641421326d6df8917be65ce6b72e868683876040516116c59493929190614cf3565b60405180910390a150600195945050505050565b6001546001600160a01b031633146117035760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b03811661176e5760405162461bcd60e51b815260206004820152602c60248201527f726f75746572416464726573732073686f756c64206e6f74206265207468652060448201526b7a65726f206164647265737360a01b6064820152608401610f71565b601f546040805163c45a015560e01b815290516001600160a01b039283169284929083169163c45a0155916004808201926020929091908290030181865afa1580156117be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e29190614d20565b6001600160a01b031663e6a4390530836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561182f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118539190614d20565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa15801561189e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c29190614d20565b602080546001600160a01b03199081166001600160a01b03938416178255601f8054909116848416179055604080518584168152928616918301919091527f1b40f7040327d783cc3cffdd488e8233012f50d648b53c5218f73ef4a5b71405910160405180910390a1505050565b6001546001600160a01b0316331461195a5760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b03811660009081526009602052604090205460ff16156119935760405162461bcd60e51b8152600401610f7190614d3d565b6001600160a01b038116600081815260096020908152604091829020805460ff1916600117905590519182527f58c3e0504c69d3a92726966f152a771e0f8f6ad4daca1ae9055a38aba1fd2b629101610fcd565b6000601154831115611a3b5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610f71565b81611a5a576000611a4b84613631565b509395506110fc945050505050565b6000611a6584613631565b509295506110fc945050505050565b6001546001600160a01b03163314611a9e5760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b03811660009081526007602052604090205460ff1615611b075760405162461bcd60e51b815260206004820152601860248201527f5573657220616c726561647920626c61636b6c697374656400000000000000006044820152606401610f71565b6001600160a01b038116600081815260076020908152604091829020805460ff1916600117905590519182527fd0b3de211361f8db73acaa24de66426b2e28c2967c806d0f9827890f5b28c5079101610fcd565b6000611b6a86868686866123c7565b9695505050505050565b6001546001600160a01b03163314611b9e5760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b0381166000908152600c602052604090205460ff1615611bd75760405162461bcd60e51b8152600401610f7190614d3d565b6001600160a01b03811660009081526004602052604090205415611c31576001600160a01b038116600090815260046020526040902054611c179061124b565b6001600160a01b0382166000908152600560205260409020555b6001600160a01b0381166000818152600c60209081526040808320805460ff19166001908117909155600d805491820181559093527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb590920180546001600160a01b0319168417905590519182527f6f6f36b62c3e3a776fc3052d503097ffb886d7eb4546e768132fef82747e30b99101610fcd565b6001546001600160a01b03163314611cf15760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b03811660009081526007602052604090205460ff16611d595760405162461bcd60e51b815260206004820152601760248201527f55736572206973206e6f7420626c61636b6c69737465640000000000000000006044820152606401610f71565b6001600160a01b038116600081815260076020908152604091829020805460ff1916905590519182527f3afada3900b4909463d8a846fbdc12d6b5c4e8030bd6bc1215822ecee62357ba9101610fcd565b6001546001600160a01b03163314611dd45760405162461bcd60e51b8152600401610f7190614978565b6103e8811115611df65760405162461bcd60e51b8152600401610f71906149ad565b60178190556040518181527f4be3796d8415e5e6709723a6299845941db8000f2ed16c6127da794d4ccd99b590602001610fcd565b6001546001600160a01b03163314611e555760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b0381166000908152600b602052604090205460ff1615611e8e5760405162461bcd60e51b8152600401610f7190614d3d565b6001600160a01b0381166000818152600b6020908152604091829020805460ff1916600117905590519182527f01e2244d3069fd48f59a6d2cb03663eaade69e0a097109881ad7bbb68bd8b94d9101610fcd565b6001546001600160a01b03163314611f0c5760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b038116611f325760405162461bcd60e51b8152600401610f7190614d74565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527feee016301a2725a577c64816adf35ccf644d07439731069a31748ec3b9102c6090602001610fcd565b6001546001600160a01b03163314611faa5760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b0381166000908152600a602052604090205460ff16611fe25760405162461bcd60e51b8152600401610f7190614b7b565b6001600160a01b0381166000818152600a6020908152604091829020805460ff1916905590519182527f4695a578cec0272f55b55c1f4d1ae4bb86060d8a9159b8edd72866e5017916d99101610fcd565b6001546001600160a01b0316331461205d5760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b0381166120835760405162461bcd60e51b8152600401610f7190614d74565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f6f7172587e2ee3573d0b3f6c2690ecc9a891b65835a094530cab8fe127725bd490602001610fcd565b6001600160a01b0381166000908152600c602052604081205460ff161561210e57506001600160a01b031660009081526005602052604090205490565b6001600160a01b0382166000908152600460205260409020546110fc9061124b565b6001546001600160a01b0316331461215a5760405162461bcd60e51b8152600401610f7190614978565b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b601f546040516385f8c25960e01b81526004810185905260248101849052604481018390526000916001600160a01b0316906385f8c25990606401610f06565b6001546001600160a01b0316331461220e5760405162461bcd60e51b8152600401610f7190614978565b6103e88111156122305760405162461bcd60e51b8152600401610f71906149ad565b601a8190556040518181527fa080f06a1e9c2a432b1d35cf0a54ebca051cf5dce7433c3d8e94948436f1035690602001610fcd565b6060600f805461106890614a0a565b6001546001600160a01b0316331461229e5760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b0381166000908152600a602052604090205460ff16156122d75760405162461bcd60e51b8152600401610f7190614d3d565b6001600160a01b0381166000818152600a6020908152604091829020805460ff1916600117905590519182527f88e6db4636ed1cb2631f32fe90a6faaf6b77d106fa96c8d829479a4ceedd30af9101610fcd565b60006110f8338461121585604051806060016040528060258152602001614fc0602591393360009081526006602090815260408083206001600160a01b038d16845290915290205491906134c9565b60006110f833848461318f565b601f54604051632b58577b60e21b81526004810185905260248101849052604481018390526000916001600160a01b03169063ad615dec90606401610f06565b6001600160a01b03841660009081526007602052604081205460ff16156124005760405162461bcd60e51b8152600401610f7190614c28565b6001600160a01b03851660009081526008602052604090205460ff166124385760405162461bcd60e51b8152600401610f7190614c57565b6040516323b872dd60e01b8152336004820152306024820152604481018590526001600160a01b038716906323b872dd906064016020604051808303816000875af115801561248b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124af9190614dba565b50601f5460405163095ea7b360e01b81526001600160a01b039182166004820152602481018690529087169063095ea7b3906044016020604051808303816000875af1158015612503573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125279190614dba565b506040805160038082526080820190925260009160208201606080368337019050509050868160008151811061255f5761255f614bb2565b6001600160a01b03928316602091820292909201810191909152601f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156125b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125dc9190614d20565b816001815181106125ef576125ef614bb2565b60200260200101906001600160a01b031690816001600160a01b031681525050308160028151811061262357612623614bb2565b6001600160a01b03909216602092830291909101909101526014548690156126485750335b6000612653826120d1565b601f549091506001600160a01b0316635c11d79588888686612676426078614c10565b6040518663ffffffff1660e01b8152600401612696959493929190614e1b565b600060405180830381600087803b1580156126b057600080fd5b505af11580156126c4573d6000803e3d6000fd5b505050506000816126d4846120d1565b6126de9190614bc8565b90506000601454612710836126f39190614b59565b6126fd9190614c8e565b9050600061270b8284614bc8565b60145490915015612739576127208b8261237a565b50600254612737906001600160a01b03168361237a565b505b612745338c838b61351d565b6127615760405162461bcd60e51b8152600401610f7190614cad565b7f366debf09271f1e757c6bff568eb3622aab5787fd7df4df4d54447f4666bcb108c8c8c848d8d60405161279a96959493929190614e57565b60405180910390a15060019b9a5050505050505050505050565b6000610ec28484846115a0565b6001600160a01b03841660009081526007602052604081205460ff16156127fa5760405162461bcd60e51b8152600401610f7190614c28565b6001600160a01b03841660009081526007602052604090205460ff16156128335760405162461bcd60e51b8152600401610f7190614c28565b6001600160a01b03841660009081526008602052604090205460ff1661286b5760405162461bcd60e51b8152600401610f7190614c57565b60145460009061287d61271086614b59565b6128879190614c8e565b905060006128958286614bc8565b90506128a28787836111bb565b506128af8787838761351d565b6128cb5760405162461bcd60e51b8152600401610f7190614cad565b601454156128eb576002546128e9906001600160a01b03168361237a565b505b7fd1bb90261fa7f083a17518895fb0bde552e3a404e6193d579a68ea8c1a76335d8787878488604051612922959493929190614e94565b60405180910390a15060019695505050505050565b6001546001600160a01b031633146129615760405162461bcd60e51b8152600401610f7190614978565b6020805460ff60a81b1916600160a81b8315159081029190911782556040519081527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599101610fcd565b6001546001600160a01b031633146129d55760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b03811660009081526008602052604090205460ff1615612a3e5760405162461bcd60e51b815260206004820152601e60248201527f4163636f756e7420697320616c72656164792077686974656c697374656400006044820152606401610f71565b6001600160a01b038116600081815260086020908152604091829020805460ff1916600117905590519182527f814dd8ab580cb6f6b902041ffff5707f064088f7baeb546c60d9202f400a2ff39101610fcd565b6001600160a01b03831660009081526007602052604081205460ff1615612acb5760405162461bcd60e51b8152600401610f7190614c28565b6001600160a01b03841660009081526008602052604090205460ff16612b035760405162461bcd60e51b8152600401610f7190614c57565b612b0d84846110eb565b50612b19848484613680565b612b735760405162461bcd60e51b815260206004820152602560248201527f455243313336333a205f636865636b416e6443616c6c417070726f7665207265604482015264766572747360d81b6064820152608401610f71565b7f4df88a0bc463d1105f5b5e7b0a2e83433ef2058a59573056c6d85ad20f69fc2b848484604051612ba693929190614ed9565b60405180910390a15060019392505050565b601f5460405163d06ca61f60e01b81526060916001600160a01b03169063d06ca61f9061117690879087908790600401614a45565b6001546001600160a01b03163314612c175760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b0381166000908152600b602052604090205460ff16612c4f5760405162461bcd60e51b8152600401610f7190614b7b565b6001600160a01b0381166000818152600b6020908152604091829020805460ff1916905590519182527f883b38f4b2a1fda1a77696b846e38106414c27d0936b775c1678c95b4cc51cd39101610fcd565b6001546001600160a01b03163314612cca5760405162461bcd60e51b8152600401610f7190614978565b6103e8811115612cec5760405162461bcd60e51b8152600401610f71906149ad565b60188190556040518181527ff7f7bb1c97ae49492c2565fa33ba96ada08855cb3bc6cb4ffa97d858d866a25290602001610fcd565b6000610ec2848484604051806020016040528060008152506127c1565b6001546001600160a01b03163314612d685760405162461bcd60e51b8152600401610f7190614978565b6103e8811115612d8a5760405162461bcd60e51b8152600401610f71906149ad565b60148190556040518181527fed4b300ee5c9ccbcfd18aa0d5222020cdf15a714f926d2cd802b5d77161c7e8290602001610fcd565b6001546001600160a01b03163314612de95760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b03811660009081526009602052604090205460ff16612e215760405162461bcd60e51b8152600401610f7190614b7b565b6001600160a01b038116600081815260096020908152604091829020805460ff1916905590519182527f4f6a6b6efe34ec6478021aa9fb7f6980e78ea3a10c74074a8ce49d5d3ebf1f7e9101610fcd565b6001546001600160a01b03163314612e9c5760405162461bcd60e51b8152600401610f7190614978565b60008111612eec5760405162461bcd60e51b815260206004820152601f60248201527f496e707574206d7573742062652067726561746572207468616e207a65726f006044820152606401610f71565b601c8190556040518181527f4a02caf9e7317d663463d3d976767ba90289279dd55c0a46f962536efc87a9a690602001610fcd565b6001546001600160a01b03163314612f4b5760405162461bcd60e51b8152600401610f7190614978565b601d8190556040518181527faf03e08ee79afbf1342640444643fbc5871a6b7623742379afd8a14401aa7d6f90602001610fcd565b6001546001600160a01b03163314612faa5760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b03811661300f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f71565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166130cd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f71565b6001600160a01b03821661312e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f71565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166131f35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f71565b6001600160a01b0382166132555760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610f71565b6001600160a01b03831660009081526007602052604090205460ff161561328e5760405162461bcd60e51b8152600401610f7190614c28565b6001600160a01b03821660009081526007602052604090205460ff16156132c75760405162461bcd60e51b8152600401610f7190614c28565b600081116133295760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610f71565b6001546001600160a01b0384811691161480159061335557506001546001600160a01b03838116911614155b156133bd57601c548111156133bd5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610f71565b60006133c8306120d1565b601d5460205491925082101590600160a01b900460ff161580156133f55750602054600160a81b900460ff165b801561340e57506020546001600160a01b038581169116145b1561342457801561342457613424601d54613791565b6001600160a01b03851660009081526009602052604090205460019060ff168061346657506001600160a01b03851660009081526009602052604090205460ff165b8061348957506001600160a01b0386166000908152600a602052604090205460ff165b806134ac57506001600160a01b0385166000908152600b602052604090205460ff165b156134b5575060005b6134c186868684613900565b505050505050565b600081848411156134ed5760405162461bcd60e51b8152600401610f71919061464e565b5060006112428486614bc8565b6000806000613507613a2b565b90925090506135168183614b59565b9250505090565b6000600260005414156135725760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610f71565b60026000556135896001600160a01b038516613bae565b61359557506000613624565b604051632229f29760e21b81526000906001600160a01b038616906388a7ca5c906135ca9033908a9089908990600401614f00565b6020604051808303816000875af11580156135e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061360d9190614f33565b6001600160e01b031916632229f29760e21b149150505b6001600055949350505050565b60008060008060008060008060006136488a613be7565b92509250925060008060006136668d86866136616134fa565b613c2a565b919f909e50909c50959a5093985091965092945050505050565b6000600260005414156136d55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610f71565b60026000556136ec6001600160a01b038516613bae565b6136f857506000613785565b6040516307b04a2d60e41b81526000906001600160a01b03861690637b04a2d09061372b90339088908890600401614ed9565b6020604051808303816000875af115801561374a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061376e9190614f33565b6001600160e01b0319166307b04a2d60e41b149150505b60016000559392505050565b6020805460ff60a01b1916600160a01b1790556019546000906137b690600290614b59565b90506000816018546017546137cb9190614c10565b6137d59190614c10565b9050600081601a54856137e89190614b59565b6137f29190614c8e565b905047613800308084613c81565b600061380c8247614bc8565b90506000601754858361381f9190614b59565b6138299190614c8e565b90506000601854868461383c9190614b59565b6138469190614c8e565b60025490915061385f906001600160a01b031683613e76565b600354613875906001600160a01b031682613e76565b6000613881868a614bc8565b90506000826138908587614bc8565b61389a9190614bc8565b90506138a68282613eb1565b60408051888152602081018790529081018390527f50f37a077a4d0df0a065b07674caf6566818fb0edfb2b4e21f1279d9fb1873d79060600160405180910390a150506020805460ff60a01b191690555050505050505050565b8061390d5761390d613fbf565b6001600160a01b0384166000908152600c602052604090205460ff16801561394e57506001600160a01b0383166000908152600c602052604090205460ff16155b156139635761395e848484613fed565b613a0f565b6001600160a01b0384166000908152600c602052604090205460ff161580156139a457506001600160a01b0383166000908152600c602052604090205460ff165b156139b45761395e848484614130565b6001600160a01b0384166000908152600c602052604090205460ff1680156139f457506001600160a01b0383166000908152600c602052604090205460ff165b15613a045761395e848484614207565b613a0f8484846142b9565b80613a2557613a25601654601555601b54601a55565b50505050565b6012546011546000918291825b600d54811015613b7d578260046000600d8481548110613a5a57613a5a614bb2565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180613ac557508160056000600d8481548110613a9e57613a9e614bb2565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15613adb57601254601154945094505050509091565b60046000600d8381548110613af257613af2614bb2565b60009182526020808320909101546001600160a01b03168352820192909252604001902054613b219084614bc8565b925060056000600d8381548110613b3a57613b3a614bb2565b60009182526020808320909101546001600160a01b03168352820192909252604001902054613b699083614bc8565b915080613b7581614bf5565b915050613a38565b50601154601254613b8e9190614b59565b821015613ba5576012546011549350935050509091565b90939092509050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610ec2575050151592915050565b600080600080613bf685614331565b90506000613c038661434e565b9050600081613c128489614bc8565b613c1c9190614bc8565b979296509094509092505050565b6000808080613c398589614c8e565b90506000613c478689614c8e565b90506000613c558789614c8e565b9050600081613c648486614bc8565b613c6e9190614bc8565b939b939a50919850919650505050505050565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110613cb657613cb6614bb2565b6001600160a01b03928316602091820292909201810191909152601f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613d0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d339190614d20565b81600181518110613d4657613d46614bb2565b6001600160a01b039283166020918202929092010152601f5460405163095ea7b360e01b81529082166004820152602481018490529085169063095ea7b3906044016020604051808303816000875af1158015613da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dcb9190614dba565b50601f5460405163791ac94760e01b81526001600160a01b039091169063791ac94790613e05908590600090869089904290600401614e1b565b600060405180830381600087803b158015613e1f57600080fd5b505af1158015613e33573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051613e68929190614f50565b60405180910390a150505050565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015613eac573d6000803e3d6000fd5b505050565b601f54613ec99030906001600160a01b03168461306b565b601f546001600160a01b031663f305d719823085600080613ef26001546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015613f5a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613f7f9190614f69565b505060408051848152602081018490527fcb1652de9aeec38545fc281847b3dbfc89aab56dfa907b1ab68466f602c36fb492500160405180910390a15050565b601554158015613fcf5750601a54155b15613fd657565b60158054601655601a8054601b5560009182905555565b600080600080600080613fff87613631565b6001600160a01b038f16600090815260056020526040812054969c50949a50929850909650945092506140328983614bc8565b6001600160a01b038c1660009081526005602090815260408083208490556004909152902054909150614066908990614bc8565b6001600160a01b03808d1660009081526004602052604080822093909355908c16815290812054906140988983614c10565b6001600160a01b038d16600090815260046020526040902081905590506140c184848484614361565b6140ca856143b1565b6140d4888761443b565b8b6001600160a01b03168d6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8960405161411991815260200190565b60405180910390a350505050505050505050505050565b60008060008060008061414287613631565b6001600160a01b038f16600090815260046020526040812054969c50949a50929850909650945092506141758883614bc8565b6001600160a01b03808d166000908152600460209081526040808320859055928e16825260059052908120549192506141ae8783614c10565b6001600160a01b038d16600090815260056020908152604080832084905560049091529020549091506141e2908a90614c10565b6001600160a01b038d166000908152600460205260409020556140c184848484614361565b60008060008060008061421987613631565b6001600160a01b038f16600090815260056020526040812054969c50949a509298509096509450925061424c8983614bc8565b6001600160a01b038c1660009081526005602090815260408083208490556004909152902054909150614280908990614bc8565b6001600160a01b03808d16600090815260046020908152604080832094909455918d168152600590915290812054906141ae8783614c10565b6000806000806000806142cb87613631565b6001600160a01b038f16600090815260046020526040812054969c50949a50929850909650945092506142fe8883614bc8565b6001600160a01b03808d16600090815260046020526040808220849055918d168152908120549192506140988983614c10565b6000612710601554836143449190614c8e565b6110fc9190614b59565b6000612710601a54836143449190614c8e565b8115801561436f5750600081115b1561438657601e54614382906001614c10565b601e555b600084118015614394575082155b15613a25576001601e546143a89190614bc8565b601e5550505050565b60006143bb6134fa565b905060006143c98284614c8e565b306000908152600460205260409020549091506143e7908290614c10565b30600090815260046020908152604080832093909355600c9052205460ff1615613eac5730600090815260056020526040902054614426908490614c10565b30600090815260056020526040902055505050565b816012546144499190614bc8565b60125560135461445a908290614c10565b6013555050565b6001600160a01b038116811461447657600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156144b8576144b8614479565b604052919050565b600082601f8301126144d157600080fd5b813567ffffffffffffffff8111156144eb576144eb614479565b6144fe601f8201601f191660200161448f565b81815284602083860101111561451357600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561454557600080fd5b833561455081614461565b925060208401359150604084013567ffffffffffffffff81111561457357600080fd5b61457f868287016144c0565b9150509250925092565b6001600160e01b03198116811461447657600080fd5b6000602082840312156145b157600080fd5b813561111e81614589565b6000806000606084860312156145d157600080fd5b505081359360208301359350604090920135919050565b6000602082840312156145fa57600080fd5b5035919050565b6000815180845260005b818110156146275760208185018101518683018201520161460b565b81811115614639576000602083870101525b50601f01601f19169290920160200192915050565b60208152600061111e6020830184614601565b6000806040838503121561467457600080fd5b823561467f81614461565b946020939093013593505050565b6000806000604084860312156146a257600080fd5b83359250602084013567ffffffffffffffff808211156146c157600080fd5b818601915086601f8301126146d557600080fd5b8135818111156146e457600080fd5b8760208260051b85010111156146f957600080fd5b6020830194508093505050509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561474457835183529284019291840191600101614728565b50909695505050505050565b60008060006060848603121561476557600080fd5b833561477081614461565b9250602084013561478081614461565b929592945050506040919091013590565b600080600080608085870312156147a757600080fd5b84356147b281614461565b935060208501356147c281614461565b93969395505050506040820135916060013590565b6000602082840312156147e957600080fd5b813561111e81614461565b801515811461447657600080fd5b6000806040838503121561481557600080fd5b823591506020830135614827816147f4565b809150509250929050565b600080600080600060a0868803121561484a57600080fd5b853561485581614461565b9450602086013561486581614461565b93506040860135925060608601359150608086013567ffffffffffffffff81111561488f57600080fd5b61489b888289016144c0565b9150509295509295909350565b600080600080608085870312156148be57600080fd5b84356148c981614461565b935060208501356148d981614461565b925060408501359150606085013567ffffffffffffffff8111156148fc57600080fd5b614908878288016144c0565b91505092959194509250565b60006020828403121561492657600080fd5b813561111e816147f4565b6000806040838503121561494457600080fd5b823561494f81614461565b9150602083013561482781614461565b60006020828403121561497157600080fd5b5051919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252603e908201527f496e707574206d7573742062652062656c6f77206f7220657175616c20746f2060408201527f313025202831303030203d203130253b203130303030203d2031303025290000606082015260800190565b600181811c90821680614a1e57607f821691505b60208210811415614a3f57634e487b7160e01b600052602260045260246000fd5b50919050565b83815260406020808301829052908201839052600090849060608401835b86811015614a91578335614a7681614461565b6001600160a01b031682529282019290820190600101614a63565b50979650505050505050565b60006020808385031215614ab057600080fd5b825167ffffffffffffffff80821115614ac857600080fd5b818501915085601f830112614adc57600080fd5b815181811115614aee57614aee614479565b8060051b9150614aff84830161448f565b8181529183018401918481019088841115614b1957600080fd5b938501935b83851015614b3757845182529385019390850190614b1e565b98975050505050505050565b634e487b7160e01b600052601160045260246000fd5b600082614b7657634e487b7160e01b600052601260045260246000fd5b500490565b6020808252601b908201527f4163636f756e7420697320616c726561647920696e636c756465640000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600082821015614bda57614bda614b43565b500390565b634e487b7160e01b600052603160045260246000fd5b6000600019821415614c0957614c09614b43565b5060010190565b60008219821115614c2357614c23614b43565b500190565b6020808252601590820152741059191c995cdcc81a5cc8189858dadb1a5cdd1959605a1b604082015260600190565b6020808252601b908201527f4d65726368616e74206973206e6f742077686974656c69737465640000000000604082015260600190565b6000816000190483118215151615614ca857614ca8614b43565b500290565b60208082526026908201527f455243313336333a205f636865636b416e6443616c6c5472616e73666572207260408201526565766572747360d01b606082015260800190565b60018060a01b0385168152836020820152826040820152608060608201526000611b6a6080830184614601565b600060208284031215614d3257600080fd5b815161111e81614461565b6020808252601b908201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604082015260600190565b60208082526026908201527f416464726573732073686f756c64206e6f7420626520746865207a65726f206160408201526564647265737360d01b606082015260800190565b600060208284031215614dcc57600080fd5b815161111e816147f4565b600081518084526020808501945080840160005b83811015614e105781516001600160a01b031687529582019590820190600101614deb565b509495945050505050565b85815284602082015260a060408201526000614e3a60a0830186614dd7565b6001600160a01b0394909416606083015250608001529392505050565b600060018060a01b03808916835280881660208401525085604083015284606083015283608083015260c060a0830152614b3760c0830184614601565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090614ece90830184614601565b979650505050505050565b60018060a01b03841681528260208201526060604082015260006112426060830184614601565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611b6a90830184614601565b600060208284031215614f4557600080fd5b815161111e81614589565b828152604060208201526000610ec26040830184614dd7565b600080600060608486031215614f7e57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212201d284e868cac314db1f6a5125014ade22cffdaecdad43d2904a840b2557777ad64736f6c634300080b0033000000000000000000000000a5e0829caced8ffdd4de3c43696c57f7d7a678ff

Deployed Bytecode

0x6080604052600436106104515760003560e01c80636674398e1161023d578063a9059cbb11610138578063d2d7ad83116100bb578063dd62ed3e11610082578063dd62ed3e14610dcf578063e5807ef014610e15578063ea2f0b3714610e35578063ec28438a14610e55578063f0f165af14610e75578063f2fde38b14610e9557005b8063d2d7ad8314610d20578063d4d9e63214610d36578063d80ad97a14610d56578063d8fbe99414610d76578063dc6e552314610d9657005b8063c49b9a80116100ff578063c49b9a8014610c80578063c5f956af14610ca0578063c8cbc22014610cc0578063cae9ca5114610ce0578063d06ca61f14610d0057005b8063a9059cbb14610be0578063ad615dec14610c00578063b6d5675314610c20578063bca4c6ef14610c40578063c1d34b8914610c6057005b80638c0b5e22116101c057806395d89b411161018757806395d89b4114610b5f57806398118cb414610b74578063a071dcf414610b8a578063a1ee1cac14610ba0578063a457c2d714610bc057005b80638c0b5e2214610a995780638da5cb5b14610aaf5780638ee88c5314610acd57806390683e8c14610aed5780639171a8d314610b2657005b806370a082311161020457806370a08231146109f5578063715018a614610a155780638188f71c14610a2a57806385f8c25914610a4057806388f8202014610a6057005b80636674398e146109505780636690864e146109705780636697a3f9146109905780636b8d853b146109c95780636ef06a08146109df57005b80633177029f1161034d57806349bd5a5e116102d0578063537df3b611610297578063537df3b6146108ba578063562589d1146108da5780635724c03a146108fa5780635cb73ee8146109105780636605bfda1461093057005b806349bd5a5e146108005780634a74bb02146108205780634d39225b1461084157806352390c02146108615780635342acb41461088157005b80634000aea0116103145780634000aea01461076057806341cb87fc14610780578063437823ec146107a05780634549b039146107c05780634838d165146107e057005b80633177029f146105ae5780633685d41914610700578063380b654f14610688578063395093511461072057806339a865911461074057005b80631694505e116103d55780632a1128bb1161039c5780632a1128bb146106885780632b27d57c146105795780632cbc7a62146106a85780632d838119146106be578063313ce567146106de57005b80631694505e146105ce57806318160ddd146106065780631c75f0851461061b5780631f00ca741461063b57806323b872dd1461066857005b806306fdde031161041957806306fdde0314610537578063095ea7b3146105595780631296ee621461057957806313114a9d1461059957806314af9a7b146105ae57005b8062b3779e1461045a57806301ffc9a71461048f578063054d50d4146104c9578063061c82d0146104f757806306410ceb1461051757005b3661045857005b005b34801561046657600080fd5b5061047a610475366004614530565b610eb5565b60405190151581526020015b60405180910390f35b34801561049b57600080fd5b5061047a6104aa36600461459f565b6001600160e01b03191660009081526021602052604090205460ff1690565b3480156104d557600080fd5b506104e96104e43660046145bc565b610eca565b604051908152602001610486565b34801561050357600080fd5b506104586105123660046145e8565b610f47565b34801561052357600080fd5b506104586105323660046145e8565b610fd8565b34801561054357600080fd5b5061054c611059565b604051610486919061464e565b34801561056557600080fd5b5061047a610574366004614661565b6110eb565b34801561058557600080fd5b5061047a610594366004614661565b611102565b3480156105a557600080fd5b506013546104e9565b3480156105ba57600080fd5b5061047a6105c9366004614661565b611125565b3480156105da57600080fd5b50601f546105ee906001600160a01b031681565b6040516001600160a01b039091168152602001610486565b34801561061257600080fd5b506011546104e9565b34801561062757600080fd5b506002546105ee906001600160a01b031681565b34801561064757600080fd5b5061065b61065636600461468d565b611141565b604051610486919061470c565b34801561067457600080fd5b5061047a610683366004614750565b6111bb565b34801561069457600080fd5b5061047a6106a3366004614791565b611224565b3480156106b457600080fd5b506104e960185481565b3480156106ca57600080fd5b506104e96106d93660046145e8565b61124b565b3480156106ea57600080fd5b5060105460405160ff9091168152602001610486565b34801561070c57600080fd5b5061045861071b3660046147d7565b6112c8565b34801561072c57600080fd5b5061047a61073b366004614661565b611486565b34801561074c57600080fd5b5061045861075b3660046147d7565b6114bd565b34801561076c57600080fd5b5061047a61077b366004614530565b6115a0565b34801561078c57600080fd5b5061045861079b3660046147d7565b6116d9565b3480156107ac57600080fd5b506104586107bb3660046147d7565b611930565b3480156107cc57600080fd5b506104e96107db366004614802565b6119e7565b3480156107ec57600080fd5b506104586107fb3660046147d7565b611a74565b34801561080c57600080fd5b506020546105ee906001600160a01b031681565b34801561082c57600080fd5b5060205461047a90600160a81b900460ff1681565b34801561084d57600080fd5b5061047a61085c366004614832565b611b5b565b34801561086d57600080fd5b5061045861087c3660046147d7565b611b74565b34801561088d57600080fd5b5061047a61089c3660046147d7565b6001600160a01b031660009081526009602052604090205460ff1690565b3480156108c657600080fd5b506104586108d53660046147d7565b611cc7565b3480156108e657600080fd5b506104586108f53660046145e8565b611daa565b34801561090657600080fd5b506104e960195481565b34801561091c57600080fd5b5061045861092b3660046147d7565b611e2b565b34801561093c57600080fd5b5061045861094b3660046147d7565b611ee2565b34801561095c57600080fd5b5061045861096b3660046147d7565b611f80565b34801561097c57600080fd5b5061045861098b3660046147d7565b612033565b34801561099c57600080fd5b5061047a6109ab3660046147d7565b6001600160a01b03166000908152600b602052604090205460ff1690565b3480156109d557600080fd5b506104e960175481565b3480156109eb57600080fd5b506104e960145481565b348015610a0157600080fd5b506104e9610a103660046147d7565b6120d1565b348015610a2157600080fd5b50610458612130565b348015610a3657600080fd5b506104e9601e5481565b348015610a4c57600080fd5b506104e9610a5b3660046145bc565b6121a4565b348015610a6c57600080fd5b5061047a610a7b3660046147d7565b6001600160a01b03166000908152600c602052604090205460ff1690565b348015610aa557600080fd5b506104e9601c5481565b348015610abb57600080fd5b506001546001600160a01b03166105ee565b348015610ad957600080fd5b50610458610ae83660046145e8565b6121e4565b348015610af957600080fd5b5061047a610b083660046147d7565b6001600160a01b031660009081526007602052604090205460ff1690565b348015610b3257600080fd5b5061047a610b413660046147d7565b6001600160a01b03166000908152600a602052604090205460ff1690565b348015610b6b57600080fd5b5061054c612265565b348015610b8057600080fd5b506104e9601a5481565b348015610b9657600080fd5b506104e960155481565b348015610bac57600080fd5b50610458610bbb3660046147d7565b612274565b348015610bcc57600080fd5b5061047a610bdb366004614661565b61232b565b348015610bec57600080fd5b5061047a610bfb366004614661565b61237a565b348015610c0c57600080fd5b506104e9610c1b3660046145bc565b612387565b348015610c2c57600080fd5b5061047a610c3b366004614832565b6123c7565b348015610c4c57600080fd5b5061047a610c5b366004614530565b6127b4565b348015610c6c57600080fd5b5061047a610c7b3660046148a8565b6127c1565b348015610c8c57600080fd5b50610458610c9b366004614914565b612937565b348015610cac57600080fd5b506003546105ee906001600160a01b031681565b348015610ccc57600080fd5b50610458610cdb3660046147d7565b6129ab565b348015610cec57600080fd5b5061047a610cfb366004614530565b612a92565b348015610d0c57600080fd5b5061065b610d1b36600461468d565b612bb8565b348015610d2c57600080fd5b506104e9601d5481565b348015610d4257600080fd5b50610458610d513660046147d7565b612bed565b348015610d6257600080fd5b50610458610d713660046145e8565b612ca0565b348015610d8257600080fd5b5061047a610d91366004614750565b612d21565b348015610da257600080fd5b5061047a610db13660046147d7565b6001600160a01b031660009081526008602052604090205460ff1690565b348015610ddb57600080fd5b506104e9610dea366004614931565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b348015610e2157600080fd5b50610458610e303660046145e8565b612d3e565b348015610e4157600080fd5b50610458610e503660046147d7565b612dbf565b348015610e6157600080fd5b50610458610e703660046145e8565b612e72565b348015610e8157600080fd5b50610458610e903660046145e8565b612f21565b348015610ea157600080fd5b50610458610eb03660046147d7565b612f80565b6000610ec2848484612a92565b949350505050565b601f54604051630153543560e21b81526004810185905260248101849052604481018390526000916001600160a01b03169063054d50d4906064015b602060405180830381865afa158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec2919061495f565b6001546001600160a01b03163314610f7a5760405162461bcd60e51b8152600401610f7190614978565b60405180910390fd5b6103e8811115610f9c5760405162461bcd60e51b8152600401610f71906149ad565b60158190556040518181527f19da908cae03512cf29c19a5842b2904a06fd24ef9982759c78f9379831ed70f906020015b60405180910390a150565b6001546001600160a01b031633146110025760405162461bcd60e51b8152600401610f7190614978565b6103e88111156110245760405162461bcd60e51b8152600401610f71906149ad565b60198190556040518181527f7d5722d9fd8cecd31661b869d373efda77b50f4f57b64c16230d0699bcbdf00290602001610fcd565b6060600e805461106890614a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461109490614a0a565b80156110e15780601f106110b6576101008083540402835291602001916110e1565b820191906000526020600020905b8154815290600101906020018083116110c457829003601f168201915b5050505050905090565b60006110f833848461306b565b5060015b92915050565b600061111e8383604051806020016040528060008152506115a0565b9392505050565b600061111e838360405180602001604052806000815250612a92565b601f546040516307c0329d60e21b81526060916001600160a01b031690631f00ca749061117690879087908790600401614a45565b600060405180830381865afa158015611193573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ec29190810190614a9d565b60006111c884848461318f565b61121a843361121585604051806060016040528060288152602001614f98602891396001600160a01b038a16600090815260066020908152604080832033845290915290205491906134c9565b61306b565b5060019392505050565b600061124285858585604051806020016040528060008152506123c7565b95945050505050565b60006012548211156112b25760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610f71565b60006112bc6134fa565b905061111e8184614b59565b6001546001600160a01b031633146112f25760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b0381166000908152600c602052604090205460ff1661132a5760405162461bcd60e51b8152600401610f7190614b7b565b60005b600d5481101561144c57816001600160a01b0316600d828154811061135457611354614bb2565b6000918252602090912001546001600160a01b0316141561143a57600d805461137f90600190614bc8565b8154811061138f5761138f614bb2565b600091825260209091200154600d80546001600160a01b0390921691839081106113bb576113bb614bb2565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600582526040808220829055600c90925220805460ff19169055600d80548061141357611413614bdf565b600082815260209020810160001990810180546001600160a01b031916905501905561144c565b8061144481614bf5565b91505061132d565b506040516001600160a01b03821681527fb31990b399410eeea874c2c81063feb4b5e55f66f46004a8306f10a81f031d3f90602001610fcd565b3360008181526006602090815260408083206001600160a01b038716845290915281205490916110f8918590611215908690614c10565b6001546001600160a01b031633146114e75760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b03811660009081526008602052604090205460ff1661154f5760405162461bcd60e51b815260206004820152601a60248201527f4163636f756e74206973206e6f742077686974656c69737465640000000000006044820152606401610f71565b6001600160a01b038116600081815260086020908152604091829020805460ff1916905590519182527f881cfb40ba38a725388f282e96a3e5d7b7cf5ed333e8b3d505ac91b9fb9d3d9d9101610fcd565b6001600160a01b03831660009081526007602052604081205460ff16156115d95760405162461bcd60e51b8152600401610f7190614c28565b6001600160a01b03841660009081526008602052604090205460ff166116115760405162461bcd60e51b8152600401610f7190614c57565b60145460009061162361271086614b59565b61162d9190614c8e565b9050600061163b8286614bc8565b9050611647868261237a565b506116543387838761351d565b6116705760405162461bcd60e51b8152600401610f7190614cad565b601454156116905760025461168e906001600160a01b03168361237a565b505b7f1b34d89317ed7b2223ad1611b57e057e1a1d641421326d6df8917be65ce6b72e868683876040516116c59493929190614cf3565b60405180910390a150600195945050505050565b6001546001600160a01b031633146117035760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b03811661176e5760405162461bcd60e51b815260206004820152602c60248201527f726f75746572416464726573732073686f756c64206e6f74206265207468652060448201526b7a65726f206164647265737360a01b6064820152608401610f71565b601f546040805163c45a015560e01b815290516001600160a01b039283169284929083169163c45a0155916004808201926020929091908290030181865afa1580156117be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e29190614d20565b6001600160a01b031663e6a4390530836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561182f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118539190614d20565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa15801561189e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c29190614d20565b602080546001600160a01b03199081166001600160a01b03938416178255601f8054909116848416179055604080518584168152928616918301919091527f1b40f7040327d783cc3cffdd488e8233012f50d648b53c5218f73ef4a5b71405910160405180910390a1505050565b6001546001600160a01b0316331461195a5760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b03811660009081526009602052604090205460ff16156119935760405162461bcd60e51b8152600401610f7190614d3d565b6001600160a01b038116600081815260096020908152604091829020805460ff1916600117905590519182527f58c3e0504c69d3a92726966f152a771e0f8f6ad4daca1ae9055a38aba1fd2b629101610fcd565b6000601154831115611a3b5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610f71565b81611a5a576000611a4b84613631565b509395506110fc945050505050565b6000611a6584613631565b509295506110fc945050505050565b6001546001600160a01b03163314611a9e5760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b03811660009081526007602052604090205460ff1615611b075760405162461bcd60e51b815260206004820152601860248201527f5573657220616c726561647920626c61636b6c697374656400000000000000006044820152606401610f71565b6001600160a01b038116600081815260076020908152604091829020805460ff1916600117905590519182527fd0b3de211361f8db73acaa24de66426b2e28c2967c806d0f9827890f5b28c5079101610fcd565b6000611b6a86868686866123c7565b9695505050505050565b6001546001600160a01b03163314611b9e5760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b0381166000908152600c602052604090205460ff1615611bd75760405162461bcd60e51b8152600401610f7190614d3d565b6001600160a01b03811660009081526004602052604090205415611c31576001600160a01b038116600090815260046020526040902054611c179061124b565b6001600160a01b0382166000908152600560205260409020555b6001600160a01b0381166000818152600c60209081526040808320805460ff19166001908117909155600d805491820181559093527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb590920180546001600160a01b0319168417905590519182527f6f6f36b62c3e3a776fc3052d503097ffb886d7eb4546e768132fef82747e30b99101610fcd565b6001546001600160a01b03163314611cf15760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b03811660009081526007602052604090205460ff16611d595760405162461bcd60e51b815260206004820152601760248201527f55736572206973206e6f7420626c61636b6c69737465640000000000000000006044820152606401610f71565b6001600160a01b038116600081815260076020908152604091829020805460ff1916905590519182527f3afada3900b4909463d8a846fbdc12d6b5c4e8030bd6bc1215822ecee62357ba9101610fcd565b6001546001600160a01b03163314611dd45760405162461bcd60e51b8152600401610f7190614978565b6103e8811115611df65760405162461bcd60e51b8152600401610f71906149ad565b60178190556040518181527f4be3796d8415e5e6709723a6299845941db8000f2ed16c6127da794d4ccd99b590602001610fcd565b6001546001600160a01b03163314611e555760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b0381166000908152600b602052604090205460ff1615611e8e5760405162461bcd60e51b8152600401610f7190614d3d565b6001600160a01b0381166000818152600b6020908152604091829020805460ff1916600117905590519182527f01e2244d3069fd48f59a6d2cb03663eaade69e0a097109881ad7bbb68bd8b94d9101610fcd565b6001546001600160a01b03163314611f0c5760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b038116611f325760405162461bcd60e51b8152600401610f7190614d74565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527feee016301a2725a577c64816adf35ccf644d07439731069a31748ec3b9102c6090602001610fcd565b6001546001600160a01b03163314611faa5760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b0381166000908152600a602052604090205460ff16611fe25760405162461bcd60e51b8152600401610f7190614b7b565b6001600160a01b0381166000818152600a6020908152604091829020805460ff1916905590519182527f4695a578cec0272f55b55c1f4d1ae4bb86060d8a9159b8edd72866e5017916d99101610fcd565b6001546001600160a01b0316331461205d5760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b0381166120835760405162461bcd60e51b8152600401610f7190614d74565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f6f7172587e2ee3573d0b3f6c2690ecc9a891b65835a094530cab8fe127725bd490602001610fcd565b6001600160a01b0381166000908152600c602052604081205460ff161561210e57506001600160a01b031660009081526005602052604090205490565b6001600160a01b0382166000908152600460205260409020546110fc9061124b565b6001546001600160a01b0316331461215a5760405162461bcd60e51b8152600401610f7190614978565b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b601f546040516385f8c25960e01b81526004810185905260248101849052604481018390526000916001600160a01b0316906385f8c25990606401610f06565b6001546001600160a01b0316331461220e5760405162461bcd60e51b8152600401610f7190614978565b6103e88111156122305760405162461bcd60e51b8152600401610f71906149ad565b601a8190556040518181527fa080f06a1e9c2a432b1d35cf0a54ebca051cf5dce7433c3d8e94948436f1035690602001610fcd565b6060600f805461106890614a0a565b6001546001600160a01b0316331461229e5760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b0381166000908152600a602052604090205460ff16156122d75760405162461bcd60e51b8152600401610f7190614d3d565b6001600160a01b0381166000818152600a6020908152604091829020805460ff1916600117905590519182527f88e6db4636ed1cb2631f32fe90a6faaf6b77d106fa96c8d829479a4ceedd30af9101610fcd565b60006110f8338461121585604051806060016040528060258152602001614fc0602591393360009081526006602090815260408083206001600160a01b038d16845290915290205491906134c9565b60006110f833848461318f565b601f54604051632b58577b60e21b81526004810185905260248101849052604481018390526000916001600160a01b03169063ad615dec90606401610f06565b6001600160a01b03841660009081526007602052604081205460ff16156124005760405162461bcd60e51b8152600401610f7190614c28565b6001600160a01b03851660009081526008602052604090205460ff166124385760405162461bcd60e51b8152600401610f7190614c57565b6040516323b872dd60e01b8152336004820152306024820152604481018590526001600160a01b038716906323b872dd906064016020604051808303816000875af115801561248b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124af9190614dba565b50601f5460405163095ea7b360e01b81526001600160a01b039182166004820152602481018690529087169063095ea7b3906044016020604051808303816000875af1158015612503573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125279190614dba565b506040805160038082526080820190925260009160208201606080368337019050509050868160008151811061255f5761255f614bb2565b6001600160a01b03928316602091820292909201810191909152601f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156125b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125dc9190614d20565b816001815181106125ef576125ef614bb2565b60200260200101906001600160a01b031690816001600160a01b031681525050308160028151811061262357612623614bb2565b6001600160a01b03909216602092830291909101909101526014548690156126485750335b6000612653826120d1565b601f549091506001600160a01b0316635c11d79588888686612676426078614c10565b6040518663ffffffff1660e01b8152600401612696959493929190614e1b565b600060405180830381600087803b1580156126b057600080fd5b505af11580156126c4573d6000803e3d6000fd5b505050506000816126d4846120d1565b6126de9190614bc8565b90506000601454612710836126f39190614b59565b6126fd9190614c8e565b9050600061270b8284614bc8565b60145490915015612739576127208b8261237a565b50600254612737906001600160a01b03168361237a565b505b612745338c838b61351d565b6127615760405162461bcd60e51b8152600401610f7190614cad565b7f366debf09271f1e757c6bff568eb3622aab5787fd7df4df4d54447f4666bcb108c8c8c848d8d60405161279a96959493929190614e57565b60405180910390a15060019b9a5050505050505050505050565b6000610ec28484846115a0565b6001600160a01b03841660009081526007602052604081205460ff16156127fa5760405162461bcd60e51b8152600401610f7190614c28565b6001600160a01b03841660009081526007602052604090205460ff16156128335760405162461bcd60e51b8152600401610f7190614c28565b6001600160a01b03841660009081526008602052604090205460ff1661286b5760405162461bcd60e51b8152600401610f7190614c57565b60145460009061287d61271086614b59565b6128879190614c8e565b905060006128958286614bc8565b90506128a28787836111bb565b506128af8787838761351d565b6128cb5760405162461bcd60e51b8152600401610f7190614cad565b601454156128eb576002546128e9906001600160a01b03168361237a565b505b7fd1bb90261fa7f083a17518895fb0bde552e3a404e6193d579a68ea8c1a76335d8787878488604051612922959493929190614e94565b60405180910390a15060019695505050505050565b6001546001600160a01b031633146129615760405162461bcd60e51b8152600401610f7190614978565b6020805460ff60a81b1916600160a81b8315159081029190911782556040519081527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599101610fcd565b6001546001600160a01b031633146129d55760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b03811660009081526008602052604090205460ff1615612a3e5760405162461bcd60e51b815260206004820152601e60248201527f4163636f756e7420697320616c72656164792077686974656c697374656400006044820152606401610f71565b6001600160a01b038116600081815260086020908152604091829020805460ff1916600117905590519182527f814dd8ab580cb6f6b902041ffff5707f064088f7baeb546c60d9202f400a2ff39101610fcd565b6001600160a01b03831660009081526007602052604081205460ff1615612acb5760405162461bcd60e51b8152600401610f7190614c28565b6001600160a01b03841660009081526008602052604090205460ff16612b035760405162461bcd60e51b8152600401610f7190614c57565b612b0d84846110eb565b50612b19848484613680565b612b735760405162461bcd60e51b815260206004820152602560248201527f455243313336333a205f636865636b416e6443616c6c417070726f7665207265604482015264766572747360d81b6064820152608401610f71565b7f4df88a0bc463d1105f5b5e7b0a2e83433ef2058a59573056c6d85ad20f69fc2b848484604051612ba693929190614ed9565b60405180910390a15060019392505050565b601f5460405163d06ca61f60e01b81526060916001600160a01b03169063d06ca61f9061117690879087908790600401614a45565b6001546001600160a01b03163314612c175760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b0381166000908152600b602052604090205460ff16612c4f5760405162461bcd60e51b8152600401610f7190614b7b565b6001600160a01b0381166000818152600b6020908152604091829020805460ff1916905590519182527f883b38f4b2a1fda1a77696b846e38106414c27d0936b775c1678c95b4cc51cd39101610fcd565b6001546001600160a01b03163314612cca5760405162461bcd60e51b8152600401610f7190614978565b6103e8811115612cec5760405162461bcd60e51b8152600401610f71906149ad565b60188190556040518181527ff7f7bb1c97ae49492c2565fa33ba96ada08855cb3bc6cb4ffa97d858d866a25290602001610fcd565b6000610ec2848484604051806020016040528060008152506127c1565b6001546001600160a01b03163314612d685760405162461bcd60e51b8152600401610f7190614978565b6103e8811115612d8a5760405162461bcd60e51b8152600401610f71906149ad565b60148190556040518181527fed4b300ee5c9ccbcfd18aa0d5222020cdf15a714f926d2cd802b5d77161c7e8290602001610fcd565b6001546001600160a01b03163314612de95760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b03811660009081526009602052604090205460ff16612e215760405162461bcd60e51b8152600401610f7190614b7b565b6001600160a01b038116600081815260096020908152604091829020805460ff1916905590519182527f4f6a6b6efe34ec6478021aa9fb7f6980e78ea3a10c74074a8ce49d5d3ebf1f7e9101610fcd565b6001546001600160a01b03163314612e9c5760405162461bcd60e51b8152600401610f7190614978565b60008111612eec5760405162461bcd60e51b815260206004820152601f60248201527f496e707574206d7573742062652067726561746572207468616e207a65726f006044820152606401610f71565b601c8190556040518181527f4a02caf9e7317d663463d3d976767ba90289279dd55c0a46f962536efc87a9a690602001610fcd565b6001546001600160a01b03163314612f4b5760405162461bcd60e51b8152600401610f7190614978565b601d8190556040518181527faf03e08ee79afbf1342640444643fbc5871a6b7623742379afd8a14401aa7d6f90602001610fcd565b6001546001600160a01b03163314612faa5760405162461bcd60e51b8152600401610f7190614978565b6001600160a01b03811661300f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f71565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166130cd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f71565b6001600160a01b03821661312e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f71565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166131f35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f71565b6001600160a01b0382166132555760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610f71565b6001600160a01b03831660009081526007602052604090205460ff161561328e5760405162461bcd60e51b8152600401610f7190614c28565b6001600160a01b03821660009081526007602052604090205460ff16156132c75760405162461bcd60e51b8152600401610f7190614c28565b600081116133295760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610f71565b6001546001600160a01b0384811691161480159061335557506001546001600160a01b03838116911614155b156133bd57601c548111156133bd5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610f71565b60006133c8306120d1565b601d5460205491925082101590600160a01b900460ff161580156133f55750602054600160a81b900460ff165b801561340e57506020546001600160a01b038581169116145b1561342457801561342457613424601d54613791565b6001600160a01b03851660009081526009602052604090205460019060ff168061346657506001600160a01b03851660009081526009602052604090205460ff165b8061348957506001600160a01b0386166000908152600a602052604090205460ff165b806134ac57506001600160a01b0385166000908152600b602052604090205460ff165b156134b5575060005b6134c186868684613900565b505050505050565b600081848411156134ed5760405162461bcd60e51b8152600401610f71919061464e565b5060006112428486614bc8565b6000806000613507613a2b565b90925090506135168183614b59565b9250505090565b6000600260005414156135725760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610f71565b60026000556135896001600160a01b038516613bae565b61359557506000613624565b604051632229f29760e21b81526000906001600160a01b038616906388a7ca5c906135ca9033908a9089908990600401614f00565b6020604051808303816000875af11580156135e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061360d9190614f33565b6001600160e01b031916632229f29760e21b149150505b6001600055949350505050565b60008060008060008060008060006136488a613be7565b92509250925060008060006136668d86866136616134fa565b613c2a565b919f909e50909c50959a5093985091965092945050505050565b6000600260005414156136d55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610f71565b60026000556136ec6001600160a01b038516613bae565b6136f857506000613785565b6040516307b04a2d60e41b81526000906001600160a01b03861690637b04a2d09061372b90339088908890600401614ed9565b6020604051808303816000875af115801561374a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061376e9190614f33565b6001600160e01b0319166307b04a2d60e41b149150505b60016000559392505050565b6020805460ff60a01b1916600160a01b1790556019546000906137b690600290614b59565b90506000816018546017546137cb9190614c10565b6137d59190614c10565b9050600081601a54856137e89190614b59565b6137f29190614c8e565b905047613800308084613c81565b600061380c8247614bc8565b90506000601754858361381f9190614b59565b6138299190614c8e565b90506000601854868461383c9190614b59565b6138469190614c8e565b60025490915061385f906001600160a01b031683613e76565b600354613875906001600160a01b031682613e76565b6000613881868a614bc8565b90506000826138908587614bc8565b61389a9190614bc8565b90506138a68282613eb1565b60408051888152602081018790529081018390527f50f37a077a4d0df0a065b07674caf6566818fb0edfb2b4e21f1279d9fb1873d79060600160405180910390a150506020805460ff60a01b191690555050505050505050565b8061390d5761390d613fbf565b6001600160a01b0384166000908152600c602052604090205460ff16801561394e57506001600160a01b0383166000908152600c602052604090205460ff16155b156139635761395e848484613fed565b613a0f565b6001600160a01b0384166000908152600c602052604090205460ff161580156139a457506001600160a01b0383166000908152600c602052604090205460ff165b156139b45761395e848484614130565b6001600160a01b0384166000908152600c602052604090205460ff1680156139f457506001600160a01b0383166000908152600c602052604090205460ff165b15613a045761395e848484614207565b613a0f8484846142b9565b80613a2557613a25601654601555601b54601a55565b50505050565b6012546011546000918291825b600d54811015613b7d578260046000600d8481548110613a5a57613a5a614bb2565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180613ac557508160056000600d8481548110613a9e57613a9e614bb2565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15613adb57601254601154945094505050509091565b60046000600d8381548110613af257613af2614bb2565b60009182526020808320909101546001600160a01b03168352820192909252604001902054613b219084614bc8565b925060056000600d8381548110613b3a57613b3a614bb2565b60009182526020808320909101546001600160a01b03168352820192909252604001902054613b699083614bc8565b915080613b7581614bf5565b915050613a38565b50601154601254613b8e9190614b59565b821015613ba5576012546011549350935050509091565b90939092509050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610ec2575050151592915050565b600080600080613bf685614331565b90506000613c038661434e565b9050600081613c128489614bc8565b613c1c9190614bc8565b979296509094509092505050565b6000808080613c398589614c8e565b90506000613c478689614c8e565b90506000613c558789614c8e565b9050600081613c648486614bc8565b613c6e9190614bc8565b939b939a50919850919650505050505050565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110613cb657613cb6614bb2565b6001600160a01b03928316602091820292909201810191909152601f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613d0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d339190614d20565b81600181518110613d4657613d46614bb2565b6001600160a01b039283166020918202929092010152601f5460405163095ea7b360e01b81529082166004820152602481018490529085169063095ea7b3906044016020604051808303816000875af1158015613da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dcb9190614dba565b50601f5460405163791ac94760e01b81526001600160a01b039091169063791ac94790613e05908590600090869089904290600401614e1b565b600060405180830381600087803b158015613e1f57600080fd5b505af1158015613e33573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051613e68929190614f50565b60405180910390a150505050565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015613eac573d6000803e3d6000fd5b505050565b601f54613ec99030906001600160a01b03168461306b565b601f546001600160a01b031663f305d719823085600080613ef26001546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015613f5a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613f7f9190614f69565b505060408051848152602081018490527fcb1652de9aeec38545fc281847b3dbfc89aab56dfa907b1ab68466f602c36fb492500160405180910390a15050565b601554158015613fcf5750601a54155b15613fd657565b60158054601655601a8054601b5560009182905555565b600080600080600080613fff87613631565b6001600160a01b038f16600090815260056020526040812054969c50949a50929850909650945092506140328983614bc8565b6001600160a01b038c1660009081526005602090815260408083208490556004909152902054909150614066908990614bc8565b6001600160a01b03808d1660009081526004602052604080822093909355908c16815290812054906140988983614c10565b6001600160a01b038d16600090815260046020526040902081905590506140c184848484614361565b6140ca856143b1565b6140d4888761443b565b8b6001600160a01b03168d6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8960405161411991815260200190565b60405180910390a350505050505050505050505050565b60008060008060008061414287613631565b6001600160a01b038f16600090815260046020526040812054969c50949a50929850909650945092506141758883614bc8565b6001600160a01b03808d166000908152600460209081526040808320859055928e16825260059052908120549192506141ae8783614c10565b6001600160a01b038d16600090815260056020908152604080832084905560049091529020549091506141e2908a90614c10565b6001600160a01b038d166000908152600460205260409020556140c184848484614361565b60008060008060008061421987613631565b6001600160a01b038f16600090815260056020526040812054969c50949a509298509096509450925061424c8983614bc8565b6001600160a01b038c1660009081526005602090815260408083208490556004909152902054909150614280908990614bc8565b6001600160a01b03808d16600090815260046020908152604080832094909455918d168152600590915290812054906141ae8783614c10565b6000806000806000806142cb87613631565b6001600160a01b038f16600090815260046020526040812054969c50949a50929850909650945092506142fe8883614bc8565b6001600160a01b03808d16600090815260046020526040808220849055918d168152908120549192506140988983614c10565b6000612710601554836143449190614c8e565b6110fc9190614b59565b6000612710601a54836143449190614c8e565b8115801561436f5750600081115b1561438657601e54614382906001614c10565b601e555b600084118015614394575082155b15613a25576001601e546143a89190614bc8565b601e5550505050565b60006143bb6134fa565b905060006143c98284614c8e565b306000908152600460205260409020549091506143e7908290614c10565b30600090815260046020908152604080832093909355600c9052205460ff1615613eac5730600090815260056020526040902054614426908490614c10565b30600090815260056020526040902055505050565b816012546144499190614bc8565b60125560135461445a908290614c10565b6013555050565b6001600160a01b038116811461447657600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156144b8576144b8614479565b604052919050565b600082601f8301126144d157600080fd5b813567ffffffffffffffff8111156144eb576144eb614479565b6144fe601f8201601f191660200161448f565b81815284602083860101111561451357600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561454557600080fd5b833561455081614461565b925060208401359150604084013567ffffffffffffffff81111561457357600080fd5b61457f868287016144c0565b9150509250925092565b6001600160e01b03198116811461447657600080fd5b6000602082840312156145b157600080fd5b813561111e81614589565b6000806000606084860312156145d157600080fd5b505081359360208301359350604090920135919050565b6000602082840312156145fa57600080fd5b5035919050565b6000815180845260005b818110156146275760208185018101518683018201520161460b565b81811115614639576000602083870101525b50601f01601f19169290920160200192915050565b60208152600061111e6020830184614601565b6000806040838503121561467457600080fd5b823561467f81614461565b946020939093013593505050565b6000806000604084860312156146a257600080fd5b83359250602084013567ffffffffffffffff808211156146c157600080fd5b818601915086601f8301126146d557600080fd5b8135818111156146e457600080fd5b8760208260051b85010111156146f957600080fd5b6020830194508093505050509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561474457835183529284019291840191600101614728565b50909695505050505050565b60008060006060848603121561476557600080fd5b833561477081614461565b9250602084013561478081614461565b929592945050506040919091013590565b600080600080608085870312156147a757600080fd5b84356147b281614461565b935060208501356147c281614461565b93969395505050506040820135916060013590565b6000602082840312156147e957600080fd5b813561111e81614461565b801515811461447657600080fd5b6000806040838503121561481557600080fd5b823591506020830135614827816147f4565b809150509250929050565b600080600080600060a0868803121561484a57600080fd5b853561485581614461565b9450602086013561486581614461565b93506040860135925060608601359150608086013567ffffffffffffffff81111561488f57600080fd5b61489b888289016144c0565b9150509295509295909350565b600080600080608085870312156148be57600080fd5b84356148c981614461565b935060208501356148d981614461565b925060408501359150606085013567ffffffffffffffff8111156148fc57600080fd5b614908878288016144c0565b91505092959194509250565b60006020828403121561492657600080fd5b813561111e816147f4565b6000806040838503121561494457600080fd5b823561494f81614461565b9150602083013561482781614461565b60006020828403121561497157600080fd5b5051919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252603e908201527f496e707574206d7573742062652062656c6f77206f7220657175616c20746f2060408201527f313025202831303030203d203130253b203130303030203d2031303025290000606082015260800190565b600181811c90821680614a1e57607f821691505b60208210811415614a3f57634e487b7160e01b600052602260045260246000fd5b50919050565b83815260406020808301829052908201839052600090849060608401835b86811015614a91578335614a7681614461565b6001600160a01b031682529282019290820190600101614a63565b50979650505050505050565b60006020808385031215614ab057600080fd5b825167ffffffffffffffff80821115614ac857600080fd5b818501915085601f830112614adc57600080fd5b815181811115614aee57614aee614479565b8060051b9150614aff84830161448f565b8181529183018401918481019088841115614b1957600080fd5b938501935b83851015614b3757845182529385019390850190614b1e565b98975050505050505050565b634e487b7160e01b600052601160045260246000fd5b600082614b7657634e487b7160e01b600052601260045260246000fd5b500490565b6020808252601b908201527f4163636f756e7420697320616c726561647920696e636c756465640000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600082821015614bda57614bda614b43565b500390565b634e487b7160e01b600052603160045260246000fd5b6000600019821415614c0957614c09614b43565b5060010190565b60008219821115614c2357614c23614b43565b500190565b6020808252601590820152741059191c995cdcc81a5cc8189858dadb1a5cdd1959605a1b604082015260600190565b6020808252601b908201527f4d65726368616e74206973206e6f742077686974656c69737465640000000000604082015260600190565b6000816000190483118215151615614ca857614ca8614b43565b500290565b60208082526026908201527f455243313336333a205f636865636b416e6443616c6c5472616e73666572207260408201526565766572747360d01b606082015260800190565b60018060a01b0385168152836020820152826040820152608060608201526000611b6a6080830184614601565b600060208284031215614d3257600080fd5b815161111e81614461565b6020808252601b908201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604082015260600190565b60208082526026908201527f416464726573732073686f756c64206e6f7420626520746865207a65726f206160408201526564647265737360d01b606082015260800190565b600060208284031215614dcc57600080fd5b815161111e816147f4565b600081518084526020808501945080840160005b83811015614e105781516001600160a01b031687529582019590820190600101614deb565b509495945050505050565b85815284602082015260a060408201526000614e3a60a0830186614dd7565b6001600160a01b0394909416606083015250608001529392505050565b600060018060a01b03808916835280881660208401525085604083015284606083015283608083015260c060a0830152614b3760c0830184614601565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090614ece90830184614601565b979650505050505050565b60018060a01b03841681528260208201526060604082015260006112426060830184614601565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611b6a90830184614601565b600060208284031215614f4557600080fd5b815161111e81614589565b828152604060208201526000610ec26040830184614dd7565b600080600060608486031215614f7e57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212201d284e868cac314db1f6a5125014ade22cffdaecdad43d2904a840b2557777ad64736f6c634300080b0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000a5e0829caced8ffdd4de3c43696c57f7d7a678ff

-----Decoded View---------------
Arg [0] : routerAddress (address): 0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5e0829caced8ffdd4de3c43696c57f7d7a678ff


Deployed Bytecode Sourcemap

54518:1225:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55126:173;;;;;;;;;;-1:-1:-1;55126:173:0;;;;;:::i;:::-;;:::i;:::-;;;1790:14:1;;1783:22;1765:41;;1753:2;1738:18;55126:173:0;;;;;;;;47238:142;;;;;;;;;;-1:-1:-1;47238:142:0;;;;;:::i;:::-;-1:-1:-1;;;;;;47339:33:0;47315:4;47339:33;;;:20;:33;;;;;;;;;47238:142;42171:206;;;;;;;;;;-1:-1:-1;42171:206:0;;;;;:::i;:::-;;:::i;:::-;;;2670:25:1;;;2658:2;2643:18;42171:206:0;2524:177:1;39013:239:0;;;;;;;;;;-1:-1:-1;39013:239:0;;;;;:::i;:::-;;:::i;40603:247::-;;;;;;;;;;-1:-1:-1;40603:247:0;;;;;:::i;:::-;;:::i;19010:83::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;19932:161::-;;;;;;;;;;-1:-1:-1;19932:161:0;;;;;:::i;:::-;;:::i;48779:139::-;;;;;;;;;;-1:-1:-1;48779:139:0;;;;;:::i;:::-;;:::i;20922:87::-;;;;;;;;;;-1:-1:-1;20991:10:0;;20922:87;;54966:152;;;;;;;;;;-1:-1:-1;54966:152:0;;;;;:::i;:::-;;:::i;16410:41::-;;;;;;;;;;-1:-1:-1;16410:41:0;;;;-1:-1:-1;;;;;16410:41:0;;;;;;-1:-1:-1;;;;;4104:32:1;;;4086:51;;4074:2;4059:18;16410:41:0;3913:230:1;19287:95:0;;;;;;;;;;-1:-1:-1;19367:7:0;;19287:95;;14523:88;;;;;;;;;;-1:-1:-1;14523:88:0;;;;-1:-1:-1;;;;;14523:88:0;;;42790:184;;;;;;;;;;-1:-1:-1;42790:184:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;20101:313::-;;;;;;;;;;-1:-1:-1;20101:313:0;;;;;:::i;:::-;;:::i;51567:213::-;;;;;;;;;;-1:-1:-1;51567:213:0;;;;;:::i;:::-;;:::i;16019:39::-;;;;;;;;;;;;;;;;21465:250;;;;;;;;;;-1:-1:-1;21465:250:0;;;;;:::i;:::-;;:::i;19196:83::-;;;;;;;;;;-1:-1:-1;19262:9:0;;19196:83;;19262:9;;;;6830:36:1;;6818:2;6803:18;19196:83:0;6688:184:1;34512:597:0;;;;;;;;;;-1:-1:-1;34512:597:0;;;;;:::i;:::-;;:::i;20422:215::-;;;;;;;;;;-1:-1:-1;20422:215:0;;;;;:::i;:::-;;:::i;38741:260::-;;;;;;;;;;-1:-1:-1;38741:260:0;;;;;:::i;:::-;;:::i;48958:772::-;;;;;;;;;;-1:-1:-1;48958:772:0;;;;;:::i;:::-;;:::i;35117:618::-;;;;;;;;;;-1:-1:-1;35117:618:0;;;;;:::i;:::-;;:::i;35878:229::-;;;;;;;;;;-1:-1:-1;35878:229:0;;;;;:::i;:::-;;:::i;21021:436::-;;;;;;;;;;-1:-1:-1;21021:436:0;;;;;:::i;:::-;;:::i;37881:206::-;;;;;;;;;;-1:-1:-1;37881:206:0;;;;;:::i;:::-;;:::i;16458:28::-;;;;;;;;;;-1:-1:-1;16458:28:0;;;;-1:-1:-1;;;;;16458:28:0;;;16527:40;;;;;;;;;;-1:-1:-1;16527:40:0;;;;-1:-1:-1;;;16527:40:0;;;;;;55517:223;;;;;;;;;;-1:-1:-1;55517:223:0;;;;;:::i;:::-;;:::i;34099:405::-;;;;;;;;;;-1:-1:-1;34099:405:0;;;;;:::i;:::-;;:::i;35743:123::-;;;;;;;;;;-1:-1:-1;35743:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;35831:27:0;35807:4;35831:27;;;:18;:27;;;;;;;;;35743:123;38099:225;;;;;;;;;;-1:-1:-1;38099:225:0;;;;;:::i;:::-;;:::i;40061:253::-;;;;;;;;;;-1:-1:-1;40061:253:0;;;;;:::i;:::-;;:::i;16065:33::-;;;;;;;;;;;;;;;;37186:273;;;;;;;;;;-1:-1:-1;37186:273:0;;;;;:::i;:::-;;:::i;41373:279::-;;;;;;;;;;-1:-1:-1;41373:279:0;;;;;:::i;:::-;;:::i;36768:249::-;;;;;;;;;;-1:-1:-1;36768:249:0;;;;;:::i;:::-;;:::i;41114:251::-;;;;;;;;;;-1:-1:-1;41114:251:0;;;;;:::i;:::-;;:::i;37029:145::-;;;;;;;;;;-1:-1:-1;37029:145:0;;;;;:::i;:::-;-1:-1:-1;;;;;37128:38:0;37104:4;37128:38;;;:29;:38;;;;;;;;;37029:145;15977:35;;;;;;;;;;;;;;;;15722:29;;;;;;;;;;;;;;;;19390:208;;;;;;;;;;-1:-1:-1;19390:208:0;;;;;:::i;:::-;;:::i;5654:148::-;;;;;;;;;;;;;:::i;16375:26::-;;;;;;;;;;;;;;;;42385:205;;;;;;;;;;-1:-1:-1;42385:205:0;;;;;:::i;:::-;;:::i;33961:130::-;;;;;;;;;;-1:-1:-1;33961:130:0;;;;;:::i;:::-;-1:-1:-1;;;;;34053:30:0;34029:4;34053:30;;;:21;:30;;;;;;;;;33961:130;16236:56;;;;;;;;;;;;;;;;5429:79;;;;;;;;;;-1:-1:-1;5494:6:0;;-1:-1:-1;;;;;5494:6:0;5429:79;;39768:281;;;;;;;;;;-1:-1:-1;39768:281:0;;;;;:::i;:::-;;:::i;37748:121::-;;;;;;;;;;-1:-1:-1;37748:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;37839:22:0;37815:4;37839:22;;;:13;:22;;;;;;;;;37748:121;36356:135;;;;;;;;;;-1:-1:-1;36356:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;36450:33:0;36426:4;36450:33;;;:24;:33;;;;;;;;;36356:135;19101:87;;;;;;;;;;;;;:::i;16105:33::-;;;;;;;;;;;;;;;;15836:27;;;;;;;;;;;;;;;;36503:253;;;;;;;;;;-1:-1:-1;36503:253:0;;;;;:::i;:::-;;:::i;20645:269::-;;;;;;;;;;-1:-1:-1;20645:269:0;;;;;:::i;:::-;;:::i;19606:167::-;;;;;;;;;;-1:-1:-1;19606:167:0;;;;;:::i;:::-;;:::i;41981:182::-;;;;;;;;;;-1:-1:-1;41981:182:0;;;;;:::i;:::-;;:::i;51788:1960::-;;;;;;;;;;-1:-1:-1;51788:1960:0;;;;;:::i;:::-;;:::i;54800:158::-;;;;;;;;;;-1:-1:-1;54800:158:0;;;;;:::i;:::-;;:::i;49985:873::-;;;;;;;;;;-1:-1:-1;49985:873:0;;;;;:::i;:::-;;:::i;41660:171::-;;;;;;;;;;-1:-1:-1;41660:171:0;;;;;:::i;:::-;;:::i;14634:92::-;;;;;;;;;;-1:-1:-1;14634:92:0;;;;-1:-1:-1;;;;;14634:92:0;;;38485:244;;;;;;;;;;-1:-1:-1;38485:244:0;;;;;:::i;:::-;;:::i;51083:476::-;;;;;;;;;;-1:-1:-1;51083:476:0;;;;;:::i;:::-;;:::i;42598:184::-;;;;;;;;;;-1:-1:-1;42598:184:0;;;;;:::i;:::-;;:::i;16299:66::-;;;;;;;;;;;;;;;;37471:269;;;;;;;;;;-1:-1:-1;37471:269:0;;;;;:::i;:::-;;:::i;40326:265::-;;;;;;;;;;-1:-1:-1;40326:265:0;;;;;:::i;:::-;;:::i;49774:167::-;;;;;;;;;;-1:-1:-1;49774:167:0;;;;;:::i;:::-;;:::i;38336:137::-;;;;;;;;;;-1:-1:-1;38336:137:0;;;;;:::i;:::-;-1:-1:-1;;;;;38435:30:0;38411:4;38435:30;;;:21;:30;;;;;;;;;38336:137;19781:143;;;;;;;;;;-1:-1:-1;19781:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;19889:18:0;;;19862:7;19889:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19781:143;39264:255;;;;;;;;;;-1:-1:-1;39264:255:0;;;;;:::i;:::-;;:::i;36119:225::-;;;;;;;;;;-1:-1:-1;36119:225:0;;;;;:::i;:::-;;:::i;39531:::-;;;;;;;;;;-1:-1:-1;39531:225:0;;;;;:::i;:::-;;:::i;40862:240::-;;;;;;;;;;-1:-1:-1;40862:240:0;;;;;:::i;:::-;;:::i;5810:244::-;;;;;;;;;;-1:-1:-1;5810:244:0;;;;;:::i;:::-;;:::i;55126:173::-;55231:4;55255:36;55270:7;55279:5;55286:4;55255:14;:36::i;:::-;55248:43;55126:173;-1:-1:-1;;;;55126:173:0:o;42171:206::-;42308:15;;:61;;-1:-1:-1;;;42308:61:0;;;;;10024:25:1;;;10065:18;;;10058:34;;;10108:18;;;10101:34;;;42271:17:0;;-1:-1:-1;;;;;42308:15:0;;:28;;9997:18:1;;42308:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;39013:239::-;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;;;;;;;;;39105:4:::1;39094:7;:15;;39086:90;;;;-1:-1:-1::0;;;39086:90:0::1;;;;;;;:::i;:::-;39187:6;:16:::0;;;39219:25:::1;::::0;2670::1;;;39219::0::1;::::0;2658:2:1;2643:18;39219:25:0::1;;;;;;;;39013:239:::0;:::o;40603:247::-;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;40696:4:::1;40684:8;:16;;40676:91;;;;-1:-1:-1::0;;;40676:91:0::1;;;;;;;:::i;:::-;40778:12;:23:::0;;;40817:25:::1;::::0;2670::1;;;40817::0::1;::::0;2658:2:1;2643:18;40817:25:0::1;2524:177:1::0;19010:83:0;19047:13;19080:5;19073:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19010:83;:::o;19932:161::-;20007:4;20024:39;391:10;20047:7;20056:6;20024:8;:39::i;:::-;-1:-1:-1;20081:4:0;19932:161;;;;;:::o;48779:139::-;48856:4;48880:30;48896:2;48900:5;48880:30;;;;;;;;;;;;:15;:30::i;:::-;48873:37;48779:139;-1:-1:-1;;;48779:139:0:o;54966:152::-;55052:4;55076:34;55091:7;55100:5;55076:34;;;;;;;;;;;;:14;:34::i;42790:184::-;42921:15;;:45;;-1:-1:-1;;;42921:45:0;;42877:24;;-1:-1:-1;;;;;42921:15:0;;:28;;:45;;42950:9;;42961:4;;;;42921:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42921:45:0;;;;;;;;;;;;:::i;20101:313::-;20199:4;20216:36;20226:6;20234:9;20245:6;20216:9;:36::i;:::-;20263:121;20272:6;391:10;20294:89;20332:6;20294:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20294:19:0;;;;;;:11;:19;;;;;;;;391:10;20294:33;;;;;;;;;;:37;:89::i;:::-;20263:8;:121::i;:::-;-1:-1:-1;20402:4:0;20101:313;;;;;:::o;51567:213::-;51689:4;51713:59;51739:7;51748:2;51752:5;51759:8;51713:59;;;;;;;;;;;;:25;:59::i;:::-;51706:66;51567:213;-1:-1:-1;;;;;51567:213:0:o;21465:250::-;21531:7;21570;;21559;:18;;21551:73;;;;-1:-1:-1;;;21551:73:0;;13436:2:1;21551:73:0;;;13418:21:1;13475:2;13455:18;;;13448:30;13514:34;13494:18;;;13487:62;-1:-1:-1;;;13565:18:1;;;13558:40;13615:19;;21551:73:0;13234:406:1;21551:73:0;21635:19;21658:10;:8;:10::i;:::-;21635:33;-1:-1:-1;21686:21:0;21635:33;21686:7;:21;:::i;34512:597::-;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34592:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;34584:70;;;;-1:-1:-1::0;;;34584:70:0::1;;;;;;;:::i;:::-;34670:9;34665:397;34689:19;:26:::0;34685:30;::::1;34665:397;;;34767:7;-1:-1:-1::0;;;;;34741:33:0::1;:19;34761:1;34741:22;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;34741:22:0::1;:33;34737:314;;;34820:19;34840:26:::0;;:30:::1;::::0;34869:1:::1;::::0;34840:30:::1;:::i;:::-;34820:51;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;34795:19:::1;:22:::0;;-1:-1:-1;;;;;34820:51:0;;::::1;::::0;34815:1;;34795:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:76:::0;;-1:-1:-1;;;;;;34795:76:0::1;-1:-1:-1::0;;;;;34795:76:0;;::::1;;::::0;;34890:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;34929:21:::1;:30:::0;;;;:38;;-1:-1:-1;;34929:38:0::1;::::0;;34986:19:::1;:25:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;34986:25:0;;;;;-1:-1:-1;;;;;;34986:25:0::1;::::0;;;;;35030:5:::1;;34737:314;34717:3:::0;::::1;::::0;::::1;:::i;:::-;;;;34665:397;;;-1:-1:-1::0;35077:24:0::1;::::0;-1:-1:-1;;;;;4104:32:1;;4086:51;;35077:24:0::1;::::0;4074:2:1;4059:18;35077:24:0::1;3913:230:1::0;20422:215:0;391:10;20510:4;20559:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;20559:34:0;;;;;;;;;;20510:4;;20527:80;;20550:7;;20559:47;;20596:10;;20559:47;:::i;38741:260::-;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38831:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;38823:69;;;::::0;-1:-1:-1;;;38823:69:0;;15224:2:1;38823:69:0::1;::::0;::::1;15206:21:1::0;15263:2;15243:18;;;15236:30;15302:28;15282:18;;;15275:56;15348:18;;38823:69:0::1;15022:350:1::0;38823:69:0::1;-1:-1:-1::0;;;;;38903:30:0;::::1;38936:5;38903:30:::0;;;:21:::1;:30;::::0;;;;;;;;:38;;-1:-1:-1;;38903:38:0::1;::::0;;38957:36;;4086:51:1;;;38957:36:0::1;::::0;4059:18:1;38957:36:0::1;3913:230:1::0;48958:772:0;-1:-1:-1;;;;;49080:17:0;;49054:4;49080:17;;;:13;:17;;;;;;;;49079:18;49071:52;;;;-1:-1:-1;;;49071:52:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49142:25:0;;;;;;:21;:25;;;;;;;;49134:65;;;;-1:-1:-1;;;49134:65:0;;;;;;;:::i;:::-;49314:10;;49275:20;;49298:13;49306:5;49298;:13;:::i;:::-;:26;;;;:::i;:::-;49275:49;-1:-1:-1;49335:21:0;49359:20;49275:49;49359:5;:20;:::i;:::-;49335:44;;49392:27;49401:2;49405:13;49392:8;:27::i;:::-;-1:-1:-1;49438:60:0;391:10;49474:2;49478:13;49493:4;49438:21;:60::i;:::-;49430:111;;;;-1:-1:-1;;;49430:111:0;;;;;;;:::i;:::-;49558:10;;:14;49554:82;;49598:11;;49589:35;;-1:-1:-1;;;;;49598:11:0;49611:12;49589:8;:35::i;:::-;;49554:82;49653:47;49669:2;49673:5;49680:13;49695:4;49653:47;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;49718:4:0;;48958:772;-1:-1:-1;;;;;48958:772:0:o;35117:618::-;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35218:27:0;::::1;35196:121;;;::::0;-1:-1:-1;;;35196:121:0;;17329:2:1;35196:121:0::1;::::0;::::1;17311:21:1::0;17368:2;17348:18;;;17341:30;17407:34;17387:18;;;17380:62;-1:-1:-1;;;17458:18:1;;;17451:42;17510:19;;35196:121:0::1;17127:408:1::0;35196:121:0::1;35360:15;::::0;35504:26:::1;::::0;;-1:-1:-1;;;35504:26:0;;;;-1:-1:-1;;;;;35360:15:0;;::::1;::::0;35444:13;;35504:24;;::::1;::::0;::::1;::::0;:26:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;:24;:26:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35486:53:0::1;;35562:4;35582:16;-1:-1:-1::0;;;;;35582:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35486:130;::::0;-1:-1:-1;;;;;;35486:130:0::1;::::0;;;;;;-1:-1:-1;;;;;18026:15:1;;;35486:130:0::1;::::0;::::1;18008:34:1::0;18078:15;;18058:18;;;18051:43;17943:18;;35486:130:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35470:13;:146:::0;;-1:-1:-1;;;;;;35470:146:0;;::::1;-1:-1:-1::0;;;;;35470:146:0;;::::1;;::::0;;35629:15:::1;:34:::0;;;;::::1;::::0;;::::1;;::::0;;35679:48:::1;::::0;;18026:15:1;;;18008:34;;18078:15;;;18058:18;;;18051:43;;;;35679:48:0::1;::::0;17943:18:1;35679:48:0::1;;;;;;;35185:550;;35117:618:::0;:::o;35878:229::-;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35956:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;35955:28;35947:68;;;;-1:-1:-1::0;;;35947:68:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36026:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;36026:34:0::1;36056:4;36026:34;::::0;;36076:23;;4086:51:1;;;36076:23:0::1;::::0;4059:18:1;36076:23:0::1;3913:230:1::0;21021:436:0;21111:7;21150;;21139;:18;;21131:62;;;;-1:-1:-1;;;21131:62:0;;18663:2:1;21131:62:0;;;18645:21:1;18702:2;18682:18;;;18675:30;18741:33;18721:18;;;18714:61;18792:18;;21131:62:0;18461:355:1;21131:62:0;21209:17;21204:246;;21244:15;21268:19;21279:7;21268:10;:19::i;:::-;-1:-1:-1;21243:44:0;;-1:-1:-1;21302:14:0;;-1:-1:-1;;;;;21302:14:0;21204:246;21351:23;21382:19;21393:7;21382:10;:19::i;:::-;-1:-1:-1;21349:52:0;;-1:-1:-1;21416:22:0;;-1:-1:-1;;;;;21416:22:0;37881:206;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37954:22:0;::::1;;::::0;;;:13:::1;:22;::::0;;;;;::::1;;37953:23;37945:60;;;::::0;-1:-1:-1;;;37945:60:0;;19023:2:1;37945:60:0::1;::::0;::::1;19005:21:1::0;19062:2;19042:18;;;19035:30;19101:26;19081:18;;;19074:54;19145:18;;37945:60:0::1;18821:348:1::0;37945:60:0::1;-1:-1:-1::0;;;;;38016:22:0;::::1;;::::0;;;:13:::1;:22;::::0;;;;;;;;:29;;-1:-1:-1;;38016:29:0::1;38041:4;38016:29;::::0;;38061:18;;4086:51:1;;;38061:18:0::1;::::0;4059::1;38061::0::1;3913:230:1::0;55517:223:0;55647:4;55671:61;55697:7;55706:2;55710:5;55717:8;55727:4;55671:25;:61::i;:::-;55664:68;55517:223;-1:-1:-1;;;;;;55517:223:0:o;34099:405::-;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34180:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;34179:31;34171:71;;;;-1:-1:-1::0;;;34171:71:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34256:16:0;::::1;34275:1;34256:16:::0;;;:7:::1;:16;::::0;;;;;:20;34253:108:::1;;-1:-1:-1::0;;;;;34332:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;34312:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;34293:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;34253:108:::1;-1:-1:-1::0;;;;;34371:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;;;:37;;-1:-1:-1;;34371:37:0::1;34404:4;34371:37:::0;;::::1;::::0;;;34419:19:::1;:33:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;34419:33:0::1;::::0;::::1;::::0;;34470:26;;4086:51:1;;;34470:26:0::1;::::0;4059:18:1;34470:26:0::1;3913:230:1::0;38099:225:0;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38181:22:0;::::1;;::::0;;;:13:::1;:22;::::0;;;;;::::1;;38173:58;;;::::0;-1:-1:-1;;;38173:58:0;;19376:2:1;38173:58:0::1;::::0;::::1;19358:21:1::0;19415:2;19395:18;;;19388:30;19454:25;19434:18;;;19427:53;19497:18;;38173:58:0::1;19174:347:1::0;38173:58:0::1;-1:-1:-1::0;;;;;38242:22:0;::::1;38267:5;38242:22:::0;;;:13:::1;:22;::::0;;;;;;;;:30;;-1:-1:-1;;38242:30:0::1;::::0;;38288:28;;4086:51:1;;;38288:28:0::1;::::0;4059:18:1;38288:28:0::1;3913:230:1::0;40061:253:0;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;40156:4:::1;40144:8;:16;;40136:91;;;;-1:-1:-1::0;;;40136:91:0::1;;;;;;;:::i;:::-;40238:14;:25:::0;;;40279:27:::1;::::0;2670:25:1;;;40279:27:0::1;::::0;2658:2:1;2643:18;40279:27:0::1;2524:177:1::0;37186:273:0;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37275:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;::::1;;37274:39;37266:79;;;;-1:-1:-1::0;;;37266:79:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37356:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:45;;-1:-1:-1;;37356:45:0::1;37397:4;37356:45;::::0;;37417:34;;4086:51:1;;;37417:34:0::1;::::0;4059:18:1;37417:34:0::1;3913:230:1::0;41373:279:0;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41465:30:0;::::1;41457:81;;;;-1:-1:-1::0;;;41457:81:0::1;;;;;;;:::i;:::-;41549:15;:43:::0;;-1:-1:-1;;;;;;41549:43:0::1;-1:-1:-1::0;;;;;41549:43:0;::::1;::::0;;::::1;::::0;;;41608:36:::1;::::0;4086:51:1;;;41608:36:0::1;::::0;4074:2:1;4059:18;41608:36:0::1;3913:230:1::0;36768:249:0;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36849:33:0;::::1;;::::0;;;:24:::1;:33;::::0;;;;;::::1;;36841:73;;;;-1:-1:-1::0;;;36841:73:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36925:33:0;::::1;36961:5;36925:33:::0;;;:24:::1;:33;::::0;;;;;;;;:41;;-1:-1:-1;;36925:41:0::1;::::0;;36982:27;;4086:51:1;;;36982:27:0::1;::::0;4059:18:1;36982:27:0::1;3913:230:1::0;41114:251:0;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41198:26:0;::::1;41190:77;;;;-1:-1:-1::0;;;41190:77:0::1;;;;;;;:::i;:::-;41278:11;:35:::0;;-1:-1:-1;;;;;;41278:35:0::1;-1:-1:-1::0;;;;;41278:35:0;::::1;::::0;;::::1;::::0;;;41329:28:::1;::::0;4086:51:1;;;41329:28:0::1;::::0;4074:2:1;4059:18;41329:28:0::1;3913:230:1::0;19390:208:0;-1:-1:-1;;;;;19480:30:0;;19456:7;19480:30;;;:21;:30;;;;;;;;19476:59;;;-1:-1:-1;;;;;;19519:16:0;;;;;:7;:16;;;;;;;19390:208::o;19476:59::-;-1:-1:-1;;;;;19573:16:0;;;;;;:7;:16;;;;;;19553:37;;:19;:37::i;5654:148::-;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;5745:6:::1;::::0;5724:40:::1;::::0;5761:1:::1;::::0;-1:-1:-1;;;;;5745:6:0::1;::::0;5724:40:::1;::::0;5761:1;;5724:40:::1;5775:6;:19:::0;;-1:-1:-1;;;;;;5775:19:0::1;::::0;;5654:148::o;42385:205::-;42521:15;;:61;;-1:-1:-1;;;42521:61:0;;;;;10024:25:1;;;10065:18;;;10058:34;;;10108:18;;;10101:34;;;42485:16:0;;-1:-1:-1;;;;;42521:15:0;;:27;;9997:18:1;;42521:61:0;9822:319:1;39768:281:0;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;39878:4:::1;39861:13;:21;;39853:96;;;;-1:-1:-1::0;;;39853:96:0::1;;;;;;;:::i;:::-;39960:12;:28:::0;;;40004:37:::1;::::0;2670:25:1;;;40004:37:0::1;::::0;2658:2:1;2643:18;40004:37:0::1;2524:177:1::0;19101:87:0;19140:13;19173:7;19166:14;;;;;:::i;36503:253::-;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36587:33:0;::::1;;::::0;;;:24:::1;:33;::::0;;;;;::::1;;36586:34;36578:74;;;;-1:-1:-1::0;;;36578:74:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36663:33:0;::::1;;::::0;;;:24:::1;:33;::::0;;;;;;;;:40;;-1:-1:-1;;36663:40:0::1;36699:4;36663:40;::::0;;36719:29;;4086:51:1;;;36719:29:0::1;::::0;4059:18:1;36719:29:0::1;3913:230:1::0;20645:269:0;20738:4;20755:129;391:10;20778:7;20787:96;20826:15;20787:96;;;;;;;;;;;;;;;;;391:10;20787:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;20787:34:0;;;;;;;;;;;;:38;:96::i;19606:167::-;19684:4;19701:42;391:10;19725:9;19736:6;19701:9;:42::i;41981:182::-;42105:15;;:50;;-1:-1:-1;;;42105:50:0;;;;;10024:25:1;;;10065:18;;;10058:34;;;10108:18;;;10101:34;;;42070:15:0;;-1:-1:-1;;;;;42105:15:0;;:21;;9997:18:1;;42105:50:0;9822:319:1;51788:1960:0;-1:-1:-1;;;;;51955:17:0;;51929:4;51955:17;;;:13;:17;;;;;;;;51954:18;51946:52;;;;-1:-1:-1;;;51946:52:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52017:25:0;;;;;;:21;:25;;;;;;;;52009:65;;;;-1:-1:-1;;;52009:65:0;;;;;;;:::i;:::-;52087:62;;-1:-1:-1;;;52087:62:0;;52116:10;52087:62;;;20173:34:1;52136:4:0;20223:18:1;;;20216:43;20275:18;;;20268:34;;;-1:-1:-1;;;;;52087:28:0;;;;;20108:18:1;;52087:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;52194:15:0;;52162:56;;-1:-1:-1;;;52162:56:0;;-1:-1:-1;;;;;52194:15:0;;;52162:56;;;20737:51:1;20804:18;;;20797:34;;;52162:23:0;;;;;;20710:18:1;;52162:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;52255:16:0;;;52269:1;52255:16;;;;;;;;;52231:21;;52255:16;;;;;;;;;;-1:-1:-1;52255:16:0;52231:40;;52292:7;52282:4;52287:1;52282:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52282:17:0;;;:7;;;;;;;;;;:17;;;;52320:15;;:22;;;-1:-1:-1;;;52320:22:0;;;;:15;;;;;:20;;:22;;;;;52282:7;;52320:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52310:4;52315:1;52310:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;52310:32:0;;;-1:-1:-1;;;;;52310:32:0;;;;;52378:4;52360;52365:1;52360:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52360:23:0;;;:7;;;;;;;;;;;:23;52650:10;;52633:2;;52650:14;52646:73;;-1:-1:-1;52697:10:0;52646:73;52731:22;52756:24;52766:13;52756:9;:24::i;:::-;52801:15;;52731:49;;-1:-1:-1;;;;;;52801:15:0;:69;52885:5;52905:8;52928:4;52947:13;52975:21;:15;52993:3;52975:21;:::i;:::-;52801:210;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53024:22;53076:14;53049:24;53059:13;53049:9;:24::i;:::-;:41;;;;:::i;:::-;53024:66;;53172:20;53220:10;;53212:5;53195:14;:22;;;;:::i;:::-;:35;;;;:::i;:::-;53172:58;-1:-1:-1;53241:21:0;53265:29;53172:58;53265:14;:29;:::i;:::-;53311:10;;53241:53;;-1:-1:-1;53311:14:0;53307:194;;53379:27;53388:2;53392:13;53379:8;:27::i;:::-;-1:-1:-1;53463:11:0;;53454:35;;-1:-1:-1;;;;;53463:11:0;53476:12;53454:8;:35::i;:::-;;53307:194;53521:58;53543:10;53555:2;53559:13;53574:4;53521:21;:58::i;:::-;53513:109;;;;-1:-1:-1;;;53513:109:0;;;;;;;:::i;:::-;53640:76;53666:7;53675:2;53679:5;53686:13;53701:8;53711:4;53640:76;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;53736:4:0;;51788:1960;-1:-1:-1;;;;;;;;;;;51788:1960:0:o;54800:158::-;54894:4;54918:32;54934:2;54938:5;54945:4;54918:15;:32::i;49985:873::-;-1:-1:-1;;;;;50125:19:0;;50099:4;50125:19;;;:13;:19;;;;;;;;50124:20;50116:54;;;;-1:-1:-1;;;50116:54:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50190:17:0;;;;;;:13;:17;;;;;;;;50189:18;50181:52;;;;-1:-1:-1;;;50181:52:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50252:25:0;;;;;;:21;:25;;;;;;;;50244:65;;;;-1:-1:-1;;;50244:65:0;;;;;;;:::i;:::-;50422:10;;50383:20;;50406:13;50414:5;50406;:13;:::i;:::-;:26;;;;:::i;:::-;50383:49;-1:-1:-1;50443:21:0;50467:20;50383:49;50467:5;:20;:::i;:::-;50443:44;;50500:37;50513:4;50519:2;50523:13;50500:12;:37::i;:::-;;50556:52;50578:4;50584:2;50588:13;50603:4;50556:21;:52::i;:::-;50548:103;;;;-1:-1:-1;;;50548:103:0;;;;;;;:::i;:::-;50676:10;;:14;50672:82;;50716:11;;50707:35;;-1:-1:-1;;;;;50716:11:0;50729:12;50707:8;:35::i;:::-;;50672:82;50771:57;50791:4;50797:2;50801:5;50808:13;50823:4;50771:57;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;50846:4:0;;49985:873;-1:-1:-1;;;;;;49985:873:0:o;41660:171::-;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;41737:21:::1;:32:::0;;-1:-1:-1;;;;41737:32:0::1;-1:-1:-1::0;;;41737:32:0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;41785:38:::1;::::0;1765:41:1;;;41785:38:0::1;::::0;1738:18:1;41785:38:0::1;1625:187:1::0;38485:244:0;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38566:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;38565:31;38557:74;;;::::0;-1:-1:-1;;;38557:74:0;;23293:2:1;38557:74:0::1;::::0;::::1;23275:21:1::0;23332:2;23312:18;;;23305:30;23371:32;23351:18;;;23344:60;23421:18;;38557:74:0::1;23091:354:1::0;38557:74:0::1;-1:-1:-1::0;;;;;38642:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;;;;:37;;-1:-1:-1;;38642:37:0::1;38675:4;38642:37;::::0;;38695:26;;4086:51:1;;;38695:26:0::1;::::0;4059:18:1;38695:26:0::1;3913:230:1::0;51083:476:0;-1:-1:-1;;;;;51209:22:0;;51183:4;51209:22;;;:13;:22;;;;;;;;51208:23;51200:57;;;;-1:-1:-1;;;51200:57:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51276:30:0;;;;;;:21;:30;;;;;;;;51268:70;;;;-1:-1:-1;;;51268:70:0;;;;;;;:::i;:::-;51351:23;51359:7;51368:5;51351:7;:23::i;:::-;;51393:42;51414:7;51423:5;51430:4;51393:20;:42::i;:::-;51385:92;;;;-1:-1:-1;;;51385:92:0;;23652:2:1;51385:92:0;;;23634:21:1;23691:2;23671:18;;;23664:30;23730:34;23710:18;;;23703:62;-1:-1:-1;;;23781:18:1;;;23774:35;23826:19;;51385:92:0;23450:401:1;51385:92:0;51493:36;51508:7;51517:5;51524:4;51493:36;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;51547:4:0;51083:476;;;;;:::o;42598:184::-;42729:15;;:45;;-1:-1:-1;;;42729:45:0;;42685:24;;-1:-1:-1;;;;;42729:15:0;;:29;;:45;;42759:8;;42769:4;;;;42729:45;;;:::i;37471:269::-;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37557:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;::::1;;37549:78;;;;-1:-1:-1::0;;;37549:78:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37638:38:0;::::1;37679:5;37638:38:::0;;;:29:::1;:38;::::0;;;;;;;;:46;;-1:-1:-1;;37638:46:0::1;::::0;;37700:32;;4086:51:1;;;37700:32:0::1;::::0;4059:18:1;37700:32:0::1;3913:230:1::0;40326:265:0;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;40425:4:::1;40413:8;:16;;40405:91;;;;-1:-1:-1::0;;;40405:91:0::1;;;;;;;:::i;:::-;40507:18;:29:::0;;;40552:31:::1;::::0;2670:25:1;;;40552:31:0::1;::::0;2658:2:1;2643:18;40552:31:0::1;2524:177:1::0;49774:167:0;49869:4;49893:40;49913:4;49919:2;49923:5;49893:40;;;;;;;;;;;;:19;:40::i;39264:255::-;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;39362:4:::1;39350:8;:16;;39342:91;;;;-1:-1:-1::0;;;39342:91:0::1;;;;;;;:::i;:::-;39444:10;:21:::0;;;39481:30:::1;::::0;2670:25:1;;;39481:30:0::1;::::0;2658:2:1;2643:18;39481:30:0::1;2524:177:1::0;36119:225:0;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36194:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;36186:67;;;;-1:-1:-1::0;;;36186:67:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36264:27:0;::::1;36294:5;36264:27:::0;;;:18:::1;:27;::::0;;;;;;;;:35;;-1:-1:-1;;36264:35:0::1;::::0;;36315:21;;4086:51:1;;;36315:21:0::1;::::0;4059:18:1;36315:21:0::1;3913:230:1::0;39531:225:0;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;39630:1:::1;39615:12;:16;39607:60;;;::::0;-1:-1:-1;;;39607:60:0;;24449:2:1;39607:60:0::1;::::0;::::1;24431:21:1::0;24488:2;24468:18;;;24461:30;24527:33;24507:18;;;24500:61;24578:18;;39607:60:0::1;24247:355:1::0;39607:60:0::1;39678:11;:26:::0;;;39720:28:::1;::::0;2670:25:1;;;39720:28:0::1;::::0;2658:2:1;2643:18;39720:28:0::1;2524:177:1::0;40862:240:0;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;40970:23:::1;:50:::0;;;41036:58:::1;::::0;2670:25:1;;;41036:58:0::1;::::0;2658:2:1;2643:18;41036:58:0::1;2524:177:1::0;5810:244:0;5563:6;;-1:-1:-1;;;;;5563:6:0;391:10;5563:22;5555:67;;;;-1:-1:-1;;;5555:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5899:22:0;::::1;5891:73;;;::::0;-1:-1:-1;;;5891:73:0;;24809:2:1;5891:73:0::1;::::0;::::1;24791:21:1::0;24848:2;24828:18;;;24821:30;24887:34;24867:18;;;24860:62;-1:-1:-1;;;24938:18:1;;;24931:36;24984:19;;5891:73:0::1;24607:402:1::0;5891:73:0::1;6001:6;::::0;5980:38:::1;::::0;-1:-1:-1;;;;;5980:38:0;;::::1;::::0;6001:6:::1;::::0;5980:38:::1;::::0;6001:6:::1;::::0;5980:38:::1;6029:6;:17:::0;;-1:-1:-1;;;;;;6029:17:0::1;-1:-1:-1::0;;;;;6029:17:0;;;::::1;::::0;;;::::1;::::0;;5810:244::o;21723:337::-;-1:-1:-1;;;;;21816:19:0;;21808:68;;;;-1:-1:-1;;;21808:68:0;;25216:2:1;21808:68:0;;;25198:21:1;25255:2;25235:18;;;25228:30;25294:34;25274:18;;;25267:62;-1:-1:-1;;;25345:18:1;;;25338:34;25389:19;;21808:68:0;25014:400:1;21808:68:0;-1:-1:-1;;;;;21895:21:0;;21887:68;;;;-1:-1:-1;;;21887:68:0;;25621:2:1;21887:68:0;;;25603:21:1;25660:2;25640:18;;;25633:30;25699:34;25679:18;;;25672:62;-1:-1:-1;;;25750:18:1;;;25743:32;25792:19;;21887:68:0;25419:398:1;21887:68:0;-1:-1:-1;;;;;21968:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;22020:32;;2670:25:1;;;22020:32:0;;2643:18:1;22020:32:0;;;;;;;21723:337;;;:::o;22068:1541::-;-1:-1:-1;;;;;22190:18:0;;22182:68;;;;-1:-1:-1;;;22182:68:0;;26024:2:1;22182:68:0;;;26006:21:1;26063:2;26043:18;;;26036:30;26102:34;26082:18;;;26075:62;-1:-1:-1;;;26153:18:1;;;26146:35;26198:19;;22182:68:0;25822:401:1;22182:68:0;-1:-1:-1;;;;;22269:16:0;;22261:64;;;;-1:-1:-1;;;22261:64:0;;26430:2:1;22261:64:0;;;26412:21:1;26469:2;26449:18;;;26442:30;26508:34;26488:18;;;26481:62;-1:-1:-1;;;26559:18:1;;;26552:33;26602:19;;22261:64:0;26228:399:1;22261:64:0;-1:-1:-1;;;;;22345:19:0;;;;;;:13;:19;;;;;;;;22344:20;22336:54;;;;-1:-1:-1;;;22336:54:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22410:17:0;;;;;;:13;:17;;;;;;;;22409:18;22401:52;;;;-1:-1:-1;;;22401:52:0;;;;;;;:::i;:::-;22481:1;22472:6;:10;22464:64;;;;-1:-1:-1;;;22464:64:0;;26834:2:1;22464:64:0;;;26816:21:1;26873:2;26853:18;;;26846:30;26912:34;26892:18;;;26885:62;-1:-1:-1;;;26963:18:1;;;26956:39;27012:19;;22464:64:0;26632:405:1;22464:64:0;5494:6;;-1:-1:-1;;;;;22542:15:0;;;5494:6;;22542:15;;;;:32;;-1:-1:-1;5494:6:0;;-1:-1:-1;;;;;22561:13:0;;;5494:6;;22561:13;;22542:32;22539:138;;;22609:11;;22599:6;:21;;22591:74;;;;-1:-1:-1;;;22591:74:0;;27244:2:1;22591:74:0;;;27226:21:1;27283:2;27263:18;;;27256:30;27322:34;27302:18;;;27295:62;-1:-1:-1;;;27373:18:1;;;27366:38;27421:19;;22591:74:0;27042:404:1;22591:74:0;22689:28;22720:24;22738:4;22720:9;:24::i;:::-;22810:23;;22851:16;;22689:55;;-1:-1:-1;22786:47:0;;;;-1:-1:-1;;;22851:16:0;;;;22850:17;:42;;;;-1:-1:-1;22871:21:0;;-1:-1:-1;;;22871:21:0;;;;22850:42;:65;;;;-1:-1:-1;22902:13:0;;-1:-1:-1;;;;;22896:19:0;;;22902:13;;22896:19;22850:65;22846:195;;;22936:23;22932:98;;;22980:33;22989:23;;22980:8;:33::i;:::-;-1:-1:-1;;;;;23376:24:0;;23053:12;23376:24;;;:18;:24;;;;;;23068:4;;23376:24;;;:50;;-1:-1:-1;;;;;;23404:22:0;;;;;;:18;:22;;;;;;;;23376:50;:84;;;-1:-1:-1;;;;;;23430:30:0;;;;;;:24;:30;;;;;;;;23376:84;:121;;;-1:-1:-1;;;;;;23464:33:0;;;;;;:29;:33;;;;;;;;23376:121;23373:167;;;-1:-1:-1;23523:5:0;23373:167;23560:41;23575:4;23581:2;23585:6;23593:7;23560:14;:41::i;:::-;22171:1438;;;22068:1541;;;:::o;2197:192::-;2283:7;2319:12;2311:6;;;;2303:29;;;;-1:-1:-1;;;2303:29:0;;;;;;;;:::i;:::-;-1:-1:-1;2343:9:0;2355:5;2359:1;2355;:5;:::i;31794:160::-;31835:7;31856:15;31873;31892:19;:17;:19::i;:::-;31855:56;;-1:-1:-1;31855:56:0;-1:-1:-1;31929:17:0;31855:56;;31929:17;:::i;:::-;31922:24;;;;31794:160;:::o;53756:377::-;53878:4;783:1;1003:7;;:19;;995:63;;;;-1:-1:-1;;;995:63:0;;27653:2:1;995:63:0;;;27635:21:1;27692:2;27672:18;;;27665:30;27731:33;27711:18;;;27704:61;27782:18;;995:63:0;27451:355:1;995:63:0;783:1;1136:7;:18;53900:15:::1;-1:-1:-1::0;;;;;53900:13:0;::::1;;:15::i;:::-;53895:61;;-1:-1:-1::0;53939:5:0::1;53932:12;;53895:61;53982:96;::::0;-1:-1:-1;;;53982:96:0;;53966:13:::1;::::0;-1:-1:-1;;;;;53982:39:0;::::1;::::0;::::1;::::0;:96:::1;::::0;391:10;;54050:4;;54056:5;;54063:4;;53982:96:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;54097:27:0::1;-1:-1:-1::0;;;54097:27:0::1;::::0;-1:-1:-1;;1167:1:0::1;739::::0;1315:7;:22;53756:377;;-1:-1:-1;;;;53756:377:0:o;30613:419::-;30672:7;30681;30690;30699;30708;30717;30738:23;30763:12;30777:18;30799:20;30811:7;30799:11;:20::i;:::-;30737:82;;;;;;30831:15;30848:23;30873:12;30889:50;30901:7;30910:4;30916:10;30928;:8;:10::i;:::-;30889:11;:50::i;:::-;30830:109;;;;-1:-1:-1;30830:109:0;;-1:-1:-1;30990:15:0;;-1:-1:-1;31007:4:0;;-1:-1:-1;31013:10:0;;-1:-1:-1;30613:419:0;;-1:-1:-1;;;;;30613:419:0:o;54141:370::-;54253:4;783:1;1003:7;;:19;;995:63;;;;-1:-1:-1;;;995:63:0;;27653:2:1;995:63:0;;;27635:21:1;27692:2;27672:18;;;27665:30;27731:33;27711:18;;;27704:61;27782:18;;995:63:0;27451:355:1;995:63:0;783:1;1136:7;:18;54275:20:::1;-1:-1:-1::0;;;;;54275:18:0;::::1;;:20::i;:::-;54270:66;;-1:-1:-1::0;54319:5:0::1;54312:12;;54270:66;54362:94;::::0;-1:-1:-1;;;54362:94:0;;54346:13:::1;::::0;-1:-1:-1;;;;;54362:43:0;::::1;::::0;::::1;::::0;:94:::1;::::0;391:10;;54434:5;;54441:4;;54362:94:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;54475:27:0::1;-1:-1:-1::0;;;54475:27:0::1;::::0;-1:-1:-1;;1167:1:0::1;739::::0;1315:7;:22;54141:370;;-1:-1:-1;;;54141:370:0:o;23617:1252::-;18157:16;:23;;-1:-1:-1;;;;18157:23:0;-1:-1:-1;;;18157:23:0;;;23761:12:::1;::::0;18157:23;;23761:16:::1;::::0;23776:1:::1;::::0;23761:16:::1;:::i;:::-;23744:33;;23788:23;23852:6;23831:18;;23814:14;;:35;;;;:::i;:::-;:44;;;;:::i;:::-;23788:70;;23869:21;23931:15;23916:12;;23893:20;:35;;;;:::i;:::-;:53;;;;:::i;:::-;23869:77:::0;-1:-1:-1;23984:21:0::1;24016:61;24041:4;::::0;23869:77;24016:16:::1;:61::i;:::-;24088:26;24117:38;24141:14:::0;24117:21:::1;:38;:::i;:::-;24088:67;;24168:19;24229:14;;24211:15;24190:18;:36;;;;:::i;:::-;:53;;;;:::i;:::-;24168:75;;24254:23;24319:18;;24301:15;24280:18;:36;;;;:::i;:::-;:57;;;;:::i;:::-;24404:11;::::0;24254:83;;-1:-1:-1;24383:46:0::1;::::0;-1:-1:-1;;;;;24404:11:0::1;24417::::0;24383:20:::1;:46::i;:::-;24500:15;::::0;24479:54:::1;::::0;-1:-1:-1;;;;;24500:15:0::1;24517::::0;24479:20:::1;:54::i;:::-;24583:21;24607:36;24630:13:::0;24607:20;:36:::1;:::i;:::-;24583:60:::0;-1:-1:-1;24654:19:0::1;24711:15:::0;24676:32:::1;24697:11:::0;24676:18;:32:::1;:::i;:::-;:50;;;;:::i;:::-;24654:72;;24737:40;24750:13;24765:11;24737:12;:40::i;:::-;24803:58;::::0;;10024:25:1;;;10080:2;10065:18;;10058:34;;;10108:18;;;10101:34;;;24803:58:0::1;::::0;10012:2:1;9997:18;24803:58:0::1;;;;;;;-1:-1:-1::0;;18203:16:0;:24;;-1:-1:-1;;;;18203:24:0;;;-1:-1:-1;;;;;;;;23617:1252:0:o;26197:765::-;26309:7;26305:40;;26331:14;:12;:14::i;:::-;-1:-1:-1;;;;;26370:29:0;;;;;;:21;:29;;;;;;;;:66;;;;-1:-1:-1;;;;;;26404:32:0;;;;;;:21;:32;;;;;;;;26403:33;26370:66;26366:527;;;26453:48;26475:6;26483:9;26494:6;26453:21;:48::i;:::-;26366:527;;;-1:-1:-1;;;;;26524:29:0;;;;;;:21;:29;;;;;;;;26523:30;:66;;;;-1:-1:-1;;;;;;26557:32:0;;;;;;:21;:32;;;;;;;;26523:66;26519:374;;;26606:46;26626:6;26634:9;26645:6;26606:19;:46::i;26519:374::-;-1:-1:-1;;;;;26674:29:0;;;;;;:21;:29;;;;;;;;:65;;;;-1:-1:-1;;;;;;26707:32:0;;;;;;:21;:32;;;;;;;;26674:65;26670:223;;;26756:48;26778:6;26786:9;26797:6;26756:21;:48::i;26670:223::-;26837:44;26855:6;26863:9;26874:6;26837:17;:44::i;:::-;26917:7;26913:41;;26939:15;33883;;33874:6;:24;33924:21;;33909:12;:36;33830:123;26939:15;26197:765;;;;:::o;31962:602::-;32059:7;;32095;;32012;;;;;32119:333;32143:19;:26;32139:30;;32119:333;;;32229:7;32195;:31;32203:19;32223:1;32203:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;32203:22:0;32195:31;;;;;;;;;;;;;:41;;:86;;;32274:7;32240;:31;32248:19;32268:1;32248:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;32248:22:0;32240:31;;;;;;;;;;;;;:41;32195:86;32191:117;;;32291:7;;32300;;32283:25;;;;;;;31962:602;;:::o;32191:117::-;32343:7;:31;32351:19;32371:1;32351:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;32351:22:0;32343:31;;;;;;;;;;;;;32333:41;;:7;:41;:::i;:::-;32323:51;;32409:7;:31;32417:19;32437:1;32417:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;32417:22:0;32409:31;;;;;;;;;;;;;32399:41;;:7;:41;:::i;:::-;32389:51;-1:-1:-1;32171:3:0;;;;:::i;:::-;;;;32119:333;;;;32486:7;;32476;;:17;;;;:::i;:::-;32466:7;:27;32462:58;;;32503:7;;32512;;32495:25;;;;;;31962:602;;:::o;32462:58::-;32539:7;;32548;;-1:-1:-1;31962:602:0;-1:-1:-1;31962:602:0:o;2421:619::-;2481:4;2949:20;;2792:66;2989:23;;;;;;:42;;-1:-1:-1;;3016:15:0;;;2981:51;-1:-1:-1;;2421:619:0:o;31040:324::-;31100:7;31109;31118;31138:12;31153:24;31169:7;31153:15;:24::i;:::-;31138:39;;31188:18;31209:30;31231:7;31209:21;:30::i;:::-;31188:51;-1:-1:-1;31250:23:0;31188:51;31276:14;31286:4;31276:7;:14;:::i;:::-;:27;;;;:::i;:::-;31250:53;31339:4;;-1:-1:-1;31345:10:0;;-1:-1:-1;31040:324:0;;-1:-1:-1;;;31040:324:0:o;31372:414::-;31487:7;;;;31543:21;31553:11;31543:7;:21;:::i;:::-;31525:39;-1:-1:-1;31575:12:0;31590:18;31597:11;31590:4;:18;:::i;:::-;31575:33;-1:-1:-1;31619:18:0;31640:24;31653:11;31640:10;:24;:::i;:::-;31619:45;-1:-1:-1;31675:23:0;31619:45;31701:14;31711:4;31701:7;:14;:::i;:::-;:27;;;;:::i;:::-;31747:7;;;;-1:-1:-1;31773:4:0;;-1:-1:-1;31372:414:0;;-1:-1:-1;;;;;;;31372:414:0:o;24877:733::-;25102:16;;;25116:1;25102:16;;;;;;;;25078:21;;25102:16;;;;;;;;;;-1:-1:-1;25102:16:0;25078:40;;25139:12;25129:4;25134:1;25129:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25129:22:0;;;:7;;;;;;;;;;:22;;;;25172:15;;:22;;;-1:-1:-1;;;25172:22:0;;;;:15;;;;;:20;;:22;;;;;25129:7;;25172:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25162:4;25167:1;25162:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25162:32:0;;;:7;;;;;;;;;:32;25244:15;;25207:67;;-1:-1:-1;;;25207:67:0;;25244:15;;;25207:67;;;20737:51:1;20804:18;;;20797:34;;;25207:28:0;;;;;;20710:18:1;;25207:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;25313:15:0;;:236;;-1:-1:-1;;;25313:236:0;;-1:-1:-1;;;;;25313:15:0;;;;:66;;:236;;25394:11;;25313:15;;25464:4;;25483:9;;25523:15;;25313:236;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25567:35;25584:11;25597:4;25567:35;;;;;;;:::i;:::-;;;;;;;;25007:603;24877:733;;;:::o;41843:126::-;41935:26;;-1:-1:-1;;;;;41935:18:0;;;:26;;;;;41954:6;;41935:26;;;;41954:6;41935:18;:26;;;;;;;;;;;;;;;;;;;;;41843:126;;:::o;25622:567::-;25802:15;;25770:62;;25787:4;;-1:-1:-1;;;;;25802:15:0;25820:11;25770:8;:62::i;:::-;25875:15;;-1:-1:-1;;;;;25875:15:0;:31;25914:9;25947:4;25967:11;25875:15;;26079:7;5494:6;;-1:-1:-1;;;;;5494:6:0;;5429:79;26079:7;25875:252;;;;;;-1:-1:-1;;;;;;25875:252:0;;;-1:-1:-1;;;;;30249:15:1;;;25875:252:0;;;30231:34:1;30281:18;;;30274:34;;;;30324:18;;;30317:34;;;;30367:18;;;30360:34;30431:15;;;30410:19;;;30403:44;26101:15:0;30463:19:1;;;30456:35;30165:19;;25875:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;26145:36:0;;;30987:25:1;;;31043:2;31028:18;;31021:34;;;26145:36:0;;-1:-1:-1;30960:18:1;26145:36:0;;;;;;;25622:567;;:::o;33574:244::-;33620:6;;:11;:32;;;;-1:-1:-1;33635:12:0;;:17;33620:32;33617:44;;;33574:244::o;33617:44::-;33699:6;;;33681:15;:24;33740:12;;;33716:21;:36;-1:-1:-1;33773:10:0;;;;33794:16;33574:244::o;28660:857::-;28763:15;28780:23;28805:12;28819:23;28844:12;28858:18;28880:19;28891:7;28880:10;:19::i;:::-;-1:-1:-1;;;;;28943:15:0;;28920:20;28943:15;;;:7;:15;;;;;;28762:137;;-1:-1:-1;28762:137:0;;-1:-1:-1;28762:137:0;;-1:-1:-1;28762:137:0;;-1:-1:-1;28762:137:0;-1:-1:-1;28762:137:0;-1:-1:-1;28991:25:0;29009:7;28943:15;28991:25;:::i;:::-;-1:-1:-1;;;;;29027:15:0;;;;;;:7;:15;;;;;;;;:29;;;29085:7;:15;;;;;;28969:47;;-1:-1:-1;29085:25:0;;29103:7;;29085:25;:::i;:::-;-1:-1:-1;;;;;29067:15:0;;;;;;;:7;:15;;;;;;:43;;;;29149:18;;;;;;;;;;29203:36;29224:15;29149:18;29203:36;:::i;:::-;-1:-1:-1;;;;;29250:18:0;;;;;;:7;:18;;;;;:35;;;29178:61;-1:-1:-1;29298:78:0;29317:12;29331:11;29344:15;29178:61;29298:18;:78::i;:::-;29389:26;29404:10;29389:14;:26::i;:::-;29426:23;29438:4;29444;29426:11;:23::i;:::-;29482:9;-1:-1:-1;;;;;29465:44:0;29474:6;-1:-1:-1;;;;;29465:44:0;;29493:15;29465:44;;;;2670:25:1;;2658:2;2643:18;;2524:177;29465:44:0;;;;;;;;28751:766;;;;;;;;;;28660:857;;;:::o;27769:883::-;27870:15;27887:23;27912:12;27926:23;27951:12;27965:18;27987:19;27998:7;27987:10;:19::i;:::-;-1:-1:-1;;;;;28050:15:0;;28027:20;28050:15;;;:7;:15;;;;;;27869:137;;-1:-1:-1;27869:137:0;;-1:-1:-1;27869:137:0;;-1:-1:-1;27869:137:0;;-1:-1:-1;27869:137:0;-1:-1:-1;27869:137:0;-1:-1:-1;28098:25:0;27869:137;28050:15;28098:25;:::i;:::-;-1:-1:-1;;;;;28134:15:0;;;;;;;:7;:15;;;;;;;;:29;;;28202:18;;;;;:7;:18;;;;;;28076:47;;-1:-1:-1;28256:36:0;28277:15;28202:18;28256:36;:::i;:::-;-1:-1:-1;;;;;28303:18:0;;;;;;:7;:18;;;;;;;;:35;;;28370:7;:18;;;;;;28231:61;;-1:-1:-1;28370:36:0;;28391:15;;28370:36;:::i;:::-;-1:-1:-1;;;;;28349:18:0;;;;;;:7;:18;;;;;:57;28428:78;28447:12;28461:11;28474:15;28491:14;28428:18;:78::i;29525:931::-;29628:15;29645:23;29670:12;29684:23;29709:12;29723:18;29745:19;29756:7;29745:10;:19::i;:::-;-1:-1:-1;;;;;29808:15:0;;29785:20;29808:15;;;:7;:15;;;;;;29627:137;;-1:-1:-1;29627:137:0;;-1:-1:-1;29627:137:0;;-1:-1:-1;29627:137:0;;-1:-1:-1;29627:137:0;-1:-1:-1;29627:137:0;-1:-1:-1;29856:25:0;29874:7;29808:15;29856:25;:::i;:::-;-1:-1:-1;;;;;29892:15:0;;;;;;:7;:15;;;;;;;;:29;;;29950:7;:15;;;;;;29834:47;;-1:-1:-1;29950:25:0;;29968:7;;29950:25;:::i;:::-;-1:-1:-1;;;;;29932:15:0;;;;;;;:7;:15;;;;;;;;:43;;;;30014:18;;;;;:7;:18;;;;;;;;30068:36;30089:15;30014:18;30068:36;:::i;26970:791::-;27069:15;27086:23;27111:12;27125:23;27150:12;27164:18;27186:19;27197:7;27186:10;:19::i;:::-;-1:-1:-1;;;;;27241:15:0;;27218:20;27241:15;;;:7;:15;;;;;;27068:137;;-1:-1:-1;27068:137:0;;-1:-1:-1;27068:137:0;;-1:-1:-1;27068:137:0;;-1:-1:-1;27068:137:0;-1:-1:-1;27068:137:0;-1:-1:-1;27289:25:0;27068:137;27241:15;27289:25;:::i;:::-;-1:-1:-1;;;;;27325:15:0;;;;;;;:7;:15;;;;;;:29;;;27393:18;;;;;;;;;27267:47;;-1:-1:-1;27447:36:0;27468:15;27393:18;27447:36;:::i;33296:123::-;33360:7;33406:5;33397:6;;33387:7;:16;;;;:::i;:::-;:24;;;;:::i;33431:135::-;33501:7;33553:5;33538:12;;33528:7;:22;;;;:::i;32944:344::-;33087:20;;:42;;;;;33128:1;33111:14;:18;33087:42;33083:96;;;33156:7;;:11;;33166:1;33156:11;:::i;:::-;33146:7;:21;33083:96;33210:1;33195:12;:16;:36;;;;-1:-1:-1;33215:16:0;;33195:36;33191:90;;;33268:1;33258:7;;:11;;;;:::i;:::-;33248:7;:21;32944:344;;;;:::o;32576:356::-;32639:19;32662:10;:8;:10::i;:::-;32639:33;-1:-1:-1;32683:18:0;32704:24;32639:33;32704:10;:24;:::i;:::-;32780:4;32764:22;;;;:7;:22;;;;;;32683:45;;-1:-1:-1;32764:35:0;;32683:45;;32764:35;:::i;:::-;32755:4;32739:22;;;;:7;:22;;;;;;;;:60;;;;32813:21;:36;;;;;;32810:114;;;32905:4;32889:22;;;;:7;:22;;;;;;:35;;32914:10;;32889:35;:::i;:::-;32880:4;32864:22;;;;:7;:22;;;;;:60;32628:304;;32576:356;:::o;30464:141::-;30552:4;30542:7;;:14;;;;:::i;:::-;30532:7;:24;30580:10;;:17;;30593:4;;30580:17;:::i;:::-;30567:10;:30;-1:-1:-1;;30464:141:0:o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:127::-;211:10;206:3;202:20;199:1;192:31;242:4;239:1;232:15;266:4;263:1;256:15;282:275;353:2;347:9;418:2;399:13;;-1:-1:-1;;395:27:1;383:40;;453:18;438:34;;474:22;;;435:62;432:88;;;500:18;;:::i;:::-;536:2;529:22;282:275;;-1:-1:-1;282:275:1:o;562:530::-;604:5;657:3;650:4;642:6;638:17;634:27;624:55;;675:1;672;665:12;624:55;711:6;698:20;737:18;733:2;730:26;727:52;;;759:18;;:::i;:::-;803:55;846:2;827:13;;-1:-1:-1;;823:27:1;852:4;819:38;803:55;:::i;:::-;883:2;874:7;867:19;929:3;922:4;917:2;909:6;905:15;901:26;898:35;895:55;;;946:1;943;936:12;895:55;1011:2;1004:4;996:6;992:17;985:4;976:7;972:18;959:55;1059:1;1034:16;;;1052:4;1030:27;1023:38;;;;1038:7;562:530;-1:-1:-1;;;562:530:1:o;1097:523::-;1183:6;1191;1199;1252:2;1240:9;1231:7;1227:23;1223:32;1220:52;;;1268:1;1265;1258:12;1220:52;1307:9;1294:23;1326:31;1351:5;1326:31;:::i;:::-;1376:5;-1:-1:-1;1428:2:1;1413:18;;1400:32;;-1:-1:-1;1483:2:1;1468:18;;1455:32;1510:18;1499:30;;1496:50;;;1542:1;1539;1532:12;1496:50;1565:49;1606:7;1597:6;1586:9;1582:22;1565:49;:::i;:::-;1555:59;;;1097:523;;;;;:::o;1817:131::-;-1:-1:-1;;;;;;1891:32:1;;1881:43;;1871:71;;1938:1;1935;1928:12;1953:245;2011:6;2064:2;2052:9;2043:7;2039:23;2035:32;2032:52;;;2080:1;2077;2070:12;2032:52;2119:9;2106:23;2138:30;2162:5;2138:30;:::i;2203:316::-;2280:6;2288;2296;2349:2;2337:9;2328:7;2324:23;2320:32;2317:52;;;2365:1;2362;2355:12;2317:52;-1:-1:-1;;2388:23:1;;;2458:2;2443:18;;2430:32;;-1:-1:-1;2509:2:1;2494:18;;;2481:32;;2203:316;-1:-1:-1;2203:316:1:o;2706:180::-;2765:6;2818:2;2806:9;2797:7;2793:23;2789:32;2786:52;;;2834:1;2831;2824:12;2786:52;-1:-1:-1;2857:23:1;;2706:180;-1:-1:-1;2706:180:1:o;2891:472::-;2933:3;2971:5;2965:12;2998:6;2993:3;2986:19;3023:1;3033:162;3047:6;3044:1;3041:13;3033:162;;;3109:4;3165:13;;;3161:22;;3155:29;3137:11;;;3133:20;;3126:59;3062:12;3033:162;;;3213:6;3210:1;3207:13;3204:87;;;3279:1;3272:4;3263:6;3258:3;3254:16;3250:27;3243:38;3204:87;-1:-1:-1;3345:2:1;3324:15;-1:-1:-1;;3320:29:1;3311:39;;;;3352:4;3307:50;;2891:472;-1:-1:-1;;2891:472:1:o;3368:220::-;3517:2;3506:9;3499:21;3480:4;3537:45;3578:2;3567:9;3563:18;3555:6;3537:45;:::i;3593:315::-;3661:6;3669;3722:2;3710:9;3701:7;3697:23;3693:32;3690:52;;;3738:1;3735;3728:12;3690:52;3777:9;3764:23;3796:31;3821:5;3796:31;:::i;:::-;3846:5;3898:2;3883:18;;;;3870:32;;-1:-1:-1;;;3593:315:1:o;4372:683::-;4467:6;4475;4483;4536:2;4524:9;4515:7;4511:23;4507:32;4504:52;;;4552:1;4549;4542:12;4504:52;4588:9;4575:23;4565:33;;4649:2;4638:9;4634:18;4621:32;4672:18;4713:2;4705:6;4702:14;4699:34;;;4729:1;4726;4719:12;4699:34;4767:6;4756:9;4752:22;4742:32;;4812:7;4805:4;4801:2;4797:13;4793:27;4783:55;;4834:1;4831;4824:12;4783:55;4874:2;4861:16;4900:2;4892:6;4889:14;4886:34;;;4916:1;4913;4906:12;4886:34;4969:7;4964:2;4954:6;4951:1;4947:14;4943:2;4939:23;4935:32;4932:45;4929:65;;;4990:1;4987;4980:12;4929:65;5021:2;5017;5013:11;5003:21;;5043:6;5033:16;;;;;4372:683;;;;;:::o;5060:632::-;5231:2;5283:21;;;5353:13;;5256:18;;;5375:22;;;5202:4;;5231:2;5454:15;;;;5428:2;5413:18;;;5202:4;5497:169;5511:6;5508:1;5505:13;5497:169;;;5572:13;;5560:26;;5641:15;;;;5606:12;;;;5533:1;5526:9;5497:169;;;-1:-1:-1;5683:3:1;;5060:632;-1:-1:-1;;;;;;5060:632:1:o;5697:456::-;5774:6;5782;5790;5843:2;5831:9;5822:7;5818:23;5814:32;5811:52;;;5859:1;5856;5849:12;5811:52;5898:9;5885:23;5917:31;5942:5;5917:31;:::i;:::-;5967:5;-1:-1:-1;6024:2:1;6009:18;;5996:32;6037:33;5996:32;6037:33;:::i;:::-;5697:456;;6089:7;;-1:-1:-1;;;6143:2:1;6128:18;;;;6115:32;;5697:456::o;6158:525::-;6244:6;6252;6260;6268;6321:3;6309:9;6300:7;6296:23;6292:33;6289:53;;;6338:1;6335;6328:12;6289:53;6377:9;6364:23;6396:31;6421:5;6396:31;:::i;:::-;6446:5;-1:-1:-1;6503:2:1;6488:18;;6475:32;6516:33;6475:32;6516:33;:::i;:::-;6158:525;;6568:7;;-1:-1:-1;;;;6622:2:1;6607:18;;6594:32;;6673:2;6658:18;6645:32;;6158:525::o;6877:247::-;6936:6;6989:2;6977:9;6968:7;6964:23;6960:32;6957:52;;;7005:1;7002;6995:12;6957:52;7044:9;7031:23;7063:31;7088:5;7063:31;:::i;7129:118::-;7215:5;7208:13;7201:21;7194:5;7191:32;7181:60;;7237:1;7234;7227:12;7252:309;7317:6;7325;7378:2;7366:9;7357:7;7353:23;7349:32;7346:52;;;7394:1;7391;7384:12;7346:52;7430:9;7417:23;7407:33;;7490:2;7479:9;7475:18;7462:32;7503:28;7525:5;7503:28;:::i;:::-;7550:5;7540:15;;;7252:309;;;;;:::o;7774:734::-;7878:6;7886;7894;7902;7910;7963:3;7951:9;7942:7;7938:23;7934:33;7931:53;;;7980:1;7977;7970:12;7931:53;8019:9;8006:23;8038:31;8063:5;8038:31;:::i;:::-;8088:5;-1:-1:-1;8145:2:1;8130:18;;8117:32;8158:33;8117:32;8158:33;:::i;:::-;8210:7;-1:-1:-1;8264:2:1;8249:18;;8236:32;;-1:-1:-1;8315:2:1;8300:18;;8287:32;;-1:-1:-1;8370:3:1;8355:19;;8342:33;8398:18;8387:30;;8384:50;;;8430:1;8427;8420:12;8384:50;8453:49;8494:7;8485:6;8474:9;8470:22;8453:49;:::i;:::-;8443:59;;;7774:734;;;;;;;;:::o;8513:665::-;8608:6;8616;8624;8632;8685:3;8673:9;8664:7;8660:23;8656:33;8653:53;;;8702:1;8699;8692:12;8653:53;8741:9;8728:23;8760:31;8785:5;8760:31;:::i;:::-;8810:5;-1:-1:-1;8867:2:1;8852:18;;8839:32;8880:33;8839:32;8880:33;:::i;:::-;8932:7;-1:-1:-1;8986:2:1;8971:18;;8958:32;;-1:-1:-1;9041:2:1;9026:18;;9013:32;9068:18;9057:30;;9054:50;;;9100:1;9097;9090:12;9054:50;9123:49;9164:7;9155:6;9144:9;9140:22;9123:49;:::i;:::-;9113:59;;;8513:665;;;;;;;:::o;9183:241::-;9239:6;9292:2;9280:9;9271:7;9267:23;9263:32;9260:52;;;9308:1;9305;9298:12;9260:52;9347:9;9334:23;9366:28;9388:5;9366:28;:::i;9429:388::-;9497:6;9505;9558:2;9546:9;9537:7;9533:23;9529:32;9526:52;;;9574:1;9571;9564:12;9526:52;9613:9;9600:23;9632:31;9657:5;9632:31;:::i;:::-;9682:5;-1:-1:-1;9739:2:1;9724:18;;9711:32;9752:33;9711:32;9752:33;:::i;10146:184::-;10216:6;10269:2;10257:9;10248:7;10244:23;10240:32;10237:52;;;10285:1;10282;10275:12;10237:52;-1:-1:-1;10308:16:1;;10146:184;-1:-1:-1;10146:184:1:o;10335:356::-;10537:2;10519:21;;;10556:18;;;10549:30;10615:34;10610:2;10595:18;;10588:62;10682:2;10667:18;;10335:356::o;10696:426::-;10898:2;10880:21;;;10937:2;10917:18;;;10910:30;10976:34;10971:2;10956:18;;10949:62;11047:32;11042:2;11027:18;;11020:60;11112:3;11097:19;;10696:426::o;11127:380::-;11206:1;11202:12;;;;11249;;;11270:61;;11324:4;11316:6;11312:17;11302:27;;11270:61;11377:2;11369:6;11366:14;11346:18;11343:38;11340:161;;;11423:10;11418:3;11414:20;11411:1;11404:31;11458:4;11455:1;11448:15;11486:4;11483:1;11476:15;11340:161;;11127:380;;;:::o;11512:776::-;11752:25;;;11740:2;11796;11814:18;;;11807:30;;;11725:18;;;11872:22;;;11692:4;;11951:6;;11925:2;11910:18;;11692:4;11985:277;11999:6;11996:1;11993:13;11985:277;;;12074:6;12061:20;12094:31;12119:5;12094:31;:::i;:::-;-1:-1:-1;;;;;12150:31:1;12138:44;;12237:15;;;;12202:12;;;;12178:1;12014:9;11985:277;;;-1:-1:-1;12279:3:1;11512:776;-1:-1:-1;;;;;;;11512:776:1:o;12293:936::-;12388:6;12419:2;12462;12450:9;12441:7;12437:23;12433:32;12430:52;;;12478:1;12475;12468:12;12430:52;12511:9;12505:16;12540:18;12581:2;12573:6;12570:14;12567:34;;;12597:1;12594;12587:12;12567:34;12635:6;12624:9;12620:22;12610:32;;12680:7;12673:4;12669:2;12665:13;12661:27;12651:55;;12702:1;12699;12692:12;12651:55;12731:2;12725:9;12753:2;12749;12746:10;12743:36;;;12759:18;;:::i;:::-;12805:2;12802:1;12798:10;12788:20;;12828:28;12852:2;12848;12844:11;12828:28;:::i;:::-;12890:15;;;12960:11;;;12956:20;;;12921:12;;;;12988:19;;;12985:39;;;13020:1;13017;13010:12;12985:39;13044:11;;;;13064:135;13080:6;13075:3;13072:15;13064:135;;;13146:10;;13134:23;;13097:12;;;;13177;;;;13064:135;;;13218:5;12293:936;-1:-1:-1;;;;;;;;12293:936:1:o;13645:127::-;13706:10;13701:3;13697:20;13694:1;13687:31;13737:4;13734:1;13727:15;13761:4;13758:1;13751:15;13777:217;13817:1;13843;13833:132;;13887:10;13882:3;13878:20;13875:1;13868:31;13922:4;13919:1;13912:15;13950:4;13947:1;13940:15;13833:132;-1:-1:-1;13979:9:1;;13777:217::o;13999:351::-;14201:2;14183:21;;;14240:2;14220:18;;;14213:30;14279:29;14274:2;14259:18;;14252:57;14341:2;14326:18;;13999:351::o;14355:127::-;14416:10;14411:3;14407:20;14404:1;14397:31;14447:4;14444:1;14437:15;14471:4;14468:1;14461:15;14487:125;14527:4;14555:1;14552;14549:8;14546:34;;;14560:18;;:::i;:::-;-1:-1:-1;14597:9:1;;14487:125::o;14617:127::-;14678:10;14673:3;14669:20;14666:1;14659:31;14709:4;14706:1;14699:15;14733:4;14730:1;14723:15;14749:135;14788:3;-1:-1:-1;;14809:17:1;;14806:43;;;14829:18;;:::i;:::-;-1:-1:-1;14876:1:1;14865:13;;14749:135::o;14889:128::-;14929:3;14960:1;14956:6;14953:1;14950:13;14947:39;;;14966:18;;:::i;:::-;-1:-1:-1;15002:9:1;;14889:128::o;15377:345::-;15579:2;15561:21;;;15618:2;15598:18;;;15591:30;-1:-1:-1;;;15652:2:1;15637:18;;15630:51;15713:2;15698:18;;15377:345::o;15727:351::-;15929:2;15911:21;;;15968:2;15948:18;;;15941:30;16007:29;16002:2;15987:18;;15980:57;16069:2;16054:18;;15727:351::o;16083:168::-;16123:7;16189:1;16185;16181:6;16177:14;16174:1;16171:21;16166:1;16159:9;16152:17;16148:45;16145:71;;;16196:18;;:::i;:::-;-1:-1:-1;16236:9:1;;16083:168::o;16256:402::-;16458:2;16440:21;;;16497:2;16477:18;;;16470:30;16536:34;16531:2;16516:18;;16509:62;-1:-1:-1;;;16602:2:1;16587:18;;16580:36;16648:3;16633:19;;16256:402::o;16663:459::-;16923:1;16919;16914:3;16910:11;16906:19;16898:6;16894:32;16883:9;16876:51;16963:6;16958:2;16947:9;16943:18;16936:34;17006:6;17001:2;16990:9;16986:18;16979:34;17049:3;17044:2;17033:9;17029:18;17022:31;16857:4;17070:46;17111:3;17100:9;17096:19;17088:6;17070:46;:::i;17540:251::-;17610:6;17663:2;17651:9;17642:7;17638:23;17634:32;17631:52;;;17679:1;17676;17669:12;17631:52;17711:9;17705:16;17730:31;17755:5;17730:31;:::i;18105:351::-;18307:2;18289:21;;;18346:2;18326:18;;;18319:30;18385:29;18380:2;18365:18;;18358:57;18447:2;18432:18;;18105:351::o;19526:402::-;19728:2;19710:21;;;19767:2;19747:18;;;19740:30;19806:34;19801:2;19786:18;;19779:62;-1:-1:-1;;;19872:2:1;19857:18;;19850:36;19918:3;19903:19;;19526:402::o;20313:245::-;20380:6;20433:2;20421:9;20412:7;20408:23;20404:32;20401:52;;;20449:1;20446;20439:12;20401:52;20481:9;20475:16;20500:28;20522:5;20500:28;:::i;20842:461::-;20895:3;20933:5;20927:12;20960:6;20955:3;20948:19;20986:4;21015:2;21010:3;21006:12;20999:19;;21052:2;21045:5;21041:14;21073:1;21083:195;21097:6;21094:1;21091:13;21083:195;;;21162:13;;-1:-1:-1;;;;;21158:39:1;21146:52;;21218:12;;;;21253:15;;;;21194:1;21112:9;21083:195;;;-1:-1:-1;21294:3:1;;20842:461;-1:-1:-1;;;;;20842:461:1:o;21308:574::-;21599:6;21588:9;21581:25;21642:6;21637:2;21626:9;21622:18;21615:34;21685:3;21680:2;21669:9;21665:18;21658:31;21562:4;21706:57;21758:3;21747:9;21743:19;21735:6;21706:57;:::i;:::-;-1:-1:-1;;;;;21799:32:1;;;;21794:2;21779:18;;21772:60;-1:-1:-1;21863:3:1;21848:19;21841:35;21698:65;21308:574;-1:-1:-1;;;21308:574:1:o;21887:633::-;22137:4;22183:1;22179;22174:3;22170:11;22166:19;22224:2;22216:6;22212:15;22201:9;22194:34;22276:2;22268:6;22264:15;22259:2;22248:9;22244:18;22237:43;;22316:6;22311:2;22300:9;22296:18;22289:34;22359:6;22354:2;22343:9;22339:18;22332:34;22403:6;22397:3;22386:9;22382:19;22375:35;22447:3;22441;22430:9;22426:19;22419:32;22468:46;22509:3;22498:9;22494:19;22486:6;22468:46;:::i;22525:561::-;-1:-1:-1;;;;;22822:15:1;;;22804:34;;22874:15;;22869:2;22854:18;;22847:43;22921:2;22906:18;;22899:34;;;22964:2;22949:18;;22942:34;;;22784:3;23007;22992:19;;22985:32;;;22747:4;;23034:46;;23060:19;;23052:6;23034:46;:::i;:::-;23026:54;22525:561;-1:-1:-1;;;;;;;22525:561:1:o;23856:386::-;24088:1;24084;24079:3;24075:11;24071:19;24063:6;24059:32;24048:9;24041:51;24128:6;24123:2;24112:9;24108:18;24101:34;24171:2;24166;24155:9;24151:18;24144:30;24022:4;24191:45;24232:2;24221:9;24217:18;24209:6;24191:45;:::i;27811:497::-;-1:-1:-1;;;;;28088:15:1;;;28070:34;;28140:15;;28135:2;28120:18;;28113:43;28187:2;28172:18;;28165:34;;;28235:3;28230:2;28215:18;;28208:31;;;28013:4;;28256:46;;28282:19;;28274:6;28256:46;:::i;28313:249::-;28382:6;28435:2;28423:9;28414:7;28410:23;28406:32;28403:52;;;28451:1;28448;28441:12;28403:52;28483:9;28477:16;28502:30;28526:5;28502:30;:::i;29553:332::-;29760:6;29749:9;29742:25;29803:2;29798;29787:9;29783:18;29776:30;29723:4;29823:56;29875:2;29864:9;29860:18;29852:6;29823:56;:::i;30502:306::-;30590:6;30598;30606;30659:2;30647:9;30638:7;30634:23;30630:32;30627:52;;;30675:1;30672;30665:12;30627:52;30704:9;30698:16;30688:26;;30754:2;30743:9;30739:18;30733:25;30723:35;;30798:2;30787:9;30783:18;30777:25;30767:35;;30502:306;;;;;:::o

Swarm Source

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