Imports System.Net.Mail

Module Module1

    Sub Main()
        Dim MyAppt As New AppointmentBLL(RoundUpToQuarterHour(Now.AddMinutes(60)), RoundUpToQuarterHour(Now.AddMinutes(90)), "Subject", "Open to discuss", "Location", "To@to.org", "To@to.org", "From@From.org", "From@From.org")
        MyAppt.EmailAppointment()
    End Sub

    Function RoundUpToQuarterHour(ByVal theDate As Date) As Date
        Do Until theDate.Minute Mod 15 = 0
            theDate = theDate.AddMinutes(1)
        Loop

        theDate = theDate.AddSeconds(-(theDate.Second)) 'Remove the seconds
        Return theDate
    End Function
End Module

Public Class AppointmentBLL
    ' This class formats and sends a meeting request via SMTP email

    Public StartDate As DateTime
    Public EndDate As DateTime
    Public Subject As String
    Public Summary As String
    Public Location As String
    Public AttendeeName As String
    Public AttendeeEmail As String
    Public OrganizerName As String
    Public OrganizerEmail As String

    Public Sub New(ByVal pdtStartDate As DateTime,
                    ByVal pdtEndDate As DateTime,
                    ByVal psSubject As String,
                    ByVal psSummary As String,
                    ByVal psLocation As String,
                    ByVal psAttendeeName As String,
                    ByVal psAttendeeEmail As String,
                    ByVal psOrganizerName As String,
                    ByVal psOrganizerEmail As String)

        ' Copy constructor parameters to public propeties

        StartDate = pdtStartDate
        EndDate = pdtEndDate
        Subject = psSubject
        Summary = psSummary
        Location = psLocation
        AttendeeName = psAttendeeName
        AttendeeEmail = psAttendeeEmail
        OrganizerName = psOrganizerName
        OrganizerEmail = psOrganizerEmail
    End Sub


    Public Sub EmailAppointment()

        ' Send the calendar message to the attendee

        Dim loMsg As New MailMessage
        Dim loTextView As AlternateView = Nothing
        Dim loHTMLView As AlternateView = Nothing
        Dim loCalendarView As AlternateView = Nothing
        Dim loSMTPServer As New SmtpClient("exchange.info.sys")

        ' SMTP settings set up in web.config such as:
        '  <system.net>
        '   <mailSettings>
        '    <smtp>
        '     <network
        '       host = "exchange.mycompany.com"
        '       port = "25"
        '       userName = "username"
        '       password="password" />
        '    </smtp>
        '   </mailSettings>
        '  </system.net>

        ' Set up the different mime types contained in the message
        Dim loTextType As System.Net.Mime.ContentType = New System.Net.Mime.ContentType("text/plain")
        Dim loHTMLType As System.Net.Mime.ContentType = New System.Net.Mime.ContentType("text/html")
        Dim loCalendarType As System.Net.Mime.ContentType = New System.Net.Mime.ContentType("text/calendar")

        ' Add parameters to the calendar header
        loCalendarType.Parameters.Add("method", "REQUEST")
        loCalendarType.Parameters.Add("name", "meeting.ics")

        ' Create message body parts
        loTextView = AlternateView.CreateAlternateViewFromString(BodyText(), loTextType)
        loMsg.AlternateViews.Add(loTextView)

        loHTMLView = AlternateView.CreateAlternateViewFromString(BodyHTML(), loHTMLType)
        loMsg.AlternateViews.Add(loHTMLView)

        loCalendarView = AlternateView.CreateAlternateViewFromString(VCalendar(), loCalendarType)
        loCalendarView.TransferEncoding = Net.Mime.TransferEncoding.SevenBit
        loMsg.AlternateViews.Add(loCalendarView)

        ' Adress the message

        loMsg.From = New MailAddress(OrganizerEmail)
        loMsg.To.Add(New MailAddress(AttendeeEmail))
        loMsg.Subject = Subject

        ' Send the message
        loSMTPServer.DeliveryMethod = SmtpDeliveryMethod.Network
        loSMTPServer.Send(loMsg)
    End Sub

    Public Function BodyText() As String

        ' Return the Body in text format

        Const BODY_TEXT =
            "Type:Single Meeting" & vbCrLf &
            "Organizer: {0}" & vbCrLf &
            "Start Time:{1}" & vbCrLf &
            "End Time:{2}" & vbCrLf &
            "Time Zone:{3}" & vbCrLf &
            "Location: {4}" & vbCrLf &
            vbCrLf &
            "*~*~*~*~*~*~*~*~*~*" & vbCrLf &
            vbCrLf &
            "{5}"

        Return String.Format(BODY_TEXT,
                            OrganizerName,
                            StartDate.ToLongDateString & " " & StartDate.ToLongTimeString,
                            EndDate.ToLongDateString & " " & EndDate.ToLongTimeString,
                            System.TimeZone.CurrentTimeZone.StandardName,
                            Location,
                            Summary)

    End Function

    Public Function BodyHTML() As String

        ' Return the Body in HTML format

        Const BODY_HTML =
                "<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 3.2//EN"">" & vbCrLf &
                "<HTML>" & vbCrLf &
                "<HEAD>" & vbCrLf &
                "<META HTTP-EQUIV=""Content-Type"" CONTENT=""text/html; charset=utf-8"">" & vbCrLf &
                "<META NAME=""Generator"" CONTENT=""MS Exchange Server version 6.5.7652.24"">" & vbCrLf &
                "<TITLE>{0}</TITLE>" & vbCrLf &
                "</HEAD>" & vbCrLf &
                "<BODY>" & vbCrLf &
                "<!-- Converted from text/plain format -->" & vbCrLf &
                "<P><FONT SIZE=2>Type:Single Meeting<BR>" & vbCrLf &
                "Organizer:{1}<BR>" & vbCrLf &
                "Start Time:{2}<BR>" & vbCrLf &
                "End Time:{3}<BR>" & vbCrLf &
                "Time Zone:{4}<BR>" & vbCrLf &
                "Location:{5}<BR>" & vbCrLf &
                "<BR>" & vbCrLf &
                "*~*~*~*~*~*Generated by Server*~*~*~*~*~*<BR>" & vbCrLf &
                "<BR>" & vbCrLf &
                "{6}<BR>" & vbCrLf &
                "</FONT>" & vbCrLf &
                "</P>" & vbCrLf &
                vbCrLf &
                "</BODY>" & vbCrLf &
                "</HTML>"

        Return String.Format(BODY_HTML,
                            Summary,
                            OrganizerName,
                            StartDate.ToLongDateString & " " & StartDate.ToLongTimeString,
                            EndDate.ToLongDateString & " " & EndDate.ToLongTimeString,
                            System.TimeZone.CurrentTimeZone.StandardName,
                            Location,
                            Summary)

    End Function

    ' Reference to Microsoft ActiveX Data Objects 2.5 Library
    ' Reference to Microsoft CDO for Exchange 2000 Library
    ' Reference to Active DS Type Library

    ' Note: It is recommended that all input parameters be validated when they are
    ' first obtained from the user or user interface.
    Function GetFreeBusyString(ByVal strUserUPN As String, ByVal dtStartDate As Date,
                               ByVal dtEndDate As Date, ByVal Interval As Integer) As String

        Try
            ' Variables.
            'Dim iAddr As New CDO.Addressee()
            'Dim freebusy As String
            'Dim Info As New ActiveDs.ADSystemInfo()

            'iAddr.EmailAddress = strUserUPN
            'If Not iAddr.CheckName("LDAP://" & Info.DomainDNSName) Then
            'Throw New System.Exception("Error occured!")
            'End If

            ' Get the free/busy status in Interval minute intervals
            ' from dtStartDate to dtEndDate.
            'freebusy = iAddr.GetFreeBusy(dtStartDate, dtEndDate, Interval)
            'GetFreeBusyString = freebusy

        Catch err As Exception
            Console.WriteLine(err.ToString())
            GetFreeBusyString = ""
        End Try
    End Function

    Public Function VCalendar() As String

        ' Return the Calendar text in vCalendar format, compatible with most calendar programs

        Const lcDateFormat = "yyyyMMddTHHmmssZ"
        Dim loGUID As Guid = Guid.NewGuid  ' Or use the guid of an exiting meeting?

        Const VCAL_FILE = "BEGIN:VCALENDAR" & vbCrLf &
        "METHOD:REQUEST" & vbCrLf &
        "PRODID:Microsoft CDO for Microsoft Exchange" & vbCrLf &
        "VERSION:2.0" & vbCrLf &
        "BEGIN:VTIMEZONE" & vbCrLf &
        "TZID:(GMT-06.00) Central Time (US & Canada)" & vbCrLf &
        "X-MICROSOFT-CDO-TZID:11" & vbCrLf &
        "BEGIN:STANDARD" & vbCrLf &
        "DTSTART:16010101T020000" & vbCrLf &
        "TZOFFSETFROM:-0500" & vbCrLf &
        "TZOFFSETTO:-0600" & vbCrLf &
        "RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=11;BYDAY=1SU" & vbCrLf &
        "END:STANDARD" & vbCrLf &
        "BEGIN:DAYLIGHT" & vbCrLf &
        "DTSTART:16010101T020000" & vbCrLf &
        "TZOFFSETFROM:-0600" & vbCrLf &
        "TZOFFSETTO:-0500" & vbCrLf &
        "RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=2SU" & vbCrLf &
        "END:DAYLIGHT" & vbCrLf &
        "END:VTIMEZONE" & vbCrLf &
        "BEGIN:VEVENT" & vbCrLf &
        "DTSTAMP:{8}" & vbCrLf &
        "DTSTART:{0}" & vbCrLf &
        "SUMMARY:{7}" & vbCrLf &
        "UID:{5}" & vbCrLf &
        "ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=""{9}"":MAILTO:{9}" & vbCrLf &
        "ACTION;RSVP=TRUE;CN=""{4}"":MAILTO:{4}" & vbCrLf &
        "ORGANIZER;CN=""{3}"":mailto:{4}" & vbCrLf &
        "LOCATION:{2}" & vbCrLf &
        "DTEND:{1}" & vbCrLf &
        "DESCRIPTION:{7}\N" & vbCrLf &
        "SEQUENCE:1" & vbCrLf &
        "PRIORITY:5" & vbCrLf &
        "CLASS:" & vbCrLf &
        "CREATED:{8}" & vbCrLf &
        "LAST-MODIFIED:{8}" & vbCrLf &
        "STATUS:CONFIRMED" & vbCrLf &
        "TRANSP:OPAQUE" & vbCrLf &
        "X-MICROSOFT-CDO-BUSYSTATUS:BUSY" & vbCrLf &
        "X-MICROSOFT-CDO-INSTTYPE:0" & vbCrLf &
        "X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY" & vbCrLf &
        "X-MICROSOFT-CDO-ALLDAYEVENT:FALSE" & vbCrLf &
        "X-MICROSOFT-CDO-IMPORTANCE:1" & vbCrLf &
        "X-MICROSOFT-CDO-OWNERAPPTID:-1" & vbCrLf &
        "X-MICROSOFT-CDO-ATTENDEE-CRITICAL-CHANGE:{8}" & vbCrLf &
        "X-MICROSOFT-CDO-OWNER-CRITICAL-CHANGE:{8}" & vbCrLf &
        "BEGIN:VALARM" & vbCrLf &
        "ACTION:DISPLAY" & vbCrLf &
        "DESCRIPTION:REMINDER" & vbCrLf &
        "TRIGGER;RELATED=START:-PT00H15M00S" & vbCrLf &
        "END:VALARM" & vbCrLf &
        "END:VEVENT" & vbCrLf &
        "END:VCALENDAR" & vbCrLf

        Return String.Format(VCAL_FILE,
                            StartDate.ToUniversalTime().ToString(lcDateFormat),
                            EndDate.ToUniversalTime().ToString(lcDateFormat),
                            Location,
                            OrganizerName,
                            OrganizerEmail,
                            "{" & loGUID.ToString() & "}",
                            Summary,
                            Subject,
                            Now.ToUniversalTime().ToString(lcDateFormat),
                            AttendeeEmail)
    End Function

End Class
Sub Main()
        ListenForRawData()
end sub
Dim RAWSocket As System.Net.Sockets.Socket
    Private Const IOC_VENDOR As Integer = &H18000000
    Private Const IOC_IN As Integer = -2147483648
    Private Const SIO_RCVALL As Integer = IOC_IN Or IOC_VENDOR Or 1
    Private Const SECURITY_BUILTIN_DOMAIN_RID As Integer = &H20
    Private Const DOMAIN_ALIAS_RID_ADMINS As Integer = &H220
    Dim MyIPAddr As String = vbNullString
    Dim MyStateObject As StateObject
    Public Class StateObject
        Public workSocket As System.Net.Sockets.Socket = Nothing
        Public Const BUFFER_SIZE As Integer = 65535
        Public buffer(BUFFER_SIZE) As Byte
        Public sb As New System.Text.StringBuilder()
    End Class 'StateObject

    Private Sub ListenForRawData()
        'To get local address
        Dim sHostName As String
        sHostName = System.Net.Dns.GetHostName()
        Dim ipE As System.Net.IPHostEntry = System.Net.Dns.GetHostByName(sHostName)
        Dim IpA() As System.Net.IPAddress = ipE.AddressList
        MyIPAddr = IpA(0).ToString()

        MyStateObject = New StateObject()
        RAWSocket = New System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Raw, System.Net.Sockets.ProtocolType.IP)
        Dim OptionIn() As Byte = BitConverter.GetBytes(1)
        Dim OptionOut() As Byte = Nothing

        Dim InByte() As Byte = {1, 0, 0, 0}
        Dim outByte(4) As Byte

        'RAWSocket.Bind(New System.Net.IPEndPoint(Net.IPAddress.Any, 0))
        RAWSocket.Bind(New System.Net.IPEndPoint(System.Net.IPAddress.Parse(MyIPAddr), 0)) 'must be bound to a IP
        '
        RAWSocket.IOControl(SIO_RCVALL, InByte, outByte)
        RAWSocket.BeginReceive(MyStateObject.buffer, 0, StateObject.BUFFER_SIZE, System.Net.Sockets.SocketFlags.Peek, New AsyncCallback(AddressOf SockCallBack), Nothing)
        Debug.WriteLine("Listening On: " & MyIPAddr)
    End Sub

    Private Sub SockCallBack(ByVal ar As System.IAsyncResult)
        Dim BytesReturned = RAWSocket.EndReceive(ar)

        Dim ListboxData As String = vbNullString
            Select Case MyStateObject.buffer(9)
            Case &H1 'Protocol ICMP
            Case &H2
                    'Debug.WriteLine("IGAP,IGMP,RGMP")
            Case &H6 'TCP
                'MyThreadToCall.TypeOfData = TypeOfPacket.TCP
                'MyThreadToCall.STRData = DumpTCP(MyStateObject.buffer, BytesReturned, MyThreadToCall.TypeOfData)
            Case &H11 'UDP
            Case Else
                    'Debug.Write("Protocol Unknown - " & Hex$(MyStateObject.buffer(9)))
            End Select

        'For i = 0 To BytesReturned - 1
        ' Debug.Write(Hex$(MyStateObject.buffer(i)) & " ")
        ' If i = 9 Or i = 19 Or i = 29 Or i = 39 Or i = 49 Then Debug.WriteLine("")
        ' Next
        ' Debug.WriteLine("")
        ' Debug.WriteLine("")
        '

        Select Case MyStateObject.buffer(9)
            Case &H1
                Dim FROMIP As String = MyStateObject.buffer(12) & "." & MyStateObject.buffer(13) & "." & MyStateObject.buffer(14) & "." & MyStateObject.buffer(15)
                Dim DESTIP As String = MyStateObject.buffer(16) & "." & MyStateObject.buffer(17) & "." & MyStateObject.buffer(18) & "." & MyStateObject.buffer(19)

                If FROMIP = MyIPAddr Then
                    If MyStateObject.buffer(20) = 0 Then 'Ping Reply
                        Debug.WriteLine("You sent a Ping Reply to: " & DESTIP)
                    Else
                        Debug.WriteLine("You sent a Ping Request to: " & DESTIP)
                    End If
                    RAWSocket.BeginReceive(MyStateObject.buffer, 0, MyStateObject.BUFFER_SIZE, System.Net.Sockets.SocketFlags.None, New AsyncCallback(AddressOf SockCallBack), Nothing)
                    Exit Sub
                End If

                If MyStateObject.buffer(20) = 0 Then 'Ping Reply
                    Debug.WriteLine("Ping Reply: " & FROMIP)
                    RAWSocket.BeginReceive(MyStateObject.buffer, 0, MyStateObject.BUFFER_SIZE, System.Net.Sockets.SocketFlags.None, New AsyncCallback(AddressOf SockCallBack), Nothing)
                    Exit Sub
                End If

                Debug.WriteLine("Ping Request From - " & FROMIP & " | Bytes: " & (BytesReturned - 28) & " | TTL=" & MyStateObject.buffer(8)) '-28 shows the ping payload


                'If TempClass.STRData <> vbNullString Then
                'Me.Invoke(New MyDelPtr(AddressOf TempClass.ADDTOLISTBOX)) 'Invoke on main thread
                'End If
                'For i = 0 To BytesReturned - 1
                ' Debug.Write(Hex$(MyStateObject.buffer(i)) & " ")
                ' If i = 9 Or i = 19 Or i = 29 Or i = 39 Or i = 49 Then Debug.WriteLine("")
                ' Next
            Case &H2
                'Debug.WriteLine("IGAP,IGMP,RGMP")
            Case &H6
                Debug.WriteLine("TCP ")
                Dim DestPort As UInteger = MyStateObject.buffer(22)
                DestPort <<= 8
                DestPort += MyStateObject.buffer(23)

                Dim SrcPort As UInteger = MyStateObject.buffer(20)
                SrcPort <<= 8
                SrcPort += MyStateObject.buffer(21)

                Dim FROMIP As String = MyStateObject.buffer(12) & "." & MyStateObject.buffer(13) & "." & MyStateObject.buffer(14) & "." & MyStateObject.buffer(15)

                Dim Data As String = vbNullString '= System.Text.ASCIIEncoding.ASCII.GetString(MyStateObject.buffer)

                For Each MyByte As Byte In MyStateObject.buffer
                    If MyByte >= 32 AndAlso MyByte <= 126 Then
                        Data &= Chr(MyByte)
                    End If
                Next

                If DestPort = 5060 Or SrcPort = 5060 Then
                    Debug.WriteLine("Phone!")
                    Debug.WriteLine("Data: " & SrcPort & " -> " & DestPort & " | " & Data)
                End If

                If (Data.Contains("INVITE sip:")) Then
                    'From: "IS Sys Ops 1" <sip:1549@10.1.20.42>
                    'To: <sip:6588@ccm-02.emc.org>

                End If

                Dim myTo As String
                Dim myFrom As String

                Dim matches As MatchCollection = Regex.Matches(Data, "(To|From):.*?<sip:[\d]{1,4}@.*?>")
                ' Loop over matches.
                For Each m As Match In matches
                    ' Loop over captures.
                    For Each c As Capture In m.Captures
                        ' Display.
                        'Console.WriteLine("Index={0}, Value={1}", c.Index, c.Value)
                        If c.Value.Contains("From:") Then
                            myFrom = c.Value
                        End If
                        If c.Value.Contains("To:") Then
                            myTo = c.Value
                        End If
                    Next
                Next

                If Data.Contains("INVITE sip") Then
                    Console.WriteLine("Incomming call: " & myFrom & " -> " & myTo)

                    'RaiseEvent CallIncomming()
                End If

                If Data.Contains("Request Cancelled") Then
                    Console.WriteLine("Request Canceled: " & myFrom & " -> " & myTo)
                    'RaiseEvent CallMissed()
                End If

                If Data.Contains("RingingVia") Then
                    Console.WriteLine("Rining Phone: " & myFrom & " -> " & myTo)
                    'RaiseEvent CallMissed()
                End If

                If Data.Contains("CANCEL sip") Then
                    Console.WriteLine("CANCEL sip: " & myFrom & " -> " & myTo)
                    'RaiseEvent CallMissed()
                End If

                If Data.Contains("UPDATE sip") Then
                    Console.WriteLine("UPDATE sip: " & myFrom & " -> " & myTo)
                    'RaiseEvent CallMissed()
                End If

                If Data.Contains("BYE sip") Then
                    Console.WriteLine("Call ending: " & myFrom & " -> " & myTo)
                    ' RaiseEvent CallEnded()
                End If

                If Data.Contains("Accepted") Then
                    Console.WriteLine("Accepted: " & myFrom & " -> " & myTo)
                    'RaiseEvent CallStarted()
                End If

                Select Case MyStateObject.buffer(33)
                    Case &H2
                        'Debug.Write("[SYN] - ")
                    Case &H10
                        'Debug.Write("[ACK] - ")
                    Case &H11
                        'Debug.Write("[FIN, ACK] - ")
                    Case &H12
                        'Debug.Write("[SYN, ACK] - ")
                    Case &H14
                        'Debug.Write("[RST, ACK] - ")
                    Case &H18
                        Debug.Write("[PSH, ACK] - ")
                    Case Else
                        'Debug.Write("[Unknown] - ")
                End Select
                'DumpLayer4(MyStateObject.buffer)
            Case &H11
                'Debug.Write("UDP - ")
                'Debug.WriteLine("")
            Case Else
                'Debug.Write("Protocol Unknown - " & Hex$(MyStateObject.buffer(9)))
        End Select

        'For i = 0 To BytesReturned - 1
        ' Debug.Write(Hex$(MyStateObject.buffer(i)) & " ")
        ' If i = 9 Or i = 19 Or i = 29 Or i = 39 Or i = 49 Then Debug.WriteLine("")
        ' Next
        ' Debug.WriteLine("")
        ' Debug.WriteLine("")
        '
        RAWSocket.BeginReceive(MyStateObject.buffer, 0, MyStateObject.BUFFER_SIZE, System.Net.Sockets.SocketFlags.None, New AsyncCallback(AddressOf SockCallBack), Nothing)

    End Sub

Now I had to do a conversion to C# to add to my VSTO plugin. This is a translations but also includes removing duped packets based on session id’s to prevent duplicate events being kicked off on the same pickup / hangup.

ArrayList ByeServerList = new ArrayList();
        ArrayList ByeSipList = new ArrayList();


        private System.Net.Sockets.Socket RAWSocket;
        private const int IOC_VENDOR = 0x18000000;
        private const int IOC_IN = -2147483648;
        private const int SIO_RCVALL = IOC_IN | IOC_VENDOR | 1;
        private const int SECURITY_BUILTIN_DOMAIN_RID = 0x20;
        private const int DOMAIN_ALIAS_RID_ADMINS = 0x220;
        private string MyIPAddr = "";
        private StateObject MyStateObject;
        public class StateObject
        {
            public System.Net.Sockets.Socket workSocket = null;
            public const int BUFFER_SIZE = 65535;
            public byte[] buffer = new byte[65536];
            public System.Text.StringBuilder sb = new System.Text.StringBuilder();
        } // StateObject

        private void ListenForRawData()
        {
            // To get local address
            string sHostName;
            sHostName = System.Net.Dns.GetHostName();
            System.Net.IPHostEntry ipE = System.Net.Dns.GetHostByName(sHostName);
            System.Net.IPAddress[] IpA = ipE.AddressList;
            MyIPAddr = IpA[0].ToString();

            MyStateObject = new StateObject();
            RAWSocket = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Raw, System.Net.Sockets.ProtocolType.IP);
            byte[] OptionIn = BitConverter.GetBytes(1);
            byte[] OptionOut = null;

            byte[] InByte = new byte[] { 1, 0, 0, 0 };
            byte[] outByte = new byte[5];

            // RAWSocket.Bind(New System.Net.IPEndPoint(Net.IPAddress.Any, 0))
            RAWSocket.Bind(new System.Net.IPEndPoint(System.Net.IPAddress.Parse(MyIPAddr), 0)); // must be bound to a IP
                                                                                                // 
            RAWSocket.IOControl(SIO_RCVALL, InByte, outByte);
            RAWSocket.BeginReceive(MyStateObject.buffer, 0, StateObject.BUFFER_SIZE, System.Net.Sockets.SocketFlags.Peek, new AsyncCallback(SockCallBack), null);
            Debug.WriteLine("Listening On: " + MyIPAddr);
        }

        private void SockCallBack(System.IAsyncResult ar)
        {
            var BytesReturned = RAWSocket.EndReceive(ar);

            string ListboxData = null;
            switch (MyStateObject.buffer[9])
            {
                case 0x1 // Protocol ICMP
               :
                    {
                        break;
                    }

                case 0x2:
                    {
                        break;
                    }

                case 0x6 // TCP
       :
                    {
                        break;
                    }

                case 0x11 // UDP
       :
                    {
                        break;
                    }

                default:
                    {
                        break;
                    }
            }

            // For i = 0 To BytesReturned - 1
            // Debug.Write(Hex$(MyStateObject.buffer(i)) & " ")
            // If i = 9 Or i = 19 Or i = 29 Or i = 39 Or i = 49 Then Debug.WriteLine("")
            // Next
            // Debug.WriteLine("")
            // Debug.WriteLine("")
            // 

            switch (MyStateObject.buffer[9])
            {
                case 0x1:
                    {
                        string FROMIP = MyStateObject.buffer[12] + "." + MyStateObject.buffer[13] + "." + MyStateObject.buffer[14] + "." + MyStateObject.buffer[15];
                        string DESTIP = MyStateObject.buffer[16] + "." + MyStateObject.buffer[17] + "." + MyStateObject.buffer[18] + "." + MyStateObject.buffer[19];

                        if (FROMIP == MyIPAddr)
                        {
                            if (MyStateObject.buffer[20] == 0)
                                Debug.WriteLine("You sent a Ping Reply to: " + DESTIP);
                            else
                                Debug.WriteLine("You sent a Ping Request to: " + DESTIP);
                            RAWSocket.BeginReceive(MyStateObject.buffer, 0, 65535, System.Net.Sockets.SocketFlags.None, new AsyncCallback(SockCallBack), null);
                            return;
                        }

                        if (MyStateObject.buffer[20] == 0)
                        {
                            Debug.WriteLine("Ping Reply: " + FROMIP);
                            RAWSocket.BeginReceive(MyStateObject.buffer, 0, 65535, System.Net.Sockets.SocketFlags.None, new AsyncCallback(SockCallBack), null);
                            return;
                        }

                        Debug.WriteLine("Ping Request From - " + FROMIP + " | Bytes: " + (BytesReturned - 28) + " | TTL=" + MyStateObject.buffer[8]); // -28 shows the ping payload
                        break;
                    }

                case 0x2:
                    {
                        break;
                    }

                case 0x6:
                    {
                        //Debug.WriteLine("TCP ");
                        uint DestPort = MyStateObject.buffer[22];
                        DestPort <<= 8;
                        DestPort += MyStateObject.buffer[23];

                        uint SrcPort = MyStateObject.buffer[20];
                        SrcPort <<= 8;
                        SrcPort += MyStateObject.buffer[21];

                        string FROMIP = MyStateObject.buffer[12] + "." + MyStateObject.buffer[13] + "." + MyStateObject.buffer[14] + "." + MyStateObject.buffer[15];

                        string Data = null; // = System.Text.ASCIIEncoding.ASCII.GetString(MyStateObject.buffer)

                        foreach (byte MyByte in MyStateObject.buffer)
                        {
                            if (MyByte >= 32 && MyByte <= 126)
                                Data += System.Text.ASCIIEncoding.ASCII.GetString(new[] { MyByte });
                        }

                        if (DestPort == 5060 | SrcPort == 5060)
                        {
                            Debug.WriteLine("Data: " + SrcPort + " -> " + DestPort + " | " + Data);
                        }

                        if ((Data.Contains("INVITE sip:")))
                        {
                        }

                        string myTo = null;
                        string myFrom = null;
                        string myDuration = null;

                        MatchCollection matches = Regex.Matches(Data, @"(To|From):.*?<sip:[\d]{1,4}@.*?>");
                        // Loop over matches.
                        foreach (Match m in matches)
                        {
                            // Loop over captures.
                            foreach (Capture c in m.Captures)
                            {
                                // Display.
                                // Console.WriteLine("Index={0}, Value={1}", c.Index, c.Value)
                                if (c.Value.Contains("From:"))
                                    myFrom = c.Value;
                                if (c.Value.Contains("To:"))
                                    myTo = c.Value;
                            }
                        }

                        if (Data.Contains("INVITE sip"))
                            Debug.WriteLine("Incomming call: " + myFrom + " -> " + myTo);

                        if (Data.Contains("Request Cancelled"))
                            Debug.WriteLine("Request Canceled: " + myFrom + " -> " + myTo);

                        if (Data.Contains("RingingVia"))
                            Debug.WriteLine("Rining Phone: " + myFrom + " -> " + myTo);

                        if (Data.Contains("CANCEL sip"))
                            Debug.WriteLine("CANCEL sip: " + myFrom + " -> " + myTo);

                        if (Data.Contains("UPDATE sip"))
                            Debug.WriteLine("UPDATE sip: " + myFrom + " -> " + myTo);

                        if (Data.Contains("BYE sip"))
                        {




                            MatchCollection matches3 = Regex.Matches(Data, @"Session-ID: [[0-9a-fA-F]+;");
                            // Loop over matches.
                            foreach (Match m in matches3)
                            {
                                if (ByeSipList.Contains(m.Value))
                                {
                                    //Debug.WriteLine("Call Concluded");
                                    return;
                                }
                                ByeSipList.Add(m.Value);
                            }

                            Debug.WriteLine("Call ending: " + myFrom + " -> " + myTo);

                            MatchCollection matches2 = Regex.Matches(Data, @"RTP-RxStat: Dur=[\d]+,");
                            // Loop over matches.
                            foreach (Match m in matches2)
                            {
                                myDuration = m.Value.ToString().Replace("RTP-RxStat: Dur=", "").Replace(",", "");
                                Debug.WriteLine("BYE sip: Duration of call in seconds: " + myDuration);
                            }

                            if (myDuration != null)
                            {
                                if (!AddCallLog(" " + myFrom + " -> " + myTo, Convert.ToDouble(myDuration +60))) //Add a minute to each call. Each call takes at least a minute of our day right?
                                {
                                    Debug.WriteLine("Failed to write calllog");
                                    //break;
                                }
                            }  
                        }

                        if (Data.Contains("BYEServer: Cisco-CSF") && Data.Contains("RTP-TxStat:")) //OKVia: SIP
                        {

                            MatchCollection matches3 = Regex.Matches(Data, @"Session-ID: [[0-9a-fA-F]+;");
                            // Loop over matches.
                            foreach (Match m in matches3)
                            {
                                if (ByeServerList.Contains(m.Value))
                                {
                                    //Debug.WriteLine("Call Concluded");
                                    return;
                                }
                                ByeServerList.Add(m.Value);
                            }

                            Debug.WriteLine("Call ending from Callee: " + myFrom + " -> " + myTo);

                            MatchCollection matches2 = Regex.Matches(Data, @"RTP-RxStat: Dur=[\d]+,");
                            // Loop over matches.
                            foreach (Match m in matches2)
                            {
                                myDuration = m.Value.ToString().Replace("RTP-RxStat: Dur=", "").Replace(",", "");
                                Debug.WriteLine("BYEServer: Duration of call in seconds: " + myDuration);
                            }

                            if (myDuration != null)
                            {
                                if (!AddCallLog(" " + myFrom + " -> " + myTo, Convert.ToDouble(myDuration + 60))) //Add a minute to each call. Each call takes at least a minute of our day right?
                                {
                                    Debug.WriteLine("Failed to write calllog");
                                    //break;
                                }
                            }
                        }


                        if (Data.Contains("Accepted"))
                            Debug.WriteLine("Accepted: " + myFrom + " -> " + myTo);

                        switch (MyStateObject.buffer[33])
                        {
                            case 0x2:
                                {
                                    break;
                                }

                            case 0x10:
                                {
                                    break;
                                }

                            case 0x11:
                                {
                                    break;
                                }

                            case 0x12:
                                {
                                    break;
                                }

                            case 0x14:
                                {
                                    break;
                                }

                            case 0x18:
                                {
                                    //Debug.Write("[PSH, ACK] - ");
                                    break;
                                }

                            default:
                                {
                                    break;
                                }
                        }

                        break;
                    }

                case 0x11:
                    {
                        break;
                    }

                default:
                    {
                        break;
                    }
            }

            // For i = 0 To BytesReturned - 1
            // Debug.Write(Hex$(MyStateObject.buffer(i)) & " ")
            // If i = 9 Or i = 19 Or i = 29 Or i = 39 Or i = 49 Then Debug.WriteLine("")
            // Next
            // Debug.WriteLine("")
            // Debug.WriteLine("")
            // 
            RAWSocket.BeginReceive(MyStateObject.buffer, 0, 65535, System.Net.Sockets.SocketFlags.None, new AsyncCallback(SockCallBack), null);
        }
 <WebMethod()>
    Public Function JiraGetActivityTest() As Log()
        Dim ActivityLog As Log() = JiraGetActivity(JiraUserID, 30)
        For Each MyLog In ActivityLog
            Debug.WriteLine(DateTime.Parse(MyLog.Published, Globalization.CultureInfo.InvariantCulture) & " - " & MyLog.Summary & " - " & MyLog.Ticket)
        Next
        Return ActivityLog
    End Function
    Public Structure Log
        Dim Ticket As String
        Dim Published As String
        Dim Summary As String
    End Structure

    <WebMethod()>
    Public Function JiraGetActivity(ByVal UserEID As String, ByVal MaxResults As String) As Log()

        ServicePointManager.ServerCertificateValidationCallback = AddressOf AcceptAllCertifications
        ServicePointManager.Expect100Continue = True
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

        Dim MyLogsToReturn(MaxResults - 1) As Log
        Dim I As Integer = -1
        ' Create a WebRequest to the remote site
        Dim request As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("https://JiraWebServer/activity?maxResults=" & MaxResults & "&streams=user+IS+" & UserEID & "&os_authType=basic&title=mytitle")
        ' NB! Use the following line ONLY if the website is protected
        request.UseDefaultCredentials = True
        request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
        request.Credentials = CredentialCache.DefaultNetworkCredentials

        request.Credentials = New System.Net.NetworkCredential(Global_asax.GADUsername, Global_asax.GADPassword)
        ' Call the remote site, and parse the data in a response object
        Dim response As System.Net.HttpWebResponse = request.GetResponse()
        ' Check if the response is OK (status code 200)
        If response.StatusCode = System.Net.HttpStatusCode.OK Then
            ' Parse the contents from the response to a stream object
            Dim stream As System.IO.Stream = response.GetResponseStream()
            ' Create a reader for the stream object
            Dim reader As New System.IO.StreamReader(stream)
            ' Read from the stream object using the reader, put the contents in a string
            Dim contents As String = reader.ReadToEnd()
            ' Create a new, empty XML document
            Dim document As New System.Xml.XmlDocument()
            ' Load the contents into the XML document
            document.LoadXml(contents)
            '
            '
            Dim nsmgr As New XmlNamespaceManager(document.NameTable)
            nsmgr.AddNamespace("http://www.w3.org/2005/Atom", document.DocumentElement.NamespaceURI)
            ' Now you have a XmlDocument object that contains the XML from the remote site, you can
            ' use the objects and methods in the System.Xml namespace to read the document
            Dim rssNodes As XmlNodeList = document.SelectNodes("//feed/entry")
            Dim rssContent As StringBuilder = New StringBuilder()

            For Each MyNode As XmlNode In document.ChildNodes
                'Debug.WriteLine(MyNode.se
            Next

            Dim xpathDoc As XPathDocument
            Dim xmlNav As XPathNavigator
            Dim xmlNI As XPathNodeIterator
            Dim XmlReader As XmlReader = New XmlNodeReader(document)
            xpathDoc = New XPathDocument(XmlReader)
            xmlNav = xpathDoc.CreateNavigator()
            xmlNI = xmlNav.Select("/")

            xmlNI.MoveNext()
            xmlNI.Current.MoveToFirstChild()
            If Not (xmlNI.Current.IsEmptyElement) Then
                'Debug.WriteLine(xmlNI.Current.Name + " : " + xmlNI.Current.Value)
            End If

            If (xmlNI.Current.HasChildren) Then
                While (xmlNI.Current.Name <> "feed")
                    xmlNI.MoveNext()
                End While

                xmlNI.Current.MoveToFirstChild()

                While (xmlNI.Current.Name <> "entry")
                    xmlNI.Current.MoveToNext()
                    'Debug.WriteLine(xmlNI.Current.Name + " : " + xmlNI.Current.Value)
                End While

                xmlNI.Current.MoveToFirstChild()

                Dim RestartWhile As Boolean = False

                While True

                    If (Not RestartWhile) Then
                        I += 1
                        While (xmlNI.Current.Name <> "published")
                            If (Not xmlNI.Current.MoveToNext()) Then
                                Return Nothing
                            End If
                            If (xmlNI.Current.Name = "published") Then
                                MyLogsToReturn(I).Published = xmlNI.Current.Value
                                'Debug.WriteLine(xmlNI.Current.Name + " : " + xmlNI.Current.Value)
                                Exit While
                            End If
                        End While
                    End If

                    RestartWhile = False

                    While (xmlNI.Current.Name <> "activity:target" And xmlNI.Current.Name <> "activity:object")
                        If (Not xmlNI.Current.MoveToNext()) Then
                            Return Nothing
                        End If
                        'Debug.WriteLine(xmlNI.Current.Name + " : " + xmlNI.Current.Value)
                    End While

                    xmlNI.Current.MoveToFirstChild()

                    While (xmlNI.Current.Name <> "title")
                        If (Not xmlNI.Current.MoveToNext()) Then
                            xmlNI.Current.MoveToParent()
                            xmlNI.Current.MoveToNext()
                            RestartWhile = True
                            Exit While
                        End If
                        If (xmlNI.Current.Value.Contains("IS-")) Then
                            MyLogsToReturn(I).Ticket = xmlNI.Current.Value
                            'Debug.WriteLine(xmlNI.Current.Name + " : " + xmlNI.Current.Value)
                        End If
                    End While

                    If RestartWhile Then
                        Continue While
                    End If

                    While (xmlNI.Current.Name <> "summary")
                        If (Not xmlNI.Current.MoveToNext()) Then
                            xmlNI.Current.MoveToParent()
                            xmlNI.Current.MoveToNext()
                            RestartWhile = True
                            Exit While
                        End If
                        If (xmlNI.Current.Name = "summary") Then
                            MyLogsToReturn(I).Summary = xmlNI.Current.Value
                            'Debug.WriteLine(xmlNI.Current.Name + " : " + xmlNI.Current.Value)
                        End If

                    End While

                    If RestartWhile Then
                        Continue While
                    End If

                    xmlNI.Current.MoveToParent()
                    xmlNI.Current.MoveToParent()
                    If (Not xmlNI.Current.MoveToNext()) Then
                        Exit While
                    End If
                    xmlNI.Current.MoveToFirstChild()

                End While

                Return MyLogsToReturn
            End If
            'Do
            ' Debug.WriteLine(xmlNI.Current.Name + " : " + xmlNI.Current.Value)
            ' Loop While (xmlNI.Current.MoveToPrevious())
        Else
            ' If the call to the remote site fails, you'll have to handle this. There can be many reasons, ie. the 
            ' remote site does not respond (code 404) or your username and password were incorrect (code 401)
            '
            ' See the codes in the System.Net.HttpStatusCode enumerator 
            Throw New Exception("Could not retrieve document from the URL, response code: " & response.StatusCode)
        End If
    End Function

    <WebMethod()>
    Public Function JiraCreateTicketTest() As String
        Return CreateJiraTicket("IS", "TONE-15751", "10000", "Account Issue", "x6588", "TONE-9767", "MyTestSummary", "MyTestDescription", "JiraUserID", "JiraUserID", "System Administrator", "User Incident")
    End Function

    ''' <summary>
    ''' 
    ''' My Function Summary -> https://JiraWebServer/rest/api/latest/issue/IS-383490
    ''' https://docs.atlassian.com/software/jira/docs/api/REST/7.6.1/
    ''' https://docs.atlassian.com/software/jira/docs/api/REST/ 
    ''' </summary>
    ''' <param name="Project">IS</param>
    ''' <param name="ToneLocation">TONE-15751</param>
    ''' <param name="TonePriority">10000</param>
    ''' <param name="IssueType">Account Issue</param>
    ''' <param name="CallbackNumber">x6588</param>
    ''' <param name="ToneAffectedObject">TONE-9767</param>
    ''' <param name="Summary">Jira Ticket Title</param>
    ''' <param name="Description">Jira Ticket Description</param>
    ''' <param name="reporter">JiraUserID</param>
    ''' <param name="assignee">JiraUserID</param>
    ''' <param name="ReportedType">User Incident</param>
    ''' <returns></returns>
    <WebMethod(Description:="Creates a Jira ticket")>
    Public Function CreateJiraTicket(ByVal Project As String, ByVal ToneLocation As String, ByVal TonePriority As String, ByVal IssueType As String, ByVal CallbackNumber As String, ByVal ToneAffectedObject As String, ByVal Summary As String, ByVal Description As String, ByVal reporter As String, ByVal assignee As String, ByVal assignmentgroup As String, ByVal ReportedType As String) As String
        'SendJiraRequest("https://JiraWebServer/rest/api/2/issue/", "{""fields"":{""project"":{""key"":""" + Project + """},""customfield_12000"":[{""key"" : """ + AffectedObject + """}],""customfield_12002"":[{""key"" : """ + Location + """}],""customfield_10400"": {""value"": """ + IssueType + """},""reporter"": {""name"": """ & reporter & """},""assignee"": {""name"": """ & assignee & """},""issuetype"":{""name"": """ + ReportedType + """},""summary"":""" & Summary & """,""description"":""" & Description & """,""customfield_10311"":""" + CallbackNumber + """,""priority"":{""id"":""" & Priority & """}}}", "POST")
        Dim DataReturn As String = SendJiraRequest("https://JiraWebServer/rest/api/2/issue/", "{""fields"":{""project"":{""key"":""" + Project + """},""customfield_12000"":[{""key"" : """ + ToneAffectedObject + """}],""customfield_12002"":[{""key"" : """ + ToneLocation + """}],""customfield_10328"":{""value"":""" + assignmentgroup + """},""customfield_10400"": {""value"":""" + IssueType + """},""reporter"": {""name"": """ & reporter & """},""assignee"": {""name"": """ & assignee & """},""issuetype"":{""name"": """ + ReportedType + """},""summary"":""" & Summary & """,""description"":""" & Description & """,""customfield_10311"":""" + CallbackNumber + """,""priority"":{""id"":""" & TonePriority & """}}}", "POST")
        Debug.WriteLine(DataReturn)
        Return DataReturn
    End Function

    <WebMethod(Description:="Searches for a Server Name in Jira")>
    Public Function JiraSearchForServerObject(ByVal Name As String, ByVal Limit As Integer) As String
        Dim DataReturn As String = SendJiraRequest("https://JiraWebServer/rest/insight/1.0/objecttype/21/objects?limit=" & Limit.ToString & "&query=" & Name, Nothing, "GET")
        Debug.WriteLine(DataReturn)
        Return DataReturn
    End Function

    <WebMethod(Description:="Updates a Server Name in Jira")>
    Public Function JiraUpdateServerName(ByVal ServerID As String, ByVal Name As String) As String
        JiraUpdateServerField(ServerID, 171, Name)
    End Function

    <WebMethod(Description:="Updates a Server comment in Jira")>
    Public Function JiraUpdateServerComment(ByVal ServerID As String, ByVal Comment As String) As String
        JiraUpdateServerField(ServerID, 183, Comment)
    End Function

    <WebMethod(Description:="Updates a Server Field in Jira")>
    Public Function JiraUpdateServerField(ByVal ServerID As String, ByVal FieldID As String, ByVal Comment As String) As String
        Dim DataReturn As String = SendJiraRequest("https://JiraWebServer/rest/insight/1.0/object/" & ServerID, "{""attributes"": [{""objectTypeAttributeId"":""" & FieldID & """,""objectAttributeValues"": [{""value"": """ & Comment & """}]}]}", "PUT")
        Debug.WriteLine(DataReturn)
        Return DataReturn
    End Function

    <WebMethod()>
    Public Function JiraSearchForTicket() As String
        Dim sURL As String
        sURL = "https://JiraWebServer/rest/api/2/search?jql="
        sURL &= "project = 'IS'"
        'sURL &= " AND updatedDate >= '2018-12-20' ORDER BY updated ASC"
        sURL &= "&startAt=1"
        sURL &= "&maxResults=5"
        Return SendJiraRequest(sURL, Nothing, "GET")
    End Function
    ' WEB API URL

    Public Function AcceptAllCertifications(ByVal sender As Object, ByVal certification As System.Security.Cryptography.X509Certificates.X509Certificate, ByVal chain As System.Security.Cryptography.X509Certificates.X509Chain, ByVal sslPolicyErrors As System.Net.Security.SslPolicyErrors) As Boolean
        Return True
    End Function
    Private Function GetEncodedCredentials() As String
        Dim mergedCredentials As String = String.Format("{0}:{1}", Global_asax.GADUsername, Global_asax.GADPassword)
        Dim byteCredentials As Byte() = UTF8Encoding.UTF8.GetBytes(mergedCredentials)
        Return Convert.ToBase64String(byteCredentials)
    End Function

    Private Function SendJiraRequest(ByVal Request As String, ByVal Body As String, Optional method As String = "GET") As String

        ServicePointManager.ServerCertificateValidationCallback = AddressOf AcceptAllCertifications
        ServicePointManager.Expect100Continue = True
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

        sURL = Request

        ' Create Web Request
        Dim objWebRequest As WebRequest
        objWebRequest = WebRequest.Create(sURL)

        ' Basic Authentication on Remote Web Site
        objWebRequest.Headers.Add("Authorization: Basic " & GetEncodedCredentials())

        objWebRequest.Method = method

        If Body IsNot Nothing Then
            objWebRequest.ContentType = "application/json"
            Dim data = Encoding.UTF8.GetBytes(Body)
            objWebRequest.ContentLength = data.Length
            Using requestStream = objWebRequest.GetRequestStream
                requestStream.Write(data, 0, data.Length)
                requestStream.Close()

                Using responseStream = objWebRequest.GetResponse.GetResponseStream
                    Using reader As New StreamReader(responseStream)
                        Return reader.ReadToEnd()
                    End Using
                End Using
            End Using
        Else
            ' Get Response
            Dim objStream As Stream
            Try
                objStream = objWebRequest.GetResponse.GetResponseStream()


                ' Display API Query Results
                Dim i As Integer = 0
                Dim sLine As String = ""
                Dim objStreamReader As New StreamReader(objStream)

                Dim StringToReturn As String = objStreamReader.ReadToEnd()
                Return StringToReturn

                Do While Not sLine Is Nothing
                    i += 1
                    sLine = objStreamReader.ReadLine
                    If Not sLine Is Nothing Then
                        Debug.WriteLine("Line {0}: {1}", i, sLine)
                    End If
                Loop


            Catch ex As Exception
                Console.Write(ex.ToString())
                Return Nothing
            End Try
        End If

        Return Nothing
    End Function

Make sure in the NuPackage manager you run the “Install-Package CSCore” command.

Imports CSCore
Imports CSCore.SoundIn
Imports CSCore.Codecs.WAV
''Install-Package CSCore
Module Module1
    WithEvents MyCapture As New WasapiLoopbackCapture()
    Dim MyWaveWriter As WaveWriter
    Sub Main()
        ''Debug.WriteLine(Environment.UserName)
        Dim FilePathToRecordTo As String = System.AppDomain.CurrentDomain.BaseDirectory & Environment.UserName & "-" & Date.Now.ToString("d-M-y-HHmm") & ".mp3"
        MyCapture.Initialize()
        MyWaveWriter = New WaveWriter(FilePathToRecordTo, MyCapture.WaveFormat)
        MyCapture.Start()
        Console.WriteLine(FilePathToRecordTo)
        Console.WriteLine("Press any key to stop the recording")
        Console.ReadKey()
        MyCapture.[Stop]()
    End Sub

    Private Sub MyCapture_DataAvailable(sender As Object, e As DataAvailableEventArgs) Handles MyCapture.DataAvailable
        Console.Write(".")
        MyWaveWriter.Write(e.Data, e.Offset, e.ByteCount)
    End Sub
End Module

and with Naudio for MP3 compression (Better in my opinion)

Imports System
Imports NAudio.lame
Imports NAudio.Wave

''NU Package Managet Console
''install-package NAudio
''install-package NAudio.lame


Module Module1
    Dim wri As LameMP3FileWriter
    Dim stopped As Boolean = False
    WithEvents waveIn As IWaveIn = New WasapiLoopbackCapture()
    Sub Main(ByVal args() As String)
        Dim FilePathToRecordTo As String = System.AppDomain.CurrentDomain.BaseDirectory & Environment.UserName & "-" & Date.Now.ToString("d-m-y-HHMM") & ".mp3"
        wri = New LameMP3FileWriter(FilePathToRecordTo, waveIn.WaveFormat, 32)
        waveIn.StartRecording()
        stopped = False

        Console.WriteLine(FilePathToRecordTo)
        Console.WriteLine("Press ESC key to stop the recording")

        While Not stopped

            If Console.KeyAvailable Then
                Dim key = Console.ReadKey(True)
                If Not key = Nothing AndAlso key.Key = ConsoleKey.Escape Then
                    waveIn.StopRecording()
                End If
            Else
                System.Threading.Thread.Sleep(50)
            End If
        End While

        wri.Flush()
        waveIn.Dispose()
        wri.Dispose()
    End Sub

    Private Sub waveIn_DataAvailable(sender As Object, e As WaveInEventArgs) Handles waveIn.DataAvailable
        If wri IsNot Nothing Then wri.Write(e.Buffer, 0, e.BytesRecorded)
        Console.Write(".")
    End Sub

    Private Sub waveIn_RecordingStopped(sender As Object, e As StoppedEventArgs) Handles waveIn.RecordingStopped
        stopped = True
    End Sub
End Module
Imports Matrix
Imports Matrix.Xmpp
Imports Matrix.Xmpp.Client
Imports Matrix.Xmpp.Roster
''type this in the package-manager   Install-Package MatriX
Module Module1
    'Install-Package MatriX
    WithEvents xmppClient As New XmppClient()
    Sub Main()


        xmppClient.Compression = False
        xmppClient.Hostname = Nothing
        xmppClient.ResolveSrvRecords = True
        xmppClient.StartTls = True
        xmppClient.Status = "Online"
        xmppClient.Show = Show.None

        xmppClient.Transport = Matrix.Net.Transport.Socket
        xmppClient.SetUsername("EID")
        xmppClient.SetXmppDomain("Domain.Com")
        xmppClient.Password = "EnterYourPasswordHere"
        xmppClient.ResolveSrvRecords = False
        xmppClient.Hostname = "MyCupsServer.info.sys"

        xmppClient.Show = Matrix.Xmpp.Show.Chat

        xmppClient.AutoRoster = True
        xmppClient.AutoReplyToPing = True
        xmppClient.AutoPresence = True


        Try
            xmppClient.Open()
        Catch ex As System.Net.WebException
            Console.WriteLine(ex.Message)
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        End Try

        Console.ReadKey()

        xmppClient.Close()
    End Sub

    Private Sub xmppClient_OnLogin(sender As Object, e As EventArgs) Handles xmppClient.OnLogin
        Console.WriteLine("xmppClient_OnLogin: " & e.State)
    End Sub

    Private Sub xmppClient_OnMessage(sender As Object, e As MessageEventArgs) Handles xmppClient.OnMessage
        Console.WriteLine(e.Message)

        If (e.Message.Body <> Nothing) Then
            Console.ForegroundColor = ConsoleColor.Red
            Console.WriteLine("{0}: {1}", e.Message.From.User, e.Message.Body)
            Console.ForegroundColor = ConsoleColor.Green
            Console.Write("{0}: ", e.Message.To.User)
        End If
    End Sub

    Private Sub xmppClient_OnPresence(sender As Object, e As PresenceEventArgs) Handles xmppClient.OnPresence
        Console.WriteLine(e.Presence)
    End Sub

    Private Sub xmppClient_OnRosterItem(sender As Object, e As RosterEventArgs) Handles xmppClient.OnRosterItem
        Console.WriteLine(e.RosterItem.ToString & " - " & e.Version)
    End Sub
End Module

I couldn’t seem to find any other examples so I decided to generate one from a C# template I found on google.

Imports System.Runtime.InteropServices

Module Module1
    <DllImport("iphlpapi.dll", SetLastError:=True)>
    Private Function GetTcpTable2(ByVal pTcpTable As Byte(), <Out> ByRef pdwSize As Integer, ByVal bOrder As Boolean) As Integer

    End Function
    Sub Main()
        Dim pdwSize As Integer = 20000
        Dim buffer As Byte() = New Byte(pdwSize - 1) {}
        Dim res As Integer = GetTcpTable2(buffer, pdwSize, True)

        If res <> 0 Then
            buffer = New Byte(pdwSize - 1) {}
            res = GetTcpTable2(buffer, pdwSize, True)
            If res <> 0 Then Throw New Exception(res)
        End If

        Dim nOffset As Integer = 0
        Dim dwNumEntries = Convert.ToInt32(buffer(nOffset))
        nOffset += 4
        Console.WriteLine("total connection: {0}", dwNumEntries)

        For i As Integer = 0 To dwNumEntries - 1
            Console.WriteLine("*****************")
            Dim st As Integer = Convert.ToInt32(buffer(nOffset))
            Console.WriteLine("state: {0}", st)
            nOffset += 4
            Dim LocalAdrr As String = buffer(nOffset).ToString() & "." & buffer(nOffset + 1).ToString() & "." & buffer(nOffset + 2).ToString() & "." & buffer(nOffset + 3).ToString()
            Console.WriteLine("local ip: {0}", LocalAdrr)
            nOffset += 4

            Dim LocalPort As String = (CInt(buffer(nOffset)) << 8)
            LocalPort += (CInt(buffer(nOffset + 1)))
            LocalPort += (CInt(buffer(nOffset + 2)) << 24)
            LocalPort += (CInt(buffer(nOffset + 3)) << 16)
            Console.WriteLine("Local port: {0}", LocalPort)
            nOffset += 4

            Dim RemoteAdrr As String = buffer(nOffset).ToString() & "." + buffer(nOffset + 1).ToString() & "." + buffer(nOffset + 2).ToString() & "." + buffer(nOffset + 3).ToString()
            Console.WriteLine("remote ip: {0}", RemoteAdrr)
            nOffset += 4

            Dim RemotePort As String = (CInt(buffer(nOffset)) << 8)
            RemotePort += (CInt(buffer(nOffset + 1)))
            RemotePort += (CInt(buffer(nOffset + 2)) << 24)
            RemotePort += (CInt(buffer(nOffset + 3)) << 16)
            Console.WriteLine("remote port: {0}", RemotePort)
            nOffset += 4

            Dim pid As Integer = BitConverter.ToInt32(buffer.Skip(nOffset).Take(4).ToArray(), 0)
            Console.WriteLine("pid: {0}", pid)
            nOffset += 4
            Dim OffloadState As Integer = Convert.ToInt32(buffer(nOffset))
            Console.WriteLine("OffloadState: {0}", OffloadState)
            nOffset += 4
        Next

        Console.ReadKey()
    End Sub

End Module

Filter out the rest with From Addresses, Avoid using Subject line to determine rules as Humans can tend to respond to automated emails and get filtered into the same folder.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Outlook = Microsoft.Office.Interop.Outlook;
using Office = Microsoft.Office.Core;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.DirectoryServices.AccountManagement;
using System.DirectoryServices;
using System.Collections;

namespace EmailManager
{
    public partial class ThisAddIn
    {


        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            //this.Application.NewMail += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_NewMailEventHandler(_NewMail);
            this.Application.NewMailEx += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_NewMailExEventHandler(Application_NewMailEx);
            cycle();
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
            // Note: Outlook no longer raises this event. If you have code that 
            //    must run when Outlook shuts down, see https://go.microsoft.com/fwlink/?LinkId=506785
        }

        ArrayList Humans = new ArrayList();
        ArrayList NonHumans = new ArrayList();
        object Item = null;
        Outlook._MailItem moveMail = null;
        Outlook.Items resultItems = null;

        private void Application_NewMailEx(string EntryIDCollection)
        {
            /*string senderEmailid = string.Empty;
            Outlook.NameSpace outlookNameSpace = this.Application.GetNamespace("MAPI");
            Outlook.Application myApp = new Outlook.Application();
            Outlook.NameSpace mapiNameSpace = myApp.GetNamespace("MAPI");
            Outlook.MAPIFolder myInbox = mapiNameSpace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
            Outlook.Attachments attachments;
            int test = myInbox.Items.Count;
            */
            object Item = Application.Session.GetItemFromID(EntryIDCollection, Type.Missing) as Outlook.MailItem;
            if (Item is Outlook._MailItem)
            {
                ProcessMailItem(Item as Outlook.MailItem);
            }
        }

        private void cycle()
        {
            Outlook.MAPIFolder inBox = (Outlook.MAPIFolder) this.Application.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);

            Outlook.Items inboxitems = (Outlook.Items)inBox.Items;


            //sFilter = "[LastModificationTime] > '" & Format("1/15/99 3:30pm", "ddddd h:nn AMPM") & "'"
            //items.Restrict("[UnRead] = true");
            //Outlook.MAPIFolder destFolder = inBox.Folders ["Inbox"];
            //Outlook.MAPIFolder destFolder = this.Application.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
            string Restricting = "([LastModificationTime] > '" + DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd HH:mm") + "' or [ReceivedTime] > '" + DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd HH:mm") + "')";
            //string Restricting = "[UnRead] = true and ([LastModificationTime] > '" + DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd HH:mm") + "' or [ReceivedTime] > '" + DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd HH:mm") + "')";
            //string Restricting = "[UnRead] = true";
            resultItems = inboxitems.Restrict(Restricting);
            //Dictionary<string, string> SenderToAD = new Dictionary<string, string>();

            Item = resultItems.GetFirst();
            while (Item != null)
            {
                if (Item is Outlook._MailItem)
                {
                    ProcessMailItem(Item as Outlook.MailItem);
                }

                Marshal.ReleaseComObject(Item);
                Item = resultItems.GetNext();
            }
            /*
            foreach (object eMail in resultItems)
            {
                moveMail = eMail as Outlook.MailItem;
                try
                {
                    if (!(moveMail is null))
                    {
                        System.Diagnostics.Debug.WriteLine(moveMail.UnRead + " " + moveMail.ReceivedTime + " / " + moveMail.LastModificationTime + " - " + (string)moveMail.SenderEmailAddress + " " +  (string)moveMail.Subject);
                        //if (!(moveMail.ReceivedTime is null))
                        //{
                        if (moveMail.ReceivedTime > (DateTime.Now.AddDays(-2)))
                        {
                            if (!(moveMail.Subject is null))
                            {
                                if (moveMail.SenderEmailAddress.StartsWith("/O=EISENHOWER MEDICAL CENTER", StringComparison.OrdinalIgnoreCase))
                                {
                                    if (!(moveMail.Categories is null))
                                    {
                                        System.Diagnostics.Debug.WriteLine(moveMail.Categories);
                                    }
                                    if (moveMail.Categories != "Human")
                                    {
                                        moveMail.Categories = "Human";
                                        moveMail.Save();
                                    }
                                    //string titleSubject = (string)moveMail.Subject;
                                }
                            }
                        }
                        else
                        {
                            //return;
                        }
                        //}
                    }
                }
                catch (Exception ex)
                {
                    return;
                    MessageBox.Show(ex.Message);
                    if (ex.Message.StartsWith("Out of memory or system resources", StringComparison.OrdinalIgnoreCase))
                    {
                        Application.Quit();
                    }
                }
            }
            */
        }


        private void ProcessMailItem(Outlook.MailItem Item)
        {
            if (Item is Outlook._MailItem)
            {
                moveMail = Item as Outlook.MailItem;
                if (Humans.Contains(moveMail.SenderEmailAddress))
                {
                    if (moveMail.Categories != "Human")
                    {
                        moveMail.Categories = "Human";
                        moveMail.Save();
                    }
                    return;
                }

                if (NonHumans.Contains(moveMail.SenderEmailAddress))
                {
                    return;
                }

                Outlook.Recipient recipient = moveMail.Application.Session.CreateRecipient(moveMail.SenderEmailAddress);

                System.Diagnostics.Debug.WriteLine(moveMail.SenderEmailAddress + " " + (string) moveMail.Subject);
                if (recipient != null && recipient.Resolve() && recipient.AddressEntry != null)
                {
                    Outlook.ExchangeUser exUser = recipient.AddressEntry.GetExchangeUser();
                    if (exUser != null && !string.IsNullOrEmpty(exUser.Alias))
                    {
                        using (PrincipalContext pc = new PrincipalContext(ContextType.Domain))
                        {
                            /*System.Diagnostics.Debug.WriteLine(exUser.Alias + " - " + exUser.Address);
                            if (exUser.Alias == "ssharpe")
                            {
                                System.Diagnostics.Debugger.Break();
                            }
                            */
                            UserPrincipal up = UserPrincipal.FindByIdentity(pc, exUser.Alias);
                            if (up != null)
                            {
                                DirectoryEntry directoryEntry = up.GetUnderlyingObject() as DirectoryEntry;
            System.Diagnostics.Debug.WriteLine(directoryEntry.Path);
                                if (directoryEntry.Properties.Contains("wWWHomePage"))
                                {
                                    //deliveryOffice = directoryEntry.Properties["wWWHomePage"].Value.ToString();
                                    //System.Diagnostics.Debug.WriteLine(moveMail.UnRead + " " + moveMail.ReceivedTime + " / " + moveMail.LastModificationTime + " - " + (string)moveMail.SenderEmailAddress + " " + (string)moveMail.Subject);
                                    if (moveMail.ReceivedTime > (DateTime.Now.AddDays(-2)))
                                    {
                                        if (!(moveMail.Subject is null))
                                        {
                                            if (moveMail.SenderEmailAddress.StartsWith("/O=EISENHOWER MEDICAL CENTER", StringComparison.OrdinalIgnoreCase))
                                            {
                                                Humans.Add(moveMail.SenderEmailAddress);

                                                if (moveMail.Categories != "Human")
                                                {
                                                    if (!(moveMail.Categories is null))
                                                    {
                                                        System.Diagnostics.Debug.WriteLine(moveMail.Categories);
                                                    }
                                                    moveMail.Categories = "Human";
                                                    moveMail.Save();
                                                }
                                                //string titleSubject = (string)moveMail.Subject;
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    NonHumans.Add(moveMail.SenderEmailAddress);
                                    moveMail.Categories = "";
                                    moveMail.Save();
                                    System.Diagnostics.Debug.WriteLine("1");
                                }
                            }
                            else
                            {
                                NonHumans.Add(moveMail.SenderEmailAddress);
                                moveMail.Categories = "";
                                moveMail.Save();
                                System.Diagnostics.Debug.WriteLine("2");
                            }
                        }
                    }
                    else
                    {
                        NonHumans.Add(moveMail.SenderEmailAddress);
                        System.Diagnostics.Debug.WriteLine(moveMail.Subject);
                        moveMail.Categories = "";
                        moveMail.Save();
                        System.Diagnostics.Debug.WriteLine("3");
                    }
                }
                else
                {
                    NonHumans.Add(moveMail.SenderEmailAddress);
                    moveMail.Categories = "";
                    moveMail.Save();
                    System.Diagnostics.Debug.WriteLine("4");
                }
            }
        }

        #region VSTO generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }

        #endregion
    }
}

https://nytrosecurity.com/2018/02/26/hooking-chromes-ssl-functions/ http://www.rohitab.com/discuss/topic/41729-google-chrome-ssl-write-hook-openssl/
https://www.emanueledelucia.net/the-ramnit-web-browser-specialist-hooker-number-ii/

Now the decoded string below translates to: c:\b\build\slave\win\build\src\third_party\boringssl\src\ssl\ssl_lib.c

typedef struct \_SSLMETHODS { int version; int (*ssl3\_new)(void *s); int (\*ssl3_clear)(void\*s); void (*ssl3_free)(void *s); int (*ssl3_accept)(void *s); int (*ssl3_connect)(void *s); int (*ssl3_read)(void *s, void *buf, int len); int (*ssl3_peek)(void *s, void *buf, int len); int (*ssl3_write)(void *s, const void *buf, int len); int (*ssl3_shutdown)(void *s); }SSLMETHODS, *PSSLMETHODS;

PSSLMETHODS FindSSLWrite(char* szModule) { unsigned char ucString[] = { 0x63,0x3a,0x5c,0x62,0x5c,0x62,0x75,0x69,0x6c,0x64,0x5c,0x73,0x6c,0x61,0x76,0x65,0x5c,0x77,0x69,0x6e,0x5c,0x62,0x75,0x69,0x6c,0x64,0x5c,0x73,0x72,0x63,0x5c,0x74,0x68,0x69,0x72,0x64,0x5f,0x70,0x61,0x72,0x74,0x79,0x5c,0x62,0x6f,0x72,0x69,0x6e,0x67,0x73,0x73,0x6c,0x5c,0x73,0x72,0x63,0x5c,0x73,0x73,0x6c,0x5c,0x73,0x73,0x6c,0x5f,0x6c,0x69,0x62,0x2e,0x63,0x00};

    HMODULE hModule = GetModuleHandleA(szModule);
    if (hModule)
    {
        PIMAGE_DOS_HEADER pDos = (PIMAGE_DOS_HEADER)hModule;
        PIMAGE_NT_HEADERS pNT = (PIMAGE_NT_HEADERS)(pDos->e_lfanew + (DWORD)hModule);
        if (pNT->Signature == IMAGE_NT_SIGNATURE)
        {
            PIMAGE_SECTION_HEADER pSection = 0;
            int i = 0;
            for (i = 0 ;i < pNT->FileHeader.NumberOfSections; i ++)
            {
                pSection = (PIMAGE_SECTION_HEADER)((DWORD)pNT + sizeof(IMAGE_NT_HEADERS) + (sizeof(IMAGE_SECTION_HEADER)*i));
                if (!strcmp((char*)pSection->Name, ".rdata"))
                {
                    int Offset = 0;
                    for(Offset = 0; Offset<pSection->SizeOfRawData;Offset++)
                    {
                        DWORD dwPosition = (DWORD)hModule+pSection->VirtualAddress + Offset;
                        if (!memcmp(ucString,(LPVOID)dwPosition,sizeof(ucString)))
                            return (PSSLMETHODS)(dwPosition - 0x64);
                    }
                }
            }
        }
    }
    return 0;


}

So, After multiple and multiple attempts of troubleshooting the PI I finally got SSH to work. This was due to the ldconfig -p | grep libguac returning the location of the Library files for Libguac-client-ssh pointing to usr/lib/arm-linux/gnueabihf
and a closely mirrored entry at /usr/local/lib.
After removing the enties with RM located in the ARM-Linux_gnueabihf folder, without a restart or refresh SSH loaded correctly!

Another error I got was that SSH was not a defined protocol, In the user-mappings, you have to make sure your protocol is case sensitive, Once I updated SSH->ssh it located the correct protocol.

There is an example of getting FreeBusy from an exchange server from VB.NET. I use this to coordinate calendar invites on an external DMZ for outside vendors to streamline meeting request.

Imports Microsoft.Exchange.WebServices.Data

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim Server As New Microsoft.Exchange.WebServices.Data.ExchangeService(ExchangeVersion.Exchange2010)
        Server.Url = New System.Uri("https://Webmail/EWS/Exchange.asmx")
        GetSuggestedMeetingTimesAndFreeBusyInfo(Server)
    End Sub

    Private Shared Sub GetSuggestedMeetingTimesAndFreeBusyInfo(ByVal service As ExchangeService)
        Dim attendees As List(Of AttendeeInfo) = New List(Of AttendeeInfo)()
        attendees.Add(New AttendeeInfo() With {
            .SmtpAddress = "First@Email.com",
            .AttendeeType = MeetingAttendeeType.Organizer
        })
        attendees.Add(New AttendeeInfo() With {
            .SmtpAddress = "Second@Email.com",
            .AttendeeType = MeetingAttendeeType.Required
        })
        Dim availabilityOptions As AvailabilityOptions = New AvailabilityOptions()
        availabilityOptions.GoodSuggestionThreshold = 49
        availabilityOptions.MaximumNonWorkHoursSuggestionsPerDay = 0
        availabilityOptions.MaximumSuggestionsPerDay = 2
        availabilityOptions.MeetingDuration = 60
        availabilityOptions.MinimumSuggestionQuality = SuggestionQuality.Good
        availabilityOptions.DetailedSuggestionsWindow = New TimeWindow(DateTime.Now.AddDays(1), DateTime.Now.AddDays(7))
        availabilityOptions.RequestedFreeBusyView = FreeBusyViewType.FreeBusy
        Dim results As GetUserAvailabilityResults = service.GetUserAvailability(attendees, availabilityOptions.DetailedSuggestionsWindow, AvailabilityData.FreeBusyAndSuggestions, availabilityOptions)
        Console.WriteLine("Availability for {0} and {1}", attendees(0).SmtpAddress, attendees(1).SmtpAddress)
        Console.WriteLine()

        For Each suggestion As Suggestion In results.Suggestions
            Console.WriteLine("Suggested date: {0}" & vbLf, suggestion.Date.ToShortDateString())
            Console.WriteLine("Suggested meeting times:" & vbLf)

            For Each timeSuggestion As TimeSuggestion In suggestion.TimeSuggestions
                Console.WriteLine(vbTab & "{0} - {1}" & vbLf, timeSuggestion.MeetingTime.ToShortTimeString(), timeSuggestion.MeetingTime.Add(TimeSpan.FromMinutes(availabilityOptions.MeetingDuration)).ToShortTimeString())
            Next
        Next

        Dim i As Integer = 0

        For Each availability As AttendeeAvailability In results.AttendeesAvailability
            Console.WriteLine("Availability information for {0}:" & vbLf, attendees(i).SmtpAddress)

            For Each calEvent As CalendarEvent In availability.CalendarEvents
                Console.WriteLine(vbTab & "Busy from {0} to {1} " & vbLf, calEvent.StartTime.ToString(), calEvent.EndTime.ToString())
            Next

            i += 1
        Next
    End Sub
End Class

Availability for first@email.com and second@email.com

Suggested date: 8/20/2019

Suggested meeting times:

10:00 AM - 11:00 AM

10:30 AM - 11:30 AM

Suggested date: 8/21/2019

Suggested meeting times:

9:00 AM - 10:00 AM

10:30 AM - 11:30 AM

Suggested date: 8/22/2019

Suggested meeting times:

9:00 AM - 10:00 AM

9:30 AM - 10:30 AM

Suggested date: 8/23/2019

Suggested meeting times:

9:00 AM - 10:00 AM

10:30 AM - 11:30 AM

Suggested date: 8/24/2019

Suggested meeting times:

Suggested date: 8/25/2019

Suggested meeting times:

Availability information for first@email.com:

Busy from 8/20/2019 9:00:00 AM to 8/20/2019 10:00:00 AM 

Busy from 8/20/2019 11:45:00 AM to 8/20/2019 1:15:00 PM 

Busy from 8/20/2019 2:30:00 PM to 8/20/2019 3:00:00 PM 

Busy from 8/20/2019 5:00:00 PM to 8/20/2019 6:00:00 PM 

Busy from 8/21/2019 10:00:00 AM to 8/21/2019 10:30:00 AM 

Busy from 8/21/2019 11:00:00 AM to 8/21/2019 12:00:00 PM 

Busy from 8/21/2019 11:45:00 AM to 8/21/2019 1:15:00 PM 

Busy from 8/21/2019 4:30:00 PM to 8/21/2019 5:00:00 PM 

Busy from 8/22/2019 11:45:00 AM to 8/22/2019 1:15:00 PM 

Busy from 8/22/2019 1:30:00 PM to 8/22/2019 5:00:00 PM 

Busy from 8/22/2019 5:00:00 PM to 8/22/2019 6:00:00 PM 

Busy from 8/22/2019 8:00:00 PM to 8/22/2019 9:00:00 PM 

Busy from 8/23/2019 12:00:00 AM to 8/27/2019 6:00:00 PM 

Busy from 8/23/2019 10:00:00 AM to 8/23/2019 10:15:00 AM 

Busy from 8/23/2019 11:45:00 AM to 8/23/2019 1:15:00 PM 

Busy from 8/23/2019 1:30:00 PM to 8/23/2019 5:00:00 PM 

Busy from 8/23/2019 4:30:00 PM to 8/23/2019 4:35:00 PM 

Busy from 8/23/2019 5:00:00 PM to 8/23/2019 6:00:00 PM 

Availability information for second@email.com:

Busy from 8/20/2019 8:00:00 AM to 8/20/2019 9:00:00 AM 

Busy from 8/20/2019 9:00:00 AM to 8/20/2019 10:00:00 AM 

Busy from 8/20/2019 9:00:00 AM to 8/20/2019 10:00:00 AM 

Busy from 8/20/2019 11:45:00 AM to 8/20/2019 1:15:00 PM 

Busy from 8/21/2019 8:00:00 AM to 8/21/2019 9:00:00 AM 

Busy from 8/21/2019 11:45:00 AM to 8/21/2019 1:15:00 PM 

Busy from 8/22/2019 8:00:00 AM to 8/22/2019 9:00:00 AM 

Busy from 8/22/2019 10:00:00 AM to 8/22/2019 11:00:00 AM 

Busy from 8/22/2019 11:45:00 AM to 8/22/2019 1:15:00 PM 

Busy from 8/23/2019 8:00:00 AM to 8/23/2019 9:00:00 AM 

Busy from 8/23/2019 9:00:00 AM to 8/23/2019 9:30:00 AM 

Busy from 8/23/2019 10:00:00 AM to 8/23/2019 10:15:00 AM 

Busy from 8/23/2019 11:45:00 AM to 8/23/2019 1:15:00 PM 

Busy from 8/23/2019 2:00:00 PM to 8/23/2019 2:30:00 PM 

Busy from 8/23/2019 3:45:00 PM to 8/23/2019 4:00:00 PM 

Busy from 8/23/2019 4:30:00 PM to 8/23/2019 4:35:00 PM