function availableAmount(address _from) public view returns (uint256) {                
        
        if (block.timestamp < shareholders[_from].vestingCliff) {            
            return balanceOf(_from).sub(shareholders[_from].receivedAmt);
        } else if (block.timestamp >= shareholders[_from].vestingStart.add(shareholders[_from].vestingDuration)) {
            return balanceOf(_from);
        } else {
            uint totalVestedBalance = shareholders[_from].receivedAmt;
            uint totalAvailableVestedBalance = totalVestedBalance.mul(block.timestamp.sub(shareholders[_from].vestingStart)).div(shareholders[_from].vestingDuration);
            uint lockedBalance = totalVestedBalance - totalAvailableVestedBalance;
            return balanceOf(_from).sub(lockedBalance);
        }
    }