ETH Price: $2,588.07 (-2.96%)
Gas: 2 Gwei

Token

DTT Exchange V5 (DTT)
 

Overview

Max Total Supply

0 DTT

Holders

3,394

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 3 Decimals)

Balance
0 DTT

Value
$0.00
0x80c442f0c740e27d136e9d365f608c7b8a924475
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
DTT_Exchange_v5

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-01-13
*/

pragma solidity ^0.7.5;

/**---------------------------------------------------------------------------/
/**---************--**************--***************--********##########*******/
/**---************--**************--***************--*******###########*******/
/**---**     *****--    *****     --     *****     --******####        *******/
/**---**     *****--    *****     --     *****     --*****####         *******/
/**---**     *****--    *****     --     *****     --****############# *******/
/**---**     *****--    *****     --     *****     --***############## *******/
/**---**     *****--    *****     --     *****     --**           #### *******/
/**---**     *****--    *****     --     *****     --**           #### *******/
/**---************--    *****     --     *****     --**############### *******/
/**---************------*****------------*****-------**############### *******/
/**--------------------------------------------------------------------------*/

//ERC 20 Token

contract DTT_Exchange_v5 {
    // only people with tokens
    modifier onlyBagholders() {
        require(myTokens() > 0);
        _;
    }
    modifier onlyAdministrator(){
        address _customerAddress = msg.sender;
        require(administrators[_customerAddress]);
        _;
    }
    modifier onlyCreator(){
        address _customerAddress = msg.sender;
        require(_customerAddress == sonk);
        _;
    }
    /*==============================
    =            EVENTS            =
    ==============================*/
    event Approval(
        address indexed tokenOwner, 
        address indexed spender,
        uint tokens
    );
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 tokens
    );
    event Withdraw(
        address indexed customerAddress,
        uint256 ethereumWithdrawn
    );
    event RewardWithdraw(
        address indexed customerAddress,
        uint256 tokens
    );
    event Buy(
        address indexed buyer,
        uint256 tokensBought
    );
    event Sell(
        address indexed seller,
        uint256 tokensSold
    );
    /*=====================================
    =            CONFIGURABLES            =
    =====================================*/
    string public  name = "DTT Exchange V5";
    string public symbol = "DTT";
    uint8 public decimals = 3;
    uint256 public totalSupply_ = 900000000;
    uint256 constant internal tokenPriceInitial_ = 270000000000;
    uint256 constant internal tokenPriceIncremental_ = 210;
    uint256 internal buyPercent = 300; //comes multiplied by 1000 from outside
    uint256 internal sellPercent = 300;
    uint256 internal referralPercent = 300;
    uint256 internal _transferFees = 0;
    uint256 public currentPrice_ = tokenPriceInitial_;
    uint256 public grv = 1;
    uint256 internal maxSellable = 6000000;
    // Please verify the website https://dttexchange.com before purchasing tokens

    address commissionHolder; // holds commissions fees
    address payable public devAddress; // Growth funds
    mapping(address => uint256) internal tokenBalanceLedger_;
    mapping(address => mapping (address => uint256)) allowed;
    uint256[6] internal slabPercentage = [300,300,300,300,300,300];
    address payable sonk;
    uint256 public tokenSupply_ = 0;
    // uint256 internal profitPerShare_;
    mapping(address => bool) internal administrators;
    bool mutex = false;
    bool buyable = false;
    bool sellable = false;
    uint256 public minEligibility = 20000;
    
    constructor()
    {
        sonk = msg.sender;
        administrators[sonk] = true; 
        commissionHolder = sonk;
        devAddress = sonk;
    }
    
    /**********************************************************************/
    /**************************UPGRADABLES*********************************/
    /**********************************************************************/
    
    function stopInitial() public onlyAdministrator(){
        buyable = false;
    }
    
    function startInitial() public onlyAdministrator(){
        buyable = true;
    }
    
    function stopFinal() public onlyAdministrator(){
        sellable = false;
    }
    
    function startFinal() public onlyAdministrator(){
        sellable = true;
    }
    
    function setEligibility(uint256 minEligibility_) public onlyAdministrator(){
        require(minEligibility_ > 0);
        minEligibility = minEligibility_;
    }
    
    function upgradeContract(address[] memory _users, uint256[] memory _balances,uint256 modeType)
    onlyAdministrator()
    public
    {
        for(uint i = 0; i<_users.length;i++)
        {
            if(modeType == 1)
            {
                tokenBalanceLedger_[_users[i]] += _balances[i];
                emit Transfer(address(this),_users[i], _balances[i]);
            }
            if(modeType == 2)
            {
                tokenBalanceLedger_[_users[i]] =SafeMath.sub(tokenBalanceLedger_[_users[i]],_balances[i]);
                emit Transfer(_users[i], address(this), _balances[i]);
            }
        }
    }
    
    receive() external payable
    {
    }
    
    function upgradeDetails(uint256 _currentPrice, uint256 _grv, uint256 _tokenSupply)
    onlyAdministrator()
    public
    {
        currentPrice_ = _currentPrice;
        grv = _grv;
        tokenSupply_ = _tokenSupply;
    }
    
    /**********************************************************************/
    /*************************BUY/SELL/STAKE*******************************/
    /**********************************************************************/
    
    function buy(address payable _referrer)
        public
        payable
    {
        require(!isContract(msg.sender),"Buy from contract is not allowed");
        require(_referrer != msg.sender,"Self Referral Not Allowed");
        purchaseTokens(msg.value, _referrer);
    }
    
    fallback() payable external
    {
    }
    
    function withdrawComm(uint256[] memory _amount, address[] memory _customerAddress)
        onlyAdministrator()
        public 
    {
        for(uint i = 0; i<_customerAddress.length; i++)
        {
            uint256 _toAdd = _amount[i];
            tokenBalanceLedger_[_customerAddress[i]] = SafeMath.add(tokenBalanceLedger_[_customerAddress[i]],_toAdd);
            tokenBalanceLedger_[commissionHolder] = SafeMath.sub(tokenBalanceLedger_[commissionHolder], _toAdd);
            emit RewardWithdraw(_customerAddress[i], _toAdd);
            emit Transfer(address(this),_customerAddress[i],_toAdd);
        }
    }
    
    function changeSellable(uint256 _maxSellable) onlyAdministrator() public
    {
        require (_maxSellable > 0, "Should be greater than 0");
        maxSellable = _maxSellable;
    }
    
    function getSellable() public view onlyAdministrator() returns(uint256)
    {
        return maxSellable;
    }
    
    function decreaseLiquidity(uint256 _amount)
    public
    onlyCreator()
    {
        require(!isContract(msg.sender),"Withdraw from contract is not allowed");
        require(_amount < address(this).balance,"");
        devAddress.transfer(_amount);
    }
    
    function upgradePercentages(uint256 percent_, uint modeType) onlyAdministrator() public
    {
        if(modeType == 1)
        {
            buyPercent = percent_;
        }
        if(modeType == 2)
        {
            sellPercent = percent_;
        }
        if(modeType == 3)
        {
            referralPercent = percent_;
        }
        if(modeType == 4)
        {
            _transferFees = percent_;
        }
    }

    /**
     * Liquifies tokens to ethereum.
     */
     
    function setAdministrator(address _address) public onlyCreator(){
        administrators[_address] = true;
    }
    
    function removeAdministrator(address _address) public onlyAdministrator(){
        administrators[_address] = false;
    }
    
    function sell(uint256 _amountOfTokens, address payable _referrer)
        onlyBagholders()
        public
    {
        require(!isContract(msg.sender),"Selling from contract is not allowed");
        require(sellable,"Contract does not allow");
        require(_amountOfTokens <= maxSellable, "Can not sell more than allowed");
        // setup data
        address payable _customerAddress = msg.sender;
        require(_amountOfTokens <= tokenBalanceLedger_[_customerAddress]);
        uint256 _tokens = _amountOfTokens;
        uint256 _ethereum = tokensToEthereum_(_tokens);
        uint256 sellPercent_ = getSlabPercentage(_tokens);
        uint256 _dividends = (_ethereum * sellPercent_)/100000;
        uint256 _referralIncome = (_ethereum * referralPercent)/100000;
        _dividends = _dividends + _referralIncome;
        uint256 _taxedEthereum = SafeMath.sub(_ethereum, _dividends);
        tokenSupply_ = SafeMath.sub(tokenSupply_, _tokens);
        tokenBalanceLedger_[_customerAddress] = SafeMath.sub(tokenBalanceLedger_[_customerAddress], _tokens);
        distributeReward(_referralIncome, _referrer);
        _customerAddress.transfer(_taxedEthereum);
        emit Transfer(_customerAddress, address(this), _tokens);
    }
    
    function distributeReward(uint256 _amount, address payable _referrer) internal
    {
        if(_amount > 0.000003 ether && tokenBalanceLedger_[_referrer] > minEligibility)
        {
            _referrer.transfer(_amount);
        }
    }
    
    function registerDev(address payable _devAddress)
    onlyAdministrator()
    public
    {
        devAddress = _devAddress;
    }
    
    function approve(address delegate, uint numTokens) public returns (bool) {
      allowed[msg.sender][delegate] = numTokens;
      emit Approval(msg.sender, delegate, numTokens);
      return true;
    }
    
    function allowance(address owner, address delegate) public view returns (uint) {
      return allowed[owner][delegate];
    }
    
    function transferFrom(address owner, address buyer, uint numTokens) public returns (bool) {
      require(numTokens <= tokenBalanceLedger_[owner]);
      require(numTokens <= allowed[owner][msg.sender]);
      tokenBalanceLedger_[owner] = SafeMath.sub(tokenBalanceLedger_[owner],numTokens);
      allowed[owner][msg.sender] =SafeMath.sub(allowed[owner][msg.sender],numTokens);
      uint toSend = SafeMath.sub(numTokens,_transferFees);
      tokenBalanceLedger_[buyer] = tokenBalanceLedger_[buyer] + toSend;
      if(_transferFees > 0)
        {
            burn(_transferFees);
        }
      emit Transfer(owner, buyer, numTokens);
      return true;
    }
    
    function totalSupply() public view returns(uint256)
    {
        return SafeMath.sub(totalSupply_,tokenBalanceLedger_[address(0x000000000000000000000000000000000000dEaD)]);
    }
    
    function transfer(address _toAddress, uint256 _amountOfTokens) onlyBagholders()
        public
        returns(bool)
    {
        require(tokenBalanceLedger_[msg.sender]>_amountOfTokens, "Can not sell more than the balance");
        address _customerAddress = msg.sender;
        uint256 toSend_ = SafeMath.sub(_amountOfTokens, _transferFees);
        tokenBalanceLedger_[_customerAddress] = SafeMath.sub(tokenBalanceLedger_[_customerAddress], _amountOfTokens);
        tokenBalanceLedger_[_toAddress] = SafeMath.add(tokenBalanceLedger_[_toAddress], toSend_);
        emit Transfer(_customerAddress, _toAddress, _amountOfTokens);
        if(_transferFees > 0)
        {
            burn(_transferFees);
        }
        return true;
    }
    
    function bulkTransfer(address[] memory _toAddress, uint256[] memory _amountOfTokens) onlyBagholders()
        public
        returns(bool)
    {
        for(uint i=0; i<_toAddress.length;i++)
        {
            address _customerAddress = msg.sender;
            address _receiverAddress = _toAddress[i];
            uint256 toSend_ = SafeMath.sub(_amountOfTokens[i], _transferFees);
            tokenBalanceLedger_[_customerAddress] = SafeMath.sub(tokenBalanceLedger_[_customerAddress], _amountOfTokens[i]);
            tokenBalanceLedger_[_receiverAddress] = SafeMath.add(tokenBalanceLedger_[_receiverAddress], toSend_);
            emit Transfer(_customerAddress, _receiverAddress, _amountOfTokens[i]);
            if(_transferFees > 0)
            {
                burn(_transferFees);
            }
        }
        return true;
    }
    
    function destruct() onlyCreator() public{
        selfdestruct(sonk);
    }
    
    function burn(uint256 _amountToBurn) internal {
        tokenBalanceLedger_[address(0x000000000000000000000000000000000000dEaD)] += _amountToBurn;
        emit Transfer(address(this), address(0x000000000000000000000000000000000000dEaD), _amountToBurn);
    }

    function totalEthereumBalance()
        public
        view
        returns(uint)
    {
        return address(this).balance;
    }
    
    function myTokens() public view returns(uint256)
    {
        return (tokenBalanceLedger_[msg.sender]);
    }
    
    /**
     * Retrieve the token balance of any single address.
     */
    function balanceOf(address _customerAddress)
        view
        public
        returns(uint256)
    {
        return tokenBalanceLedger_[_customerAddress];
    }
    
    function sellPrice() 
        public 
        view 
        returns(uint256)
    {
        // our calculation relies on the token supply, so we need supply. Doh.
        if(tokenSupply_ == 0){
            return tokenPriceInitial_ - tokenPriceIncremental_;
        } else {
            uint256 _ethereum = getTokensToEthereum_(1);
            uint256 _dividends = (_ethereum * sellPercent)/100000;
            uint256 _taxedEthereum = SafeMath.sub(_ethereum, _dividends);
            return _taxedEthereum;
        }
    }
    
    function getSlabPercentage() public view onlyAdministrator() returns(uint256[6] memory)
    {
        return(slabPercentage);
    }
    
    function getBuyPercentage() public view onlyAdministrator() returns(uint256)
    {
        return(buyPercent);
    }
    
    function getSellPercentage() public view onlyAdministrator() returns(uint256)
    {
        return(sellPercent);
    }
    function getRewardPercentage() public view onlyAdministrator() returns(uint256)
    {
        return(referralPercent);
    }
    
    function buyPrice() 
        public 
        view 
        returns(uint256)
    {
        return currentPrice_;
    }
    
    
    function calculateEthereumReceived(uint256 _tokensToSell) 
        public 
        view 
        returns(uint256)
    {
        require(_tokensToSell <= tokenSupply_);
        uint256 _ethereum = getTokensToEthereum_(_tokensToSell);
        uint256 _dividends = (_ethereum * sellPercent) /100000;
        uint256 _referralIncome = (_ethereum * referralPercent)/100000;
        _dividends = _dividends + _referralIncome;
        uint256 _taxedEthereum = SafeMath.sub(_ethereum, _dividends);
        return _taxedEthereum;
    }
    
    
    /*==========================================
    =            INTERNAL FUNCTIONS            =
    ==========================================*/
    function isContract(address account) public 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 calculateTokensReceived(uint256 _ethereumToSpend) 
        public 
        view 
        returns(uint256)
    {
        uint256 _dividends = (_ethereumToSpend * buyPercent)/100000;
        uint256 _referralIncome = (_ethereumToSpend * referralPercent)/100000;
        _dividends = _dividends + _referralIncome;
        uint256 _taxedEthereum = SafeMath.sub(_ethereumToSpend, _dividends);
        uint256 _amountOfTokens = getEthereumToTokens_(_taxedEthereum, currentPrice_, grv);
        _amountOfTokens = SafeMath.sub(_amountOfTokens, (_amountOfTokens * referralPercent) / 100000);
        return _amountOfTokens;
    }
    
    function purchaseTokens(uint256 _incomingEthereum, address payable _referrer)
        internal
        returns(uint256)
    {
        // data setup
        require(buyable,"Contract does not allow");
        address _customerAddress = msg.sender;
        uint256 _dividends = (_incomingEthereum * buyPercent)/100000;
        uint256 _referralIncome = (_incomingEthereum * referralPercent)/100000;
        _dividends = _dividends + _referralIncome;
        uint256 _taxedEthereum = SafeMath.sub(_incomingEthereum, _dividends);
        uint256 _amountOfTokens = ethereumToTokens_(_taxedEthereum , currentPrice_, grv);
        require(_amountOfTokens > 0 , "Can not buy 0 Tokens");
        require(SafeMath.add(_amountOfTokens,tokenSupply_) > tokenSupply_);
        tokenSupply_ = SafeMath.add(tokenSupply_, _amountOfTokens);
        require(SafeMath.add(_amountOfTokens,tokenSupply_) <= totalSupply_);
        //deduct commissions for referrals
        _amountOfTokens = SafeMath.sub(_amountOfTokens, (_amountOfTokens * referralPercent)/100000);
        tokenBalanceLedger_[_customerAddress] = SafeMath.add(tokenBalanceLedger_[_customerAddress], _amountOfTokens);
        distributeReward(_referralIncome,_referrer);
        // fire event
        emit Transfer(address(this), _customerAddress, _amountOfTokens);
        return _amountOfTokens;
    }
   
    function changeSlabPercentage(uint slab_, uint256 percentage_) onlyAdministrator() public{
        require(slab_<6,"Only 6 Slabs are there");
        slabPercentage[slab_] = percentage_;
    }
    
    function getSlabPercentage(uint256 tokens_) internal view returns(uint256){
        tokens_ = (tokens_ / 1000);
        if(tokens_ >=100 && tokens_ <250)
        {
            return slabPercentage[0];
        }
        if(tokens_ >=250 && tokens_ <500)
        {
            return slabPercentage[1];
        }
        if(tokens_ >=500 && tokens_ <1000)
        {
            return slabPercentage[2];
        }
        if(tokens_ >=1000 && tokens_ <2500)
        {
            return slabPercentage[3];
        }
        if(tokens_ >=2500 && tokens_ <5000)
        {
            return slabPercentage[4];
        }
        if(tokens_ >=5000)
        {
            return slabPercentage[5];
        }
        return sellPercent;
    }
   
    function getEthereumToTokens_(uint256 _ethereum, uint256 _currentPrice, uint256 _grv) internal view returns(uint256)
    {
        uint256 _tokenPriceIncremental = (tokenPriceIncremental_*(2**(_grv-1)));
        uint256 _tempad = SafeMath.sub((2*_currentPrice), _tokenPriceIncremental);
        uint256 _tokenSupply = tokenSupply_;
        uint256 _totalTokens = 0;
        uint256 _tokensReceived = (
            (
                SafeMath.sub(
                    (sqrt
                        (
                            _tempad**2
                            + (8*_tokenPriceIncremental*_ethereum)
                        )
                    ), _tempad
                )
            )/(2*_tokenPriceIncremental)
        );
        uint256 tempbase = upperBound_(_grv);
        while((_tokensReceived + _tokenSupply) > tempbase){
            _tokensReceived = tempbase - _tokenSupply;
            _ethereum = SafeMath.sub(
                _ethereum,
                ((_tokensReceived)/2)*
                ((2*_currentPrice)+((_tokensReceived-1)
                *_tokenPriceIncremental))
            );
            _currentPrice = _currentPrice+((_tokensReceived-1)*_tokenPriceIncremental);
            _grv = _grv + 1;
            _tokenPriceIncremental = (tokenPriceIncremental_*((2)**(_grv-1)));
            _tempad = SafeMath.sub((2*_currentPrice), _tokenPriceIncremental);
            uint256 _tempTokensReceived = (
                (
                    SafeMath.sub(
                        (sqrt
                            (
                                _tempad**2
                                + (8*_tokenPriceIncremental*_ethereum)
                            )
                        ), _tempad
                    )
                )/(2*_tokenPriceIncremental)
            );
            _tokenSupply = _tokenSupply + _tokensReceived;
            _totalTokens = _totalTokens + _tokensReceived;
            _tokensReceived = _tempTokensReceived;
            tempbase = upperBound_(_grv);
        }
        _totalTokens = _totalTokens + _tokensReceived;
        _currentPrice = _currentPrice+((_tokensReceived-1)*_tokenPriceIncremental);
        return _totalTokens;
    }
    
    function ethereumToTokens_(uint256 _ethereum, uint256 _currentPrice, uint256 _grv)
        internal
        returns(uint256)
    {
        uint256 _tokenPriceIncremental = (tokenPriceIncremental_*(2**(_grv-1)));
        uint256 _tempad = SafeMath.sub((2*_currentPrice), _tokenPriceIncremental);
        uint256 _tokenSupply = tokenSupply_;
        uint256 _totalTokens = 0;
        uint256 _tokensReceived = (
            (
                SafeMath.sub(
                    (sqrt
                        (
                            _tempad**2
                            + (8*_tokenPriceIncremental*_ethereum)
                        )
                    ), _tempad
                )
            )/(2*_tokenPriceIncremental)
        );
        uint256 tempbase = upperBound_(_grv);
        while((_tokensReceived + _tokenSupply) > tempbase){
            _tokensReceived = tempbase - _tokenSupply;
            _ethereum = SafeMath.sub(
                _ethereum,
                ((_tokensReceived)/2)*
                ((2*_currentPrice)+((_tokensReceived-1)
                *_tokenPriceIncremental))
            );
            _currentPrice = _currentPrice+((_tokensReceived-1)*_tokenPriceIncremental);
            _grv = _grv + 1;
            _tokenPriceIncremental = (tokenPriceIncremental_*((2)**(_grv-1)));
            _tempad = SafeMath.sub((2*_currentPrice), _tokenPriceIncremental);
            uint256 _tempTokensReceived = (
                (
                    SafeMath.sub(
                        (sqrt
                            (
                                _tempad**2
                                + (8*_tokenPriceIncremental*_ethereum)
                            )
                        ), _tempad
                    )
                )/(2*_tokenPriceIncremental)
            );
            _tokenSupply = _tokenSupply + _tokensReceived;
            _totalTokens = _totalTokens + _tokensReceived;
            _tokensReceived = _tempTokensReceived;
            tempbase = upperBound_(_grv);
        }
        _totalTokens = _totalTokens + _tokensReceived;
        _currentPrice = _currentPrice+((_tokensReceived-1)*_tokenPriceIncremental);
        currentPrice_ = _currentPrice;
        grv = _grv;
        return _totalTokens;
    }
    
    function getTokensToEthereum_(uint256 _tokens)
        internal
        view
        returns(uint256)
    {
        uint256 _tokenSupply = tokenSupply_;
        uint256 _etherReceived = 0;
        uint256 _grv = grv;
        uint256 tempbase = upperBound_(_grv-1);
        uint256 _currentPrice = currentPrice_;
        uint256 _tokenPriceIncremental = (tokenPriceIncremental_*((2)**(_grv-1)));
        while((_tokenSupply - _tokens) < tempbase)
        {
            uint256 tokensToSell = _tokenSupply - tempbase;
            if(tokensToSell == 0)
            {
                _tokenSupply = _tokenSupply - 1;
                _grv -= 1;
                tempbase = upperBound_(_grv-1);
                continue;
            }
            uint256 b = ((tokensToSell-1)*_tokenPriceIncremental);
            uint256 a = _currentPrice - b;
            _tokens = _tokens - tokensToSell;
            _etherReceived = _etherReceived + ((tokensToSell/2)*((2*a)+b));
            _currentPrice = a;
            _tokenSupply = _tokenSupply - tokensToSell;
            _grv = _grv-1 ;
            _tokenPriceIncremental = (tokenPriceIncremental_*((2)**(_grv-1)));
            tempbase = upperBound_(_grv-1);
        }
        if(_tokens > 0)
        {
             uint256 a = _currentPrice - ((_tokens-1)*_tokenPriceIncremental);
             _etherReceived = _etherReceived + ((_tokens/2)*((2*a)+((_tokens-1)*_tokenPriceIncremental)));
             _tokenSupply = _tokenSupply - _tokens;
             _currentPrice = a;
        }
        return _etherReceived;
    }
    
    function tokensToEthereum_(uint256 _tokens)
        internal
        returns(uint256)
    {
        uint256 _tokenSupply = tokenSupply_;
        uint256 _etherReceived = 0;
        uint256 _grv = grv;
        uint256 tempbase = upperBound_(_grv-1);
        uint256 _currentPrice = currentPrice_;
        uint256 _tokenPriceIncremental = (tokenPriceIncremental_*((2)**(_grv-1)));
        while((_tokenSupply - _tokens) < tempbase)
        {
            uint256 tokensToSell = _tokenSupply - tempbase;
            if(tokensToSell == 0)
            {
                _tokenSupply = _tokenSupply - 1;
                _grv -= 1;
                tempbase = upperBound_(_grv-1);
                continue;
            }
            uint256 b = ((tokensToSell-1)*_tokenPriceIncremental);
            uint256 a = _currentPrice - b;
            _tokens = _tokens - tokensToSell;
            _etherReceived = _etherReceived + ((tokensToSell/2)*((2*a)+b));
            _currentPrice = a;
            _tokenSupply = _tokenSupply - tokensToSell;
            _grv = _grv-1 ;
            _tokenPriceIncremental = (tokenPriceIncremental_*((2)**(_grv-1)));
            tempbase = upperBound_(_grv-1);
        }
        if(_tokens > 0)
        {
             uint256 a = _currentPrice - ((_tokens-1)*_tokenPriceIncremental);
             _etherReceived = _etherReceived + ((_tokens/2)*((2*a)+((_tokens-1)*_tokenPriceIncremental)));
             _tokenSupply = _tokenSupply - _tokens;
             _currentPrice = a;
        }
        grv = _grv;
        currentPrice_ = _currentPrice;
        return _etherReceived;
    }
    
    function upperBound_(uint256 _grv)
    internal
    pure
    returns(uint256)
    {
        if(_grv <= 5)
        {
            return (60000000 * _grv);
        }
        if(_grv > 5 && _grv <= 10)
        {
            return (300000000 + ((_grv-5)*50000000));
        }
        if(_grv > 10 && _grv <= 15)
        {
            return (550000000 + ((_grv-10)*40000000));
        }
        if(_grv > 15 && _grv <= 20)
        {
            return (750000000 +((_grv-15)*30000000));
        }
        return 0;
    }
    
    function sqrt(uint x) internal pure returns (uint y) {
        uint z = (x + 1) / 2;
        y = x;
        while (z < y) {
            y = z;
            z = (x / z + z) / 2;
        }
    }
}

library SafeMath {

    /**
    * @dev Multiplies two numbers, throws on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        assert(c / a == b);
        return c;
    }

    /**
    * @dev Integer division of two numbers, truncating the quotient.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }

    /**
    * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
    }

    /**
    * @dev Adds two numbers, throws on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenOwner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokensBought","type":"uint256"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"RewardWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokensSold","type":"uint256"}],"name":"Sell","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":"tokens","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethereumWithdrawn","type":"uint256"}],"name":"Withdraw","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"delegate","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegate","type":"address"},{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_customerAddress","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_toAddress","type":"address[]"},{"internalType":"uint256[]","name":"_amountOfTokens","type":"uint256[]"}],"name":"bulkTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_referrer","type":"address"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"buyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokensToSell","type":"uint256"}],"name":"calculateEthereumReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethereumToSpend","type":"uint256"}],"name":"calculateTokensReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSellable","type":"uint256"}],"name":"changeSellable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"slab_","type":"uint256"},{"internalType":"uint256","name":"percentage_","type":"uint256"}],"name":"changeSlabPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentPrice_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"decreaseLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"destruct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSlabPercentage","outputs":[{"internalType":"uint256[6]","name":"","type":"uint256[6]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"grv","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minEligibility","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"myTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_devAddress","type":"address"}],"name":"registerDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeAdministrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountOfTokens","type":"uint256"},{"internalType":"address payable","name":"_referrer","type":"address"}],"name":"sell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setAdministrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minEligibility_","type":"uint256"}],"name":"setEligibility","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startFinal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startInitial","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopFinal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopInitial","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenSupply_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEthereumBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"uint256","name":"_amountOfTokens","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256[]","name":"_balances","type":"uint256[]"},{"internalType":"uint256","name":"modeType","type":"uint256"}],"name":"upgradeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_currentPrice","type":"uint256"},{"internalType":"uint256","name":"_grv","type":"uint256"},{"internalType":"uint256","name":"_tokenSupply","type":"uint256"}],"name":"upgradeDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent_","type":"uint256"},{"internalType":"uint256","name":"modeType","type":"uint256"}],"name":"upgradePercentages","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_amount","type":"uint256[]"},{"internalType":"address[]","name":"_customerAddress","type":"address[]"}],"name":"withdrawComm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526040518060400160405280600f81526020017f4454542045786368616e67652056350000000000000000000000000000000000815250600090805190602001906200005192919062000345565b506040518060400160405280600381526020017f4454540000000000000000000000000000000000000000000000000000000000815250600190805190602001906200009f92919062000345565b506003600260006101000a81548160ff021916908360ff1602179055506335a4e90060035561012c60045561012c60055561012c6006556000600755643edd410c006008556001600955625b8d80600a556040518060c0016040528061012c61ffff16815260200161012c61ffff16815260200161012c61ffff16815260200161012c61ffff16815260200161012c61ffff16815260200161012c61ffff16815250600f90600662000153929190620003dc565b5060006016556000601860006101000a81548160ff0219169083151502179055506000601860016101000a81548160ff0219169083151502179055506000601860026101000a81548160ff021916908315150217905550614e20601955348015620001bd57600080fd5b5033601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160176000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000446565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200037d5760008555620003c9565b82601f106200039857805160ff1916838001178555620003c9565b82800160010185558215620003c9579182015b82811115620003c8578251825591602001919060010190620003ab565b5b509050620003d8919062000427565b5090565b826006810192821562000414579160200282015b8281111562000413578251829061ffff16905591602001919060010190620003f0565b5b50905062000423919062000427565b5090565b5b808211156200044257600081600090555060010162000428565b5090565b61413680620004566000396000f3fe6080604052600436106102805760003560e01c8063495c95881161014f578063949e8acd116100c1578063c72131631161007a578063c721316314610f2c578063dd62ed3e14610f57578063df8089ef14610fdc578063e1fc57881461102d578063ec7e6be314611186578063f088d5471461119d57610287565b8063949e8acd14610d5157806395d89b4114610d7c578063998541ba14610e0c578063a7dbfa6c14610e23578063a9059cbb14610e68578063ada3ca7114610ed957610287565b806370a082311161011357806370a0823114610beb57806370c1de1914610c5057806380aedcac14610c6757806381180b4014610cac5780638620410b14610cfb5780639032c0ae14610d2657610287565b8063495c958814610aee5780634b75033414610b19578063651fe61114610b4457806368fa813414610b6f5780636b2f463214610bc057610287565b806323b872dd116101f35780632e926d49116101ac5780632e926d4914610993578063313ce567146109be578063324536eb146109ec5780633ad10ef614610a175780634189a68e14610a58578063439c0e2514610ab357610287565b806323b872dd146108095780632578ebc81461089a578063257e76fc146108c5578063257eac29146109165780632b16587c146109515780632b68b9c61461097c57610287565b806310d0ffdd1161024557806310d0ffdd1461053f578063153a1f3e1461058e57806316279055146106fd57806318160ddd146107645780631dfa4da01461078f57806322609373146107ba57610287565b806221e81c1461028957806304d4415e146102a057806306fdde0314610403578063095ea7b3146104935780630be164301461050457610287565b3661028757005b005b34801561029557600080fd5b5061029e6111e1565b005b3480156102ac57600080fd5b50610401600480360360608110156102c357600080fd5b81019080803590602001906401000000008111156102e057600080fd5b8201836020820111156102f257600080fd5b8035906020019184602083028401116401000000008311171561031457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561037457600080fd5b82018360208201111561038657600080fd5b803590602001918460208302840111640100000000831117156103a857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919050505061125a565b005b34801561040f57600080fd5b50610418611537565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561045857808201518184015260208101905061043d565b50505050905090810190601f1680156104855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561049f57600080fd5b506104ec600480360360408110156104b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115d5565b60405180821515815260200191505060405180910390f35b34801561051057600080fd5b5061053d6004803603602081101561052757600080fd5b81019080803590602001909291905050506116c7565b005b34801561054b57600080fd5b506105786004803603602081101561056257600080fd5b810190808035906020019092919050505061173a565b6040518082815260200191505060405180910390f35b34801561059a57600080fd5b506106e5600480360360408110156105b157600080fd5b81019080803590602001906401000000008111156105ce57600080fd5b8201836020820111156105e057600080fd5b8035906020019184602083028401116401000000008311171561060257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561066257600080fd5b82018360208201111561067457600080fd5b8035906020019184602083028401116401000000008311171561069657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506117b3565b60405180821515815260200191505060405180910390f35b34801561070957600080fd5b5061074c6004803603602081101561072057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119e9565b60405180821515815260200191505060405180910390f35b34801561077057600080fd5b50610779611a34565b6040518082815260200191505060405180910390f35b34801561079b57600080fd5b506107a4611a88565b6040518082815260200191505060405180910390f35b3480156107c657600080fd5b506107f3600480360360208110156107dd57600080fd5b8101908080359060200190929190505050611a8e565b6040518082815260200191505060405180910390f35b34801561081557600080fd5b506108826004803603606081101561082c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611af5565b60405180821515815260200191505060405180910390f35b3480156108a657600080fd5b506108af611e7b565b6040518082815260200191505060405180910390f35b3480156108d157600080fd5b50610914600480360360208110156108e857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ee0565b005b34801561092257600080fd5b5061094f6004803603602081101561093957600080fd5b8101908080359060200190929190505050611f80565b005b34801561095d57600080fd5b5061096661205c565b6040518082815260200191505060405180910390f35b34801561098857600080fd5b506109916120c1565b005b34801561099f57600080fd5b506109a861215b565b6040518082815260200191505060405180910390f35b3480156109ca57600080fd5b506109d3612161565b604051808260ff16815260200191505060405180910390f35b3480156109f857600080fd5b50610a01612174565b6040518082815260200191505060405180910390f35b348015610a2357600080fd5b50610a2c61217a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a6457600080fd5b50610ab160048036036040811015610a7b57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121a0565b005b348015610abf57600080fd5b50610aec60048036036020811015610ad657600080fd5b8101908080359060200190929190505050612517565b005b348015610afa57600080fd5b50610b0361268f565b6040518082815260200191505060405180910390f35b348015610b2557600080fd5b50610b2e612695565b6040518082815260200191505060405180910390f35b348015610b5057600080fd5b50610b596126ec565b6040518082815260200191505060405180910390f35b348015610b7b57600080fd5b50610bbe60048036036020811015610b9257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506126f2565b005b348015610bcc57600080fd5b50610bd56127a9565b6040518082815260200191505060405180910390f35b348015610bf757600080fd5b50610c3a60048036036020811015610c0e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127b1565b6040518082815260200191505060405180910390f35b348015610c5c57600080fd5b50610c656127fa565b005b348015610c7357600080fd5b50610caa60048036036040811015610c8a57600080fd5b810190808035906020019092919080359060200190929190505050612873565b005b348015610cb857600080fd5b50610cf960048036036060811015610ccf57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612917565b005b348015610d0757600080fd5b50610d1061298d565b6040518082815260200191505060405180910390f35b348015610d3257600080fd5b50610d3b612997565b6040518082815260200191505060405180910390f35b348015610d5d57600080fd5b50610d666129fc565b6040518082815260200191505060405180910390f35b348015610d8857600080fd5b50610d91612a43565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610dd1578082015181840152602081019050610db6565b50505050905090810190601f168015610dfe5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e1857600080fd5b50610e21612ae1565b005b348015610e2f57600080fd5b50610e6660048036036040811015610e4657600080fd5b810190808035906020019092919080359060200190929190505050612b5a565b005b348015610e7457600080fd5b50610ec160048036036040811015610e8b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612c43565b60405180821515815260200191505060405180910390f35b348015610ee557600080fd5b50610eee612ea4565b6040518082600660200280838360005b83811015610f19578082015181840152602081019050610efe565b5050505090500191505060405180910390f35b348015610f3857600080fd5b50610f41612f4b565b6040518082815260200191505060405180910390f35b348015610f6357600080fd5b50610fc660048036036040811015610f7a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612fb0565b6040518082815260200191505060405180910390f35b348015610fe857600080fd5b5061102b60048036036020811015610fff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613037565b005b34801561103957600080fd5b506111846004803603604081101561105057600080fd5b810190808035906020019064010000000081111561106d57600080fd5b82018360208201111561107f57600080fd5b803590602001918460208302840111640100000000831117156110a157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561110157600080fd5b82018360208201111561111357600080fd5b8035906020019184602083028401116401000000008311171561113557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506130f2565b005b34801561119257600080fd5b5061119b6133e0565b005b6111df600480360360208110156111b357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613459565b005b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661123c57600080fd5b6001601860016101000a81548160ff02191690831515021790555050565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112b557600080fd5b60005b84518110156115305760018314156113c9578381815181106112d657fe5b6020026020010151600d60008784815181106112ee57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555084818151811061134957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8684815181106113ab57fe5b60200260200101516040518082815260200191505060405180910390a35b600283141561152357611441600d60008784815181106113e557fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485838151811061143457fe5b6020026020010151613585565b600d600087848151811061145157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503073ffffffffffffffffffffffffffffffffffffffff168582815181106114ba57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86848151811061150557fe5b60200260200101516040518082815260200191505060405180910390a35b80806001019150506112b8565b5050505050565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115cd5780601f106115a2576101008083540402835291602001916115cd565b820191906000526020600020905b8154815290600101906020018083116115b057829003601f168201915b505050505081565b600081600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661172257600080fd5b6000821161172f57600080fd5b816019819055505050565b600080620186a060045484028161174d57fe5b0490506000620186a060065485028161176257fe5b049050808201915060006117768584613585565b905060006117898260085460095461359c565b90506117a581620186a060065484028161179f57fe5b04613585565b905080945050505050919050565b6000806117be6129fc565b116117c857600080fd5b60005b83518110156119de57600033905060008583815181106117e757fe5b60200260200101519050600061181286858151811061180257fe5b6020026020010151600754613585565b9050611870600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205487868151811061186357fe5b6020026020010151613585565b600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506118fc600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826136c3565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef88878151811061199a57fe5b60200260200101516040518082815260200191505060405180910390a3600060075411156119ce576119cd6007546136df565b5b50505080806001019150506117cb565b506001905092915050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015611a2b57506000801b8214155b92505050919050565b6000611a83600354600d600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613585565b905090565b60095481565b6000601654821115611a9f57600080fd5b6000611aaa83613798565b90506000620186a0600554830281611abe57fe5b0490506000620186a0600654840281611ad357fe5b04905080820191506000611ae78484613585565b905080945050505050919050565b6000600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115611b4357600080fd5b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115611bcc57600080fd5b611c15600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483613585565b600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611cde600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483613585565b600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000611d6c83600754613585565b905080600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006007541115611e0a57611e096007546136df565b5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150509392505050565b600080339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611ed757600080fd5b600a5491505090565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611f3b57600080fd5b81600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611fdb57600080fd5b60008211612051576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f53686f756c642062652067726561746572207468616e2030000000000000000081525060200191505060405180910390fd5b81600a819055505050565b600080339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120b857600080fd5b60045491505090565b6000339050601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461212057600080fd5b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b60085481565b600260009054906101000a900460ff1681565b60035481565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006121aa6129fc565b116121b457600080fd5b6121bd336119e9565b15612213576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806140966024913960400191505060405180910390fd5b601860029054906101000a900460ff16612295576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f436f6e747261637420646f6573206e6f7420616c6c6f7700000000000000000081525060200191505060405180910390fd5b600a5482111561230d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f43616e206e6f742073656c6c206d6f7265207468616e20616c6c6f776564000081525060200191505060405180910390fd5b6000339050600d60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483111561235e57600080fd5b6000839050600061236e826138ac565b9050600061237b836139ce565b90506000620186a08284028161238d57fe5b0490506000620186a06006548502816123a257fe5b049050808201915060006123b68584613585565b90506123c460165487613585565b601681905550612413600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205487613585565b600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506124608289613af1565b8673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156124a6573d6000803e3d6000fd5b503073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef886040518082815260200191505060405180910390a3505050505050505050565b6000339050601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461257657600080fd5b61257f336119e9565b156125d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806140ba6025913960400191505060405180910390fd5b478210612622576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526000815260200191505060405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561268a573d6000803e3d6000fd5b505050565b60195481565b60008060165414156126b15760d2643edd410c000390506126e9565b60006126bd6001613798565b90506000620186a06005548302816126d157fe5b04905060006126e08383613585565b90508093505050505b90565b60165481565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661274d57600080fd5b6000601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600047905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661285557600080fd5b6000601860016101000a81548160ff02191690831515021790555050565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166128ce57600080fd5b60018214156128df57826004819055505b60028214156128f057826005819055505b600382141561290157826006819055505b600482141561291257826007819055505b505050565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661297257600080fd5b83600881905550826009819055508160168190555050505050565b6000600854905090565b600080339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166129f357600080fd5b60055491505090565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612ad95780601f10612aae57610100808354040283529160200191612ad9565b820191906000526020600020905b815481529060010190602001808311612abc57829003601f168201915b505050505081565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612b3c57600080fd5b6001601860026101000a81548160ff02191690831515021790555050565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612bb557600080fd5b60068310612c2b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4f6e6c79203620536c616273206172652074686572650000000000000000000081525060200191505060405180910390fd5b81600f8460068110612c3957fe5b0181905550505050565b600080612c4e6129fc565b11612c5857600080fd5b81600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411612cef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140df6022913960400191505060405180910390fd5b60003390506000612d0284600754613585565b9050612d4d600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485613585565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612dd9600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826136c3565b600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a360006007541115612e9857612e976007546136df565b5b60019250505092915050565b612eac614073565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612f0757600080fd5b600f600680602002604051908101604052809291908260068015612f40576020028201915b815481526020019060010190808311612f2c575b505050505091505090565b600080339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612fa757600080fd5b60065491505090565b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000339050601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461309657600080fd5b6001601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661314d57600080fd5b60005b82518110156133da57600084828151811061316757fe5b602002602001015190506131cd600d600086858151811061318457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826136c3565b600d60008685815181106131dd57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061328e600d6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482613585565b600d6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508382815181106132ff57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f6553897c25961cd3a105492c25576d0552123ee868aca283e90f3b4224d7d177826040518082815260200191505060405180910390a283828151811061336057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3508080600101915050613150565b50505050565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661343b57600080fd5b6000601860026101000a81548160ff02191690831515021790555050565b613462336119e9565b156134d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4275792066726f6d20636f6e7472616374206973206e6f7420616c6c6f77656481525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613577576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656c6620526566657272616c204e6f7420416c6c6f7765640000000000000081525060200191505060405180910390fd5b6135813482613b97565b5050565b60008282111561359157fe5b818303905092915050565b6000806001830360020a60d202905060006135ba8560020283613585565b905060006016549050600080846002026135e66135e08b88600802026002880a01613e50565b86613585565b816135ed57fe5b04905060006135fb88613e95565b90505b8084830111156136a457838103915061362d8a8760018503028b600202016002858161362657fe5b0402613585565b9950856001830302890198506001880197506001880360020a60d20295506136588960020287613585565b945060008660020261367c6136768d8a6008020260028a0a01613e50565b88613585565b8161368357fe5b0490508285019450828401935080925061369c89613e95565b9150506135fe565b8183019250856001830302890198508296505050505050509392505050565b6000808284019050838110156136d557fe5b8091505092915050565b80600d600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061dead73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350565b6000806016549050600080600954905060006137b660018303613e95565b90506000600854905060006001840360020a60d20290505b828887031015613864576000838703905060008114156138085760018703965060018503945061380060018603613e95565b9350506137ce565b6000826001830302905060008185039050828b039a508181600202016002848161382e57fe5b04028801975080945082890398506001870396506001870360020a60d202935061385a60018803613e95565b95505050506137ce565b600088111561389e5760008160018a0302830390508160018a0302816002020160028a8161388e57fe5b0402860195508887039650809250505b849650505050505050919050565b6000806016549050600080600954905060006138ca60018303613e95565b90506000600854905060006001840360020a60d20290505b8288870310156139785760008387039050600081141561391c5760018703965060018503945061391460018603613e95565b9350506138e2565b6000826001830302905060008185039050828b039a508181600202016002848161394257fe5b04028801975080945082890398506001870396506001870360020a60d202935061396e60018803613e95565b95505050506138e2565b60008811156139b25760008160018a0302830390508160018a0302816002020160028a816139a257fe5b0402860195508887039650809250505b8360098190555081600881905550849650505050505050919050565b60006103e882816139db57fe5b049150606482101580156139ef575060fa82105b15613a0b57600f600060068110613a0257fe5b01549050613aec565b60fa8210158015613a1d57506101f482105b15613a3957600f600160068110613a3057fe5b01549050613aec565b6101f48210158015613a4c57506103e882105b15613a6857600f600260068110613a5f57fe5b01549050613aec565b6103e88210158015613a7b57506109c482105b15613a9757600f600360068110613a8e57fe5b01549050613aec565b6109c48210158015613aaa575061138882105b15613ac657600f600460068110613abd57fe5b01549050613aec565b6113888210613ae657600f600560068110613add57fe5b01549050613aec565b60055490505b919050565b6502ba7def300082118015613b465750601954600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b15613b93578073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015613b91573d6000803e3d6000fd5b505b5050565b6000601860019054906101000a900460ff16613c1b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f436f6e747261637420646f6573206e6f7420616c6c6f7700000000000000000081525060200191505060405180910390fd5b60003390506000620186a0600454860281613c3257fe5b0490506000620186a0600654870281613c4757fe5b04905080820191506000613c5b8784613585565b90506000613c6e82600854600954613f3e565b905060008111613ce6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f43616e206e6f7420627579203020546f6b656e7300000000000000000000000081525060200191505060405180910390fd5b601654613cf5826016546136c3565b11613cff57600080fd5b613d0b601654826136c3565b601681905550600354613d20826016546136c3565b1115613d2b57600080fd5b613d4581620186a0600654840281613d3f57fe5b04613585565b9050613d90600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826136c3565b600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ddd8388613af1565b8473ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3809550505050505092915050565b60008060026001840181613e6057fe5b0490508291505b81811015613e8f57809150600281828581613e7e57fe5b040181613e8757fe5b049050613e67565b50919050565b600060058211613ead57816303938700029050613f39565b600582118015613ebe5750600a8211155b15613eda576302faf08060058303026311e1a300019050613f39565b600a82118015613eeb5750600f8211155b15613f07576302625a00600a8303026320c85580019050613f39565b600f82118015613f18575060148211155b15613f34576301c9c380600f830302632cb41780019050613f39565b600090505b919050565b6000806001830360020a60d20290506000613f5c8560020283613585565b90506000601654905060008084600202613f88613f828b88600802026002880a01613e50565b86613585565b81613f8f57fe5b0490506000613f9d88613e95565b90505b808483011115614046578381039150613fcf8a8760018503028b6002020160028581613fc857fe5b0402613585565b9950856001830302890198506001880197506001880360020a60d2029550613ffa8960020287613585565b945060008660020261401e6140188d8a6008020260028a0a01613e50565b88613585565b8161402557fe5b0490508285019450828401935080925061403e89613e95565b915050613fa0565b81830192508560018303028901985088600881905550876009819055508296505050505050509392505050565b6040518060c0016040528060069060208202803683378082019150509050509056fe53656c6c696e672066726f6d20636f6e7472616374206973206e6f7420616c6c6f77656457697468647261772066726f6d20636f6e7472616374206973206e6f7420616c6c6f77656443616e206e6f742073656c6c206d6f7265207468616e207468652062616c616e6365a264697066735822122069d52ce5de6657561f9aad336ba17c01e27d6e7e559eb7be12727e77a258678164736f6c63430007060033

Deployed Bytecode

0x6080604052600436106102805760003560e01c8063495c95881161014f578063949e8acd116100c1578063c72131631161007a578063c721316314610f2c578063dd62ed3e14610f57578063df8089ef14610fdc578063e1fc57881461102d578063ec7e6be314611186578063f088d5471461119d57610287565b8063949e8acd14610d5157806395d89b4114610d7c578063998541ba14610e0c578063a7dbfa6c14610e23578063a9059cbb14610e68578063ada3ca7114610ed957610287565b806370a082311161011357806370a0823114610beb57806370c1de1914610c5057806380aedcac14610c6757806381180b4014610cac5780638620410b14610cfb5780639032c0ae14610d2657610287565b8063495c958814610aee5780634b75033414610b19578063651fe61114610b4457806368fa813414610b6f5780636b2f463214610bc057610287565b806323b872dd116101f35780632e926d49116101ac5780632e926d4914610993578063313ce567146109be578063324536eb146109ec5780633ad10ef614610a175780634189a68e14610a58578063439c0e2514610ab357610287565b806323b872dd146108095780632578ebc81461089a578063257e76fc146108c5578063257eac29146109165780632b16587c146109515780632b68b9c61461097c57610287565b806310d0ffdd1161024557806310d0ffdd1461053f578063153a1f3e1461058e57806316279055146106fd57806318160ddd146107645780631dfa4da01461078f57806322609373146107ba57610287565b806221e81c1461028957806304d4415e146102a057806306fdde0314610403578063095ea7b3146104935780630be164301461050457610287565b3661028757005b005b34801561029557600080fd5b5061029e6111e1565b005b3480156102ac57600080fd5b50610401600480360360608110156102c357600080fd5b81019080803590602001906401000000008111156102e057600080fd5b8201836020820111156102f257600080fd5b8035906020019184602083028401116401000000008311171561031457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561037457600080fd5b82018360208201111561038657600080fd5b803590602001918460208302840111640100000000831117156103a857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919050505061125a565b005b34801561040f57600080fd5b50610418611537565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561045857808201518184015260208101905061043d565b50505050905090810190601f1680156104855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561049f57600080fd5b506104ec600480360360408110156104b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115d5565b60405180821515815260200191505060405180910390f35b34801561051057600080fd5b5061053d6004803603602081101561052757600080fd5b81019080803590602001909291905050506116c7565b005b34801561054b57600080fd5b506105786004803603602081101561056257600080fd5b810190808035906020019092919050505061173a565b6040518082815260200191505060405180910390f35b34801561059a57600080fd5b506106e5600480360360408110156105b157600080fd5b81019080803590602001906401000000008111156105ce57600080fd5b8201836020820111156105e057600080fd5b8035906020019184602083028401116401000000008311171561060257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561066257600080fd5b82018360208201111561067457600080fd5b8035906020019184602083028401116401000000008311171561069657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506117b3565b60405180821515815260200191505060405180910390f35b34801561070957600080fd5b5061074c6004803603602081101561072057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119e9565b60405180821515815260200191505060405180910390f35b34801561077057600080fd5b50610779611a34565b6040518082815260200191505060405180910390f35b34801561079b57600080fd5b506107a4611a88565b6040518082815260200191505060405180910390f35b3480156107c657600080fd5b506107f3600480360360208110156107dd57600080fd5b8101908080359060200190929190505050611a8e565b6040518082815260200191505060405180910390f35b34801561081557600080fd5b506108826004803603606081101561082c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611af5565b60405180821515815260200191505060405180910390f35b3480156108a657600080fd5b506108af611e7b565b6040518082815260200191505060405180910390f35b3480156108d157600080fd5b50610914600480360360208110156108e857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ee0565b005b34801561092257600080fd5b5061094f6004803603602081101561093957600080fd5b8101908080359060200190929190505050611f80565b005b34801561095d57600080fd5b5061096661205c565b6040518082815260200191505060405180910390f35b34801561098857600080fd5b506109916120c1565b005b34801561099f57600080fd5b506109a861215b565b6040518082815260200191505060405180910390f35b3480156109ca57600080fd5b506109d3612161565b604051808260ff16815260200191505060405180910390f35b3480156109f857600080fd5b50610a01612174565b6040518082815260200191505060405180910390f35b348015610a2357600080fd5b50610a2c61217a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a6457600080fd5b50610ab160048036036040811015610a7b57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121a0565b005b348015610abf57600080fd5b50610aec60048036036020811015610ad657600080fd5b8101908080359060200190929190505050612517565b005b348015610afa57600080fd5b50610b0361268f565b6040518082815260200191505060405180910390f35b348015610b2557600080fd5b50610b2e612695565b6040518082815260200191505060405180910390f35b348015610b5057600080fd5b50610b596126ec565b6040518082815260200191505060405180910390f35b348015610b7b57600080fd5b50610bbe60048036036020811015610b9257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506126f2565b005b348015610bcc57600080fd5b50610bd56127a9565b6040518082815260200191505060405180910390f35b348015610bf757600080fd5b50610c3a60048036036020811015610c0e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127b1565b6040518082815260200191505060405180910390f35b348015610c5c57600080fd5b50610c656127fa565b005b348015610c7357600080fd5b50610caa60048036036040811015610c8a57600080fd5b810190808035906020019092919080359060200190929190505050612873565b005b348015610cb857600080fd5b50610cf960048036036060811015610ccf57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612917565b005b348015610d0757600080fd5b50610d1061298d565b6040518082815260200191505060405180910390f35b348015610d3257600080fd5b50610d3b612997565b6040518082815260200191505060405180910390f35b348015610d5d57600080fd5b50610d666129fc565b6040518082815260200191505060405180910390f35b348015610d8857600080fd5b50610d91612a43565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610dd1578082015181840152602081019050610db6565b50505050905090810190601f168015610dfe5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e1857600080fd5b50610e21612ae1565b005b348015610e2f57600080fd5b50610e6660048036036040811015610e4657600080fd5b810190808035906020019092919080359060200190929190505050612b5a565b005b348015610e7457600080fd5b50610ec160048036036040811015610e8b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612c43565b60405180821515815260200191505060405180910390f35b348015610ee557600080fd5b50610eee612ea4565b6040518082600660200280838360005b83811015610f19578082015181840152602081019050610efe565b5050505090500191505060405180910390f35b348015610f3857600080fd5b50610f41612f4b565b6040518082815260200191505060405180910390f35b348015610f6357600080fd5b50610fc660048036036040811015610f7a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612fb0565b6040518082815260200191505060405180910390f35b348015610fe857600080fd5b5061102b60048036036020811015610fff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613037565b005b34801561103957600080fd5b506111846004803603604081101561105057600080fd5b810190808035906020019064010000000081111561106d57600080fd5b82018360208201111561107f57600080fd5b803590602001918460208302840111640100000000831117156110a157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561110157600080fd5b82018360208201111561111357600080fd5b8035906020019184602083028401116401000000008311171561113557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506130f2565b005b34801561119257600080fd5b5061119b6133e0565b005b6111df600480360360208110156111b357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613459565b005b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661123c57600080fd5b6001601860016101000a81548160ff02191690831515021790555050565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112b557600080fd5b60005b84518110156115305760018314156113c9578381815181106112d657fe5b6020026020010151600d60008784815181106112ee57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555084818151811061134957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8684815181106113ab57fe5b60200260200101516040518082815260200191505060405180910390a35b600283141561152357611441600d60008784815181106113e557fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485838151811061143457fe5b6020026020010151613585565b600d600087848151811061145157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503073ffffffffffffffffffffffffffffffffffffffff168582815181106114ba57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86848151811061150557fe5b60200260200101516040518082815260200191505060405180910390a35b80806001019150506112b8565b5050505050565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115cd5780601f106115a2576101008083540402835291602001916115cd565b820191906000526020600020905b8154815290600101906020018083116115b057829003601f168201915b505050505081565b600081600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661172257600080fd5b6000821161172f57600080fd5b816019819055505050565b600080620186a060045484028161174d57fe5b0490506000620186a060065485028161176257fe5b049050808201915060006117768584613585565b905060006117898260085460095461359c565b90506117a581620186a060065484028161179f57fe5b04613585565b905080945050505050919050565b6000806117be6129fc565b116117c857600080fd5b60005b83518110156119de57600033905060008583815181106117e757fe5b60200260200101519050600061181286858151811061180257fe5b6020026020010151600754613585565b9050611870600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205487868151811061186357fe5b6020026020010151613585565b600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506118fc600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826136c3565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef88878151811061199a57fe5b60200260200101516040518082815260200191505060405180910390a3600060075411156119ce576119cd6007546136df565b5b50505080806001019150506117cb565b506001905092915050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015611a2b57506000801b8214155b92505050919050565b6000611a83600354600d600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613585565b905090565b60095481565b6000601654821115611a9f57600080fd5b6000611aaa83613798565b90506000620186a0600554830281611abe57fe5b0490506000620186a0600654840281611ad357fe5b04905080820191506000611ae78484613585565b905080945050505050919050565b6000600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115611b4357600080fd5b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115611bcc57600080fd5b611c15600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483613585565b600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611cde600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483613585565b600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000611d6c83600754613585565b905080600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006007541115611e0a57611e096007546136df565b5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150509392505050565b600080339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611ed757600080fd5b600a5491505090565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611f3b57600080fd5b81600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611fdb57600080fd5b60008211612051576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f53686f756c642062652067726561746572207468616e2030000000000000000081525060200191505060405180910390fd5b81600a819055505050565b600080339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120b857600080fd5b60045491505090565b6000339050601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461212057600080fd5b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b60085481565b600260009054906101000a900460ff1681565b60035481565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006121aa6129fc565b116121b457600080fd5b6121bd336119e9565b15612213576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806140966024913960400191505060405180910390fd5b601860029054906101000a900460ff16612295576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f436f6e747261637420646f6573206e6f7420616c6c6f7700000000000000000081525060200191505060405180910390fd5b600a5482111561230d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f43616e206e6f742073656c6c206d6f7265207468616e20616c6c6f776564000081525060200191505060405180910390fd5b6000339050600d60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483111561235e57600080fd5b6000839050600061236e826138ac565b9050600061237b836139ce565b90506000620186a08284028161238d57fe5b0490506000620186a06006548502816123a257fe5b049050808201915060006123b68584613585565b90506123c460165487613585565b601681905550612413600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205487613585565b600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506124608289613af1565b8673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156124a6573d6000803e3d6000fd5b503073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef886040518082815260200191505060405180910390a3505050505050505050565b6000339050601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461257657600080fd5b61257f336119e9565b156125d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806140ba6025913960400191505060405180910390fd5b478210612622576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526000815260200191505060405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561268a573d6000803e3d6000fd5b505050565b60195481565b60008060165414156126b15760d2643edd410c000390506126e9565b60006126bd6001613798565b90506000620186a06005548302816126d157fe5b04905060006126e08383613585565b90508093505050505b90565b60165481565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661274d57600080fd5b6000601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600047905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661285557600080fd5b6000601860016101000a81548160ff02191690831515021790555050565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166128ce57600080fd5b60018214156128df57826004819055505b60028214156128f057826005819055505b600382141561290157826006819055505b600482141561291257826007819055505b505050565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661297257600080fd5b83600881905550826009819055508160168190555050505050565b6000600854905090565b600080339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166129f357600080fd5b60055491505090565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612ad95780601f10612aae57610100808354040283529160200191612ad9565b820191906000526020600020905b815481529060010190602001808311612abc57829003601f168201915b505050505081565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612b3c57600080fd5b6001601860026101000a81548160ff02191690831515021790555050565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612bb557600080fd5b60068310612c2b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4f6e6c79203620536c616273206172652074686572650000000000000000000081525060200191505060405180910390fd5b81600f8460068110612c3957fe5b0181905550505050565b600080612c4e6129fc565b11612c5857600080fd5b81600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411612cef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140df6022913960400191505060405180910390fd5b60003390506000612d0284600754613585565b9050612d4d600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485613585565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612dd9600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826136c3565b600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a360006007541115612e9857612e976007546136df565b5b60019250505092915050565b612eac614073565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612f0757600080fd5b600f600680602002604051908101604052809291908260068015612f40576020028201915b815481526020019060010190808311612f2c575b505050505091505090565b600080339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612fa757600080fd5b60065491505090565b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000339050601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461309657600080fd5b6001601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661314d57600080fd5b60005b82518110156133da57600084828151811061316757fe5b602002602001015190506131cd600d600086858151811061318457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826136c3565b600d60008685815181106131dd57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061328e600d6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482613585565b600d6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508382815181106132ff57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f6553897c25961cd3a105492c25576d0552123ee868aca283e90f3b4224d7d177826040518082815260200191505060405180910390a283828151811061336057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3508080600101915050613150565b50505050565b6000339050601760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661343b57600080fd5b6000601860026101000a81548160ff02191690831515021790555050565b613462336119e9565b156134d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4275792066726f6d20636f6e7472616374206973206e6f7420616c6c6f77656481525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613577576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656c6620526566657272616c204e6f7420416c6c6f7765640000000000000081525060200191505060405180910390fd5b6135813482613b97565b5050565b60008282111561359157fe5b818303905092915050565b6000806001830360020a60d202905060006135ba8560020283613585565b905060006016549050600080846002026135e66135e08b88600802026002880a01613e50565b86613585565b816135ed57fe5b04905060006135fb88613e95565b90505b8084830111156136a457838103915061362d8a8760018503028b600202016002858161362657fe5b0402613585565b9950856001830302890198506001880197506001880360020a60d20295506136588960020287613585565b945060008660020261367c6136768d8a6008020260028a0a01613e50565b88613585565b8161368357fe5b0490508285019450828401935080925061369c89613e95565b9150506135fe565b8183019250856001830302890198508296505050505050509392505050565b6000808284019050838110156136d557fe5b8091505092915050565b80600d600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061dead73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350565b6000806016549050600080600954905060006137b660018303613e95565b90506000600854905060006001840360020a60d20290505b828887031015613864576000838703905060008114156138085760018703965060018503945061380060018603613e95565b9350506137ce565b6000826001830302905060008185039050828b039a508181600202016002848161382e57fe5b04028801975080945082890398506001870396506001870360020a60d202935061385a60018803613e95565b95505050506137ce565b600088111561389e5760008160018a0302830390508160018a0302816002020160028a8161388e57fe5b0402860195508887039650809250505b849650505050505050919050565b6000806016549050600080600954905060006138ca60018303613e95565b90506000600854905060006001840360020a60d20290505b8288870310156139785760008387039050600081141561391c5760018703965060018503945061391460018603613e95565b9350506138e2565b6000826001830302905060008185039050828b039a508181600202016002848161394257fe5b04028801975080945082890398506001870396506001870360020a60d202935061396e60018803613e95565b95505050506138e2565b60008811156139b25760008160018a0302830390508160018a0302816002020160028a816139a257fe5b0402860195508887039650809250505b8360098190555081600881905550849650505050505050919050565b60006103e882816139db57fe5b049150606482101580156139ef575060fa82105b15613a0b57600f600060068110613a0257fe5b01549050613aec565b60fa8210158015613a1d57506101f482105b15613a3957600f600160068110613a3057fe5b01549050613aec565b6101f48210158015613a4c57506103e882105b15613a6857600f600260068110613a5f57fe5b01549050613aec565b6103e88210158015613a7b57506109c482105b15613a9757600f600360068110613a8e57fe5b01549050613aec565b6109c48210158015613aaa575061138882105b15613ac657600f600460068110613abd57fe5b01549050613aec565b6113888210613ae657600f600560068110613add57fe5b01549050613aec565b60055490505b919050565b6502ba7def300082118015613b465750601954600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b15613b93578073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015613b91573d6000803e3d6000fd5b505b5050565b6000601860019054906101000a900460ff16613c1b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f436f6e747261637420646f6573206e6f7420616c6c6f7700000000000000000081525060200191505060405180910390fd5b60003390506000620186a0600454860281613c3257fe5b0490506000620186a0600654870281613c4757fe5b04905080820191506000613c5b8784613585565b90506000613c6e82600854600954613f3e565b905060008111613ce6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f43616e206e6f7420627579203020546f6b656e7300000000000000000000000081525060200191505060405180910390fd5b601654613cf5826016546136c3565b11613cff57600080fd5b613d0b601654826136c3565b601681905550600354613d20826016546136c3565b1115613d2b57600080fd5b613d4581620186a0600654840281613d3f57fe5b04613585565b9050613d90600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826136c3565b600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ddd8388613af1565b8473ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3809550505050505092915050565b60008060026001840181613e6057fe5b0490508291505b81811015613e8f57809150600281828581613e7e57fe5b040181613e8757fe5b049050613e67565b50919050565b600060058211613ead57816303938700029050613f39565b600582118015613ebe5750600a8211155b15613eda576302faf08060058303026311e1a300019050613f39565b600a82118015613eeb5750600f8211155b15613f07576302625a00600a8303026320c85580019050613f39565b600f82118015613f18575060148211155b15613f34576301c9c380600f830302632cb41780019050613f39565b600090505b919050565b6000806001830360020a60d20290506000613f5c8560020283613585565b90506000601654905060008084600202613f88613f828b88600802026002880a01613e50565b86613585565b81613f8f57fe5b0490506000613f9d88613e95565b90505b808483011115614046578381039150613fcf8a8760018503028b6002020160028581613fc857fe5b0402613585565b9950856001830302890198506001880197506001880360020a60d2029550613ffa8960020287613585565b945060008660020261401e6140188d8a6008020260028a0a01613e50565b88613585565b8161402557fe5b0490508285019450828401935080925061403e89613e95565b915050613fa0565b81830192508560018303028901985088600881905550876009819055508296505050505050509392505050565b6040518060c0016040528060069060208202803683378082019150509050509056fe53656c6c696e672066726f6d20636f6e7472616374206973206e6f7420616c6c6f77656457697468647261772066726f6d20636f6e7472616374206973206e6f7420616c6c6f77656443616e206e6f742073656c6c206d6f7265207468616e207468652062616c616e6365a264697066735822122069d52ce5de6657561f9aad336ba17c01e27d6e7e559eb7be12727e77a258678164736f6c63430007060033

Deployed Bytecode Sourcemap

1019:26776:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4137:83;;;;;;;;;;;;;:::i;:::-;;4597:651;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2326:39;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9848:206;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;4420:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16180:641;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11851:861;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;15551:617;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;10889:182;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2875:22;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14845:538;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10205:672;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;6984:114;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9701:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6784:188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14307:119;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12724:77;;;;;;;;;;;;;:::i;:::-;;2819:49;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2407:25;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2439:39;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3091:33;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;8169:1263;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;7110:264;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3584:37;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13613:536;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3369:31;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8033:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13082:137;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13432:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4042:83;;;;;;;;;;;;;:::i;:::-;;7386:450;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5312:232;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14704:123;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14438:121;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13231:113;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2372:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4326:82;;;;;;;;;;;;;:::i;:::-;;18214:195;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11083:756;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;14161:134;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14565:127;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10066;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7907:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6143:629;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4232:82;;;;;;;;;;;;;:::i;:::-;;5796:282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4137:83;1208:24;1235:10;1208:37;;1264:14;:32;1279:16;1264:32;;;;;;;;;;;;;;;;;;;;;;;;;1256:41;;;;;;4208:4:::1;4198:7;;:14;;;;;;;;;;;;;;;;;;4137:83:::0;:::o;4597:651::-;1208:24;1235:10;1208:37;;1264:14;:32;1279:16;1264:32;;;;;;;;;;;;;;;;;;;;;;;;;1256:41;;;;;;4749:6:::1;4745:496;4763:6;:13;4761:1;:15;4745:496;;;4821:1;4809:8;:13;4806:183;;;4890:9;4900:1;4890:12;;;;;;;;;;;;;;4856:19;:30;4876:6;4883:1;4876:9;;;;;;;;;;;;;;4856:30;;;;;;;;;;;;;;;;:46;;;;;;;;;;;4949:6;4956:1;4949:9;;;;;;;;;;;;;;4926:47;;4943:4;4926:47;;;4960:9;4970:1;4960:12;;;;;;;;;;;;;;4926:47;;;;;;;;;;;;;;;;;;4806:183;5018:1;5006:8;:13;5003:227;;;5085:57;5098:19;:30;5118:6;5125:1;5118:9;;;;;;;;;;;;;;5098:30;;;;;;;;;;;;;;;;5129:9;5139:1;5129:12;;;;;;;;;;;;;;5085;:57::i;:::-;5053:19;:30;5073:6;5080:1;5073:9;;;;;;;;;;;;;;5053:30;;;;;;;;;;;;;;;:89;;;;5194:4;5166:48;;5175:6;5182:1;5175:9;;;;;;;;;;;;;;5166:48;;;5201:9;5211:1;5201:12;;;;;;;;;;;;;;5166:48;;;;;;;;;;;;;;;;;;5003:227;4777:3;;;;;;;4745:496;;;;4597:651:::0;;;;:::o;2326:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9848:206::-;9915:4;9962:9;9930:7;:19;9938:10;9930:19;;;;;;;;;;;;;;;:29;9950:8;9930:29;;;;;;;;;;;;;;;:41;;;;10006:8;9985:41;;9994:10;9985:41;;;10016:9;9985:41;;;;;;;;;;;;;;;;;;10042:4;10035:11;;9848:206;;;;:::o;4420:165::-;1208:24;1235:10;1208:37;;1264:14;:32;1279:16;1264:32;;;;;;;;;;;;;;;;;;;;;;;;;1256:41;;;;;;4532:1:::1;4514:15;:19;4506:28;;;::::0;::::1;;4562:15;4545:14;:32;;;;4420:165:::0;;:::o;16180:641::-;16289:7;16314:18;16367:6;16355:10;;16336:16;:29;16335:38;;;;;;16314:59;;16384:23;16447:6;16430:15;;16411:16;:34;16410:43;;;;;;16384:69;;16490:15;16477:10;:28;16464:41;;16516:22;16541:42;16554:16;16572:10;16541:12;:42::i;:::-;16516:67;;16594:23;16620:56;16641:14;16657:13;;16672:3;;16620:20;:56::i;:::-;16594:82;;16705:75;16718:15;16773:6;16754:15;;16736;:33;16735:44;;;;;;16705:12;:75::i;:::-;16687:93;;16798:15;16791:22;;;;;;16180:641;;;:::o;11851:861::-;11986:4;1141:1;1128:10;:8;:10::i;:::-;:14;1120:23;;;;;;12012:6:::1;12008:675;12024:10;:17;12022:1;:19;12008:675;;;12071:24;12098:10;12071:37;;12123:24;12150:10;12161:1;12150:13;;;;;;;;;;;;;;12123:40;;12178:15;12196:47;12209:15;12225:1;12209:18;;;;;;;;;;;;;;12229:13;;12196:12;:47::i;:::-;12178:65;;12298:71;12311:19;:37;12331:16;12311:37;;;;;;;;;;;;;;;;12350:15;12366:1;12350:18;;;;;;;;;;;;;;12298:12;:71::i;:::-;12258:19;:37;12278:16;12258:37;;;;;;;;;;;;;;;:111;;;;12424:60;12437:19;:37;12457:16;12437:37;;;;;;;;;;;;;;;;12476:7;12424:12;:60::i;:::-;12384:19;:37;12404:16;12384:37;;;;;;;;;;;;;;;:100;;;;12531:16;12504:64;;12513:16;12504:64;;;12549:15;12565:1;12549:18;;;;;;;;;;;;;;12504:64;;;;;;;;;;;;;;;;;;12602:1;12586:13;;:17;12583:89;;;12637:19;12642:13;;12637:4;:19::i;:::-;12583:89;12008:675;;;12042:3;;;;;;;12008:675;;;;12700:4;12693:11;;11851:861:::0;;;;:::o;15551:617::-;15609:4;15871:16;15898:19;15920:66;15898:88;;;;16089:7;16077:20;16065:32;;16129:11;16117:8;:23;;:42;;;;;16156:3;16144:15;;:8;:15;;16117:42;16109:51;;;;15551:617;;;:::o;10889:182::-;10932:7;10964:99;10977:12;;10990:19;:72;11018:42;10990:72;;;;;;;;;;;;;;;;10964:12;:99::i;:::-;10957:106;;10889:182;:::o;2875:22::-;;;;:::o;14845:538::-;14953:7;15003:12;;14986:13;:29;;14978:38;;;;;;15027:17;15047:35;15068:13;15047:20;:35::i;:::-;15027:55;;15093:18;15141:6;15127:11;;15115:9;:23;15114:33;;;;;;15093:54;;15158:23;15214:6;15197:15;;15185:9;:27;15184:36;;;;;;15158:62;;15257:15;15244:10;:28;15231:41;;15283:22;15308:35;15321:9;15332:10;15308:12;:35::i;:::-;15283:60;;15361:14;15354:21;;;;;;14845:538;;;:::o;10205:672::-;10289:4;10325:19;:26;10345:5;10325:26;;;;;;;;;;;;;;;;10312:9;:39;;10304:48;;;;;;10382:7;:14;10390:5;10382:14;;;;;;;;;;;;;;;:26;10397:10;10382:26;;;;;;;;;;;;;;;;10369:9;:39;;10361:48;;;;;;10447:50;10460:19;:26;10480:5;10460:26;;;;;;;;;;;;;;;;10487:9;10447:12;:50::i;:::-;10418:19;:26;10438:5;10418:26;;;;;;;;;;;;;;;:79;;;;10534:50;10547:7;:14;10555:5;10547:14;;;;;;;;;;;;;;;:26;10562:10;10547:26;;;;;;;;;;;;;;;;10574:9;10534:12;:50::i;:::-;10506:7;:14;10514:5;10506:14;;;;;;;;;;;;;;;:26;10521:10;10506:26;;;;;;;;;;;;;;;:78;;;;10593:11;10607:37;10620:9;10630:13;;10607:12;:37::i;:::-;10593:51;;10711:6;10682:19;:26;10702:5;10682:26;;;;;;;;;;;;;;;;:35;10653:19;:26;10673:5;10653:26;;;;;;;;;;;;;;;:64;;;;10745:1;10729:13;;:17;10726:77;;;10772:19;10777:13;;10772:4;:19::i;:::-;10726:77;10832:5;10816:33;;10825:5;10816:33;;;10839:9;10816:33;;;;;;;;;;;;;;;;;;10865:4;10858:11;;;10205:672;;;;;:::o;6984:114::-;7047:7;1208:24;1235:10;1208:37;;1264:14;:32;1279:16;1264:32;;;;;;;;;;;;;;;;;;;;;;;;;1256:41;;;;;;7079:11:::1;;7072:18;;6984:114:::0;;:::o;9701:135::-;1208:24;1235:10;1208:37;;1264:14;:32;1279:16;1264:32;;;;;;;;;;;;;;;;;;;;;;;;;1256:41;;;;;;9817:11:::1;9804:10;;:24;;;;;;;;;;;;;;;;;;9701:135:::0;;:::o;6784:188::-;1208:24;1235:10;1208:37;;1264:14;:32;1279:16;1264:32;;;;;;;;;;;;;;;;;;;;;;;;;1256:41;;;;;;6897:1:::1;6882:12;:16;6873:54;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;6952:12;6938:11;:26;;;;6784:188:::0;;:::o;14307:119::-;14375:7;1208:24;1235:10;1208:37;;1264:14;:32;1279:16;1264:32;;;;;;;;;;;;;;;;;;;;;;;;;1256:41;;;;;;14407:10:::1;;14400:18;;14307:119:::0;;:::o;12724:77::-;1356:24;1383:10;1356:37;;1432:4;;;;;;;;;;;1412:24;;:16;:24;;;1404:33;;;;;;12788:4:::1;;;;;;;;;;;12775:18;;;2819:49:::0;;;;:::o;2407:25::-;;;;;;;;;;;;;:::o;2439:39::-;;;;:::o;3091:33::-;;;;;;;;;;;;;:::o;8169:1263::-;1141:1;1128:10;:8;:10::i;:::-;:14;1120:23;;;;;;8302:22:::1;8313:10;8302;:22::i;:::-;8301:23;8293:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8383:8;;;;;;;;;;;8375:43;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;8456:11;;8437:15;:30;;8429:73;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;8536:32;8571:10;8536:45;;8619:19;:37;8639:16;8619:37;;;;;;;;;;;;;;;;8600:15;:56;;8592:65;;;::::0;::::1;;8668:15;8686;8668:33;;8712:17;8732:26;8750:7;8732:17;:26::i;:::-;8712:46;;8769:20;8792:26;8810:7;8792:17;:26::i;:::-;8769:49;;8829:18;8877:6;8863:12;8851:9;:24;8850:33;;;;;;8829:54;;8894:23;8950:6;8933:15;;8921:9;:27;8920:36;;;;;;8894:62;;8993:15;8980:10;:28;8967:41;;9019:22;9044:35;9057:9;9068:10;9044:12;:35::i;:::-;9019:60;;9105:35;9118:12;;9132:7;9105:12;:35::i;:::-;9090:12;:50;;;;9191:60;9204:19;:37;9224:16;9204:37;;;;;;;;;;;;;;;;9243:7;9191:12;:60::i;:::-;9151:19;:37;9171:16;9151:37;;;;;;;;;;;;;;;:100;;;;9262:44;9279:15;9296:9;9262:16;:44::i;:::-;9317:16;:25;;:41;9343:14;9317:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;9409:4;9374:50;;9383:16;9374:50;;;9416:7;9374:50;;;;;;;;;;;;;;;;;;1154:1;;;;;;;8169:1263:::0;;:::o;7110:264::-;1356:24;1383:10;1356:37;;1432:4;;;;;;;;;;;1412:24;;:16;:24;;;1404:33;;;;;;7210:22:::1;7221:10;7210;:22::i;:::-;7209:23;7201:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7302:21;7292:7;:31;7284:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7338:10;;;;;;;;;;;:19;;:28;7358:7;7338:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;7110:264:::0;;:::o;3584:37::-;;;;:::o;13613:536::-;13684:7;13808:1;13792:12;;:17;13789:353;;;2602:3;2532:12;13832:43;13825:50;;;;13789:353;13908:17;13928:23;13949:1;13928:20;:23::i;:::-;13908:43;;13966:18;14013:6;14000:11;;13988:9;:23;13987:32;;;;;;13966:53;;14034:22;14059:35;14072:9;14083:10;14059:12;:35::i;:::-;14034:60;;14116:14;14109:21;;;;;13613:536;;:::o;3369:31::-;;;;:::o;8033:124::-;1208:24;1235:10;1208:37;;1264:14;:32;1279:16;1264:32;;;;;;;;;;;;;;;;;;;;;;;;;1256:41;;;;;;8144:5:::1;8117:14;:24;8132:8;8117:24;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;8033:124:::0;;:::o;13082:137::-;13161:4;13190:21;13183:28;;13082:137;:::o;13432:169::-;13524:7;13556:19;:37;13576:16;13556:37;;;;;;;;;;;;;;;;13549:44;;13432:169;;;:::o;4042:83::-;1208:24;1235:10;1208:37;;1264:14;:32;1279:16;1264:32;;;;;;;;;;;;;;;;;;;;;;;;;1256:41;;;;;;4112:5:::1;4102:7;;:15;;;;;;;;;;;;;;;;;;4042:83:::0;:::o;7386:450::-;1208:24;1235:10;1208:37;;1264:14;:32;1279:16;1264:32;;;;;;;;;;;;;;;;;;;;;;;;;1256:41;;;;;;7505:1:::1;7493:8;:13;7490:75;;;7545:8;7532:10;:21;;;;7490:75;7590:1;7578:8;:13;7575:76;;;7631:8;7617:11;:22;;;;7575:76;7676:1;7664:8;:13;7661:80;;;7721:8;7703:15;:26;;;;7661:80;7766:1;7754:8;:13;7751:78;;;7809:8;7793:13;:24;;;;7751:78;7386:450:::0;;;:::o;5312:232::-;1208:24;1235:10;1208:37;;1264:14;:32;1279:16;1264:32;;;;;;;;;;;;;;;;;;;;;;;;;1256:41;;;;;;5464:13:::1;5448;:29;;;;5494:4;5488:3;:10;;;;5524:12;5509;:27;;;;5312:232:::0;;;;:::o;14704:123::-;14774:7;14806:13;;14799:20;;14704:123;:::o;14438:121::-;14507:7;1208:24;1235:10;1208:37;;1264:14;:32;1279:16;1264:32;;;;;;;;;;;;;;;;;;;;;;;;;1256:41;;;;;;14539:11:::1;;14532:19;;14438:121:::0;;:::o;13231:113::-;13271:7;13304:19;:31;13324:10;13304:31;;;;;;;;;;;;;;;;13296:40;;13231:113;:::o;2372:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4326:82::-;1208:24;1235:10;1208:37;;1264:14;:32;1279:16;1264:32;;;;;;;;;;;;;;;;;;;;;;;;;1256:41;;;;;;4396:4:::1;4385:8;;:15;;;;;;;;;;;;;;;;;;4326:82:::0;:::o;18214:195::-;1208:24;1235:10;1208:37;;1264:14;:32;1279:16;1264:32;;;;;;;;;;;;;;;;;;;;;;;;;1256:41;;;;;;18328:1:::1;18322:5;:7;18314:41;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;18390:11;18366:14;18381:5;18366:21;;;;;;;;:35;;;;18214:195:::0;;;:::o;11083:756::-;11196:4;1141:1;1128:10;:8;:10::i;:::-;:14;1120:23;;;;;;11258:15:::1;11226:19;:31;11246:10;11226:31;;;;;;;;;;;;;;;;:47;11218:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11323:24;11350:10;11323:37;;11371:15;11389:44;11402:15;11419:13;;11389:12;:44::i;:::-;11371:62;;11484:68;11497:19;:37;11517:16;11497:37;;;;;;;;;;;;;;;;11536:15;11484:12;:68::i;:::-;11444:19;:37;11464:16;11444:37;;;;;;;;;;;;;;;:108;;;;11597:54;11610:19;:31;11630:10;11610:31;;;;;;;;;;;;;;;;11643:7;11597:12;:54::i;:::-;11563:19;:31;11583:10;11563:31;;;;;;;;;;;;;;;:88;;;;11694:10;11667:55;;11676:16;11667:55;;;11706:15;11667:55;;;;;;;;;;;;;;;;;;11752:1;11736:13;;:17;11733:77;;;11779:19;11784:13;;11779:4;:19::i;:::-;11733:77;11827:4;11820:11;;;;11083:756:::0;;;;:::o;14161:134::-;14230:17;;:::i;:::-;1208:24;1235:10;1208:37;;1264:14;:32;1279:16;1264:32;;;;;;;;;;;;;;;;;;;;;;;;;1256:41;;;;;;14272:14:::1;14265:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14161:134:::0;;:::o;14565:127::-;14636:7;1208:24;1235:10;1208:37;;1264:14;:32;1279:16;1264:32;;;;;;;;;;;;;;;;;;;;;;;;;1256:41;;;;;;14668:15:::1;;14661:23;;14565:127:::0;;:::o;10066:::-;10139:4;10161:7;:14;10169:5;10161:14;;;;;;;;;;;;;;;:24;10176:8;10161:24;;;;;;;;;;;;;;;;10154:31;;10066:127;;;;:::o;7907:114::-;1356:24;1383:10;1356:37;;1432:4;;;;;;;;;;;1412:24;;:16;:24;;;1404:33;;;;;;8009:4:::1;7982:14;:24;7997:8;7982:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;7907:114:::0;;:::o;6143:629::-;1208:24;1235:10;1208:37;;1264:14;:32;1279:16;1264:32;;;;;;;;;;;;;;;;;;;;;;;;;1256:41;;;;;;6292:6:::1;6288:477;6306:16;:23;6304:1;:25;6288:477;;;6360:14;6377:7;6385:1;6377:10;;;;;;;;;;;;;;6360:27;;6445:61;6458:19;:40;6478:16;6495:1;6478:19;;;;;;;;;;;;;;6458:40;;;;;;;;;;;;;;;;6499:6;6445:12;:61::i;:::-;6402:19;:40;6422:16;6439:1;6422:19;;;;;;;;;;;;;;6402:40;;;;;;;;;;;;;;;:104;;;;6561:59;6574:19;:37;6594:16;;;;;;;;;;;6574:37;;;;;;;;;;;;;;;;6613:6;6561:12;:59::i;:::-;6521:19;:37;6541:16;;;;;;;;;;;6521:37;;;;;;;;;;;;;;;:99;;;;6655:16;6672:1;6655:19;;;;;;;;;;;;;;6640:43;;;6676:6;6640:43;;;;;;;;;;;;;;;;;;6726:16;6743:1;6726:19;;;;;;;;;;;;;;6703:50;;6720:4;6703:50;;;6746:6;6703:50;;;;;;;;;;;;;;;;;;6288:477;6331:3;;;;;;;6288:477;;;;6143:629:::0;;;:::o;4232:82::-;1208:24;1235:10;1208:37;;1264:14;:32;1279:16;1264:32;;;;;;;;;;;;;;;;;;;;;;;;;1256:41;;;;;;4301:5:::1;4290:8;;:16;;;;;;;;;;;;;;;;;;4232:82:::0;:::o;5796:282::-;5894:22;5905:10;5894;:22::i;:::-;5893:23;5885:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5984:10;5971:23;;:9;:23;;;;5963:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6034:36;6049:9;6060;6034:14;:36::i;:::-;;5796:282;:::o;28615:123::-;28673:7;28705:1;28700;:6;;28693:14;;;;28729:1;28725;:5;28718:12;;28615:123;;;;:::o;19194:2246::-;19302:7;19327:30;19394:1;19389:4;:6;19385:1;:11;2602:3;19361:36;19327:71;;19409:15;19427:55;19443:13;19441:1;:15;19459:22;19427:12;:55::i;:::-;19409:73;;19493:20;19516:12;;19493:35;;19539:20;19574:23;19906:22;19904:1;:24;19634:253;19670:166;19799:9;19776:22;19774:1;:24;:34;19740:1;19731:7;:10;:78;19670:4;:166::i;:::-;19861:7;19634:12;:253::i;:::-;19615:314;;;;;;19574:366;;19951:16;19970:17;19982:4;19970:11;:17::i;:::-;19951:36;;19998:1264;20039:8;20023:12;20005:15;:30;20004:43;19998:1264;;;20092:12;20081:8;:23;20063:41;;20131:196;20162:9;20288:22;20267:1;20251:15;:17;20250:60;20234:13;20232:1;:15;20231:80;20209:1;20192:15;20191:19;;;;;;20190:122;20131:12;:196::i;:::-;20119:208;;20393:22;20390:1;20374:15;:17;20373:42;20358:13;:58;20342:74;;20445:1;20438:4;:8;20431:15;;20522:1;20517:4;:6;20512:1;20511:13;2602:3;20487:38;20461:65;;20551:55;20567:13;20565:1;:15;20583:22;20551:12;:55::i;:::-;20541:65;;20621:27;20997:22;20995:1;:24;20693:281;20733:182;20874:9;20851:22;20849:1;:24;:34;20811:1;20802:7;:10;:82;20733:4;:182::i;:::-;20944:7;20693:12;:281::i;:::-;20670:350;;;;;;20621:414;;21080:15;21065:12;:30;21050:45;;21140:15;21125:12;:30;21110:45;;21188:19;21170:37;;21233:17;21245:4;21233:11;:17::i;:::-;21222:28;;19998:1264;;;;21302:15;21287:12;:30;21272:45;;21379:22;21376:1;21360:15;:17;21359:42;21344:13;:58;21328:74;;21420:12;21413:19;;;;;;;;19194:2246;;;;;:::o;28813:147::-;28871:7;28891:9;28907:1;28903;:5;28891:17;;28931:1;28926;:6;;28919:14;;;;28951:1;28944:8;;;28813:147;;;;:::o;12813:261::-;12946:13;12870:19;:72;12898:42;12870:72;;;;;;;;;;;;;;;;:89;;;;;;;;;;;13007:42;12975:91;;12992:4;12975:91;;;13052:13;12975:91;;;;;;;;;;;;;;;;;;12813:261;:::o;23781:1597::-;23877:7;23902:20;23925:12;;23902:35;;23948:22;23985:12;24000:3;;23985:18;;24014:16;24033:19;24050:1;24045:4;:6;24033:11;:19::i;:::-;24014:38;;24063:21;24087:13;;24063:37;;24111:30;24180:1;24175:4;:6;24170:1;24169:13;2602:3;24145:38;24111:73;;24195:823;24228:8;24217:7;24202:12;:22;24201:35;24195:823;;;24262:20;24300:8;24285:12;:23;24262:46;;24342:1;24326:12;:17;24323:205;;;24407:1;24392:12;:16;24377:31;;24435:1;24427:9;;;;24466:19;24483:1;24478:4;:6;24466:11;:19::i;:::-;24455:30;;24504:8;;;24323:205;24542:9;24572:22;24569:1;24556:12;:14;24555:39;24542:53;;24610:9;24638:1;24622:13;:17;24610:29;;24674:12;24664:7;:22;24654:32;;24760:1;24757;24755;:3;24754:7;24750:1;24737:12;:14;;;;;;24736:26;24718:14;:45;24701:62;;24794:1;24778:17;;24840:12;24825;:27;24810:42;;24879:1;24874:4;:6;24867:13;;24957:1;24952:4;:6;24947:1;24946:13;2602:3;24922:38;24896:65;;24987:19;25004:1;24999:4;:6;24987:11;:19::i;:::-;24976:30;;24195:823;;;;;;25041:1;25031:7;:11;25028:311;;;25069:9;25110:22;25107:1;25099:7;:9;25098:34;25081:13;:52;25069:64;;25216:22;25213:1;25205:7;:9;25204:34;25200:1;25198;:3;25197:42;25193:1;25185:7;:9;;;;;;25184:56;25166:14;:75;25149:92;;25287:7;25272:12;:22;25257:37;;25326:1;25310:17;;25028:311;;25356:14;25349:21;;;;;;;;23781:1597;;;:::o;25390:1641::-;25469:7;25494:20;25517:12;;25494:35;;25540:22;25577:12;25592:3;;25577:18;;25606:16;25625:19;25642:1;25637:4;:6;25625:11;:19::i;:::-;25606:38;;25655:21;25679:13;;25655:37;;25703:30;25772:1;25767:4;:6;25762:1;25761:13;2602:3;25737:38;25703:73;;25787:823;25820:8;25809:7;25794:12;:22;25793:35;25787:823;;;25854:20;25892:8;25877:12;:23;25854:46;;25934:1;25918:12;:17;25915:205;;;25999:1;25984:12;:16;25969:31;;26027:1;26019:9;;;;26058:19;26075:1;26070:4;:6;26058:11;:19::i;:::-;26047:30;;26096:8;;;25915:205;26134:9;26164:22;26161:1;26148:12;:14;26147:39;26134:53;;26202:9;26230:1;26214:13;:17;26202:29;;26266:12;26256:7;:22;26246:32;;26352:1;26349;26347;:3;26346:7;26342:1;26329:12;:14;;;;;;26328:26;26310:14;:45;26293:62;;26386:1;26370:17;;26432:12;26417;:27;26402:42;;26471:1;26466:4;:6;26459:13;;26549:1;26544:4;:6;26539:1;26538:13;2602:3;26514:38;26488:65;;26579:19;26596:1;26591:4;:6;26579:11;:19::i;:::-;26568:30;;25787:823;;;;;;26633:1;26623:7;:11;26620:311;;;26661:9;26702:22;26699:1;26691:7;:9;26690:34;26673:13;:52;26661:64;;26808:22;26805:1;26797:7;:9;26796:34;26792:1;26790;:3;26789:42;26785:1;26777:7;:9;;;;;;26776:56;26758:14;:75;26741:92;;26879:7;26864:12;:22;26849:37;;26918:1;26902:17;;26620:311;;26947:4;26941:3;:10;;;;26978:13;26962;:29;;;;27009:14;27002:21;;;;;;;;25390:1641;;;:::o;18421:762::-;18487:7;18527:4;18517:7;:14;;;;;;18506:26;;18556:3;18546:7;:13;;:29;;;;;18572:3;18563:7;:12;18546:29;18543:94;;;18608:14;18623:1;18608:17;;;;;;;;;18601:24;;;;18543:94;18660:3;18650:7;:13;;:29;;;;;18676:3;18667:7;:12;18650:29;18647:94;;;18712:14;18727:1;18712:17;;;;;;;;;18705:24;;;;18647:94;18764:3;18754:7;:13;;:30;;;;;18780:4;18771:7;:13;18754:30;18751:95;;;18817:14;18832:1;18817:17;;;;;;;;;18810:24;;;;18751:95;18869:4;18859:7;:14;;:31;;;;;18886:4;18877:7;:13;18859:31;18856:96;;;18923:14;18938:1;18923:17;;;;;;;;;18916:24;;;;18856:96;18975:4;18965:7;:14;;:31;;;;;18992:4;18983:7;:13;18965:31;18962:96;;;19029:14;19044:1;19029:17;;;;;;;;;19022:24;;;;18962:96;19081:4;19071:7;:14;19068:79;;19118:14;19133:1;19118:17;;;;;;;;;19111:24;;;;19068:79;19164:11;;19157:18;;18421:762;;;;:::o;9444:245::-;9552:14;9542:7;:24;:75;;;;;9603:14;;9570:19;:30;9590:9;9570:30;;;;;;;;;;;;;;;;:47;9542:75;9539:143;;;9643:9;:18;;:27;9662:7;9643:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9539:143;9444:245;;:::o;16833:1370::-;16946:7;17002;;;;;;;;;;;16994:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17047:24;17074:10;17047:37;;17095:18;17149:6;17137:10;;17117:17;:30;17116:39;;;;;;17095:60;;17166:23;17230:6;17213:15;;17193:17;:35;17192:44;;;;;;17166:70;;17273:15;17260:10;:28;17247:41;;17299:22;17324:43;17337:17;17356:10;17324:12;:43::i;:::-;17299:68;;17378:23;17404:54;17422:14;17439:13;;17454:3;;17404:17;:54::i;:::-;17378:80;;17495:1;17477:15;:19;17469:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17586:12;;17541:42;17554:15;17570:12;;17541;:42::i;:::-;:57;17533:66;;;;;;17625:43;17638:12;;17652:15;17625:12;:43::i;:::-;17610:12;:58;;;;17733:12;;17687:42;17700:15;17716:12;;17687;:42::i;:::-;:58;;17679:67;;;;;;17819:73;17832:15;17885:6;17868:15;;17850;:33;17849:42;;;;;;17819:12;:73::i;:::-;17801:91;;17943:68;17956:19;:37;17976:16;17956:37;;;;;;;;;;;;;;;;17995:15;17943:12;:68::i;:::-;17903:19;:37;17923:16;17903:37;;;;;;;;;;;;;;;:108;;;;18022:43;18039:15;18055:9;18022:16;:43::i;:::-;18128:16;18104:58;;18121:4;18104:58;;;18146:15;18104:58;;;;;;;;;;;;;;;;;;18180:15;18173:22;;;;;;;16833:1370;;;;:::o;27594:198::-;27639:6;27658;27677:1;27672;27668;:5;27667:11;;;;;;27658:20;;27693:1;27689:5;;27705:80;27716:1;27712;:5;27705:80;;;27738:1;27734:5;;27772:1;27767;27763;27759;:5;;;;;;:9;27758:15;;;;;;27754:19;;27705:80;;;27594:198;;;;:::o;27043:539::-;27115:7;27151:1;27143:4;:9;27140:74;;27197:4;27186:8;:15;27178:24;;;;27140:74;27234:1;27227:4;:8;:22;;;;;27247:2;27239:4;:10;;27227:22;27224:103;;;27305:8;27302:1;27297:4;:6;27296:17;27283:9;:31;27275:40;;;;27224:103;27347:2;27340:4;:9;:23;;;;;27361:2;27353:4;:10;;27340:23;27337:105;;;27420:8;27416:2;27411:4;:7;27410:18;27397:9;:32;27389:41;;;;27337:105;27462:2;27455:4;:9;:23;;;;;27476:2;27468:4;:10;;27455:23;27452:104;;;27534:8;27530:2;27525:4;:7;27524:18;27512:9;:31;27504:40;;;;27452:104;27573:1;27566:8;;27043:539;;;;:::o;21452:2317::-;21570:7;21595:30;21662:1;21657:4;:6;21653:1;:11;2602:3;21629:36;21595:71;;21677:15;21695:55;21711:13;21709:1;:15;21727:22;21695:12;:55::i;:::-;21677:73;;21761:20;21784:12;;21761:35;;21807:20;21842:23;22174:22;22172:1;:24;21902:253;21938:166;22067:9;22044:22;22042:1;:24;:34;22008:1;21999:7;:10;:78;21938:4;:166::i;:::-;22129:7;21902:12;:253::i;:::-;21883:314;;;;;;21842:366;;22219:16;22238:17;22250:4;22238:11;:17::i;:::-;22219:36;;22266:1264;22307:8;22291:12;22273:15;:30;22272:43;22266:1264;;;22360:12;22349:8;:23;22331:41;;22399:196;22430:9;22556:22;22535:1;22519:15;:17;22518:60;22502:13;22500:1;:15;22499:80;22477:1;22460:15;22459:19;;;;;;22458:122;22399:12;:196::i;:::-;22387:208;;22661:22;22658:1;22642:15;:17;22641:42;22626:13;:58;22610:74;;22713:1;22706:4;:8;22699:15;;22790:1;22785:4;:6;22780:1;22779:13;2602:3;22755:38;22729:65;;22819:55;22835:13;22833:1;:15;22851:22;22819:12;:55::i;:::-;22809:65;;22889:27;23265:22;23263:1;:24;22961:281;23001:182;23142:9;23119:22;23117:1;:24;:34;23079:1;23070:7;:10;:82;23001:4;:182::i;:::-;23212:7;22961:12;:281::i;:::-;22938:350;;;;;;22889:414;;23348:15;23333:12;:30;23318:45;;23408:15;23393:12;:30;23378:45;;23456:19;23438:37;;23501:17;23513:4;23501:11;:17::i;:::-;23490:28;;22266:1264;;;;23570:15;23555:12;:30;23540:45;;23647:22;23644:1;23628:15;:17;23627:42;23612:13;:58;23596:74;;23697:13;23681;:29;;;;23727:4;23721:3;:10;;;;23749:12;23742:19;;;;;;;;21452:2317;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://69d52ce5de6657561f9aad336ba17c01e27d6e7e559eb7be12727e77a2586781
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.