Browse Source

Add debugger dot net

gdouglas 14 years ago
parent
commit
27ed2acfba
32 changed files with 3490 additions and 1 deletions
  1. 5 1
      gmsrc/doc/ChangeLog.txt
  2. 668 0
      gmsrc/src/gmddotnet/App.cs
  3. 476 0
      gmsrc/src/gmddotnet/Debugger.cs
  4. 448 0
      gmsrc/src/gmddotnet/Form1.Designer.cs
  5. 275 0
      gmsrc/src/gmddotnet/Form1.cs
  6. 202 0
      gmsrc/src/gmddotnet/Form1.resx
  7. BIN
      gmsrc/src/gmddotnet/Icons/IconBreakAll.bmp
  8. BIN
      gmsrc/src/gmddotnet/Icons/IconBreakCurrent.bmp
  9. BIN
      gmsrc/src/gmddotnet/Icons/IconResumeAll.bmp
  10. BIN
      gmsrc/src/gmddotnet/Icons/IconRun.bmp
  11. BIN
      gmsrc/src/gmddotnet/Icons/IconStepInto.bmp
  12. BIN
      gmsrc/src/gmddotnet/Icons/IconStepOut.bmp
  13. BIN
      gmsrc/src/gmddotnet/Icons/IconStepOver.bmp
  14. BIN
      gmsrc/src/gmddotnet/Icons/IconStopDebugging.bmp
  15. BIN
      gmsrc/src/gmddotnet/Icons/IconToggleBreakpoint.bmp
  16. 290 0
      gmsrc/src/gmddotnet/Network.cs
  17. 200 0
      gmsrc/src/gmddotnet/OutputWin.cs
  18. 21 0
      gmsrc/src/gmddotnet/Program.cs
  19. 36 0
      gmsrc/src/gmddotnet/Properties/AssemblyInfo.cs
  20. 63 0
      gmsrc/src/gmddotnet/Properties/Resources.Designer.cs
  21. 117 0
      gmsrc/src/gmddotnet/Properties/Resources.resx
  22. 26 0
      gmsrc/src/gmddotnet/Properties/Settings.Designer.cs
  23. 7 0
      gmsrc/src/gmddotnet/Properties/Settings.settings
  24. 15 0
      gmsrc/src/gmddotnet/ReadMe_gmDebuggerNet.txt
  25. 224 0
      gmsrc/src/gmddotnet/ScintillaNet/ReadMe.rtf
  26. 259 0
      gmsrc/src/gmddotnet/ScintillaNet/Release Notes.htm
  27. BIN
      gmsrc/src/gmddotnet/ScintillaNet/SciLexer.dll
  28. BIN
      gmsrc/src/gmddotnet/ScintillaNet/ScintillaNet.dll
  29. BIN
      gmsrc/src/gmddotnet/ScintillaNet/license.rtf
  30. 3 0
      gmsrc/src/gmddotnet/app.config
  31. 135 0
      gmsrc/src/gmddotnet/gmDebuggerNet.csproj
  32. 20 0
      gmsrc/src/gmddotnet/gmDebuggerNet.sln

+ 5 - 1
gmsrc/doc/ChangeLog.txt

@@ -397,4 +397,8 @@ o Fixed GC (Another attempt)
 
 
 13/01/12
 13/01/12
 o Improved syntactical sugar for functions. Thanks HenryTran.
 o Improved syntactical sugar for functions. Thanks HenryTran.
- 
+ 
+10/02/12
+o Added experimental project gmddotnet (gmDebuggerNet) which is gmd ported to C# .Net from C++ MFC.
+  This was simply an experiment, this example debugger is as identically terrible as the original version.
+  

+ 668 - 0
gmsrc/src/gmddotnet/App.cs

@@ -0,0 +1,668 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.Drawing;
+
+// TODO
+//
+// o Handle 64bit GM builds, needs to unpack 64bit gmptr for some messages (which ones?)
+//   Probably need to send a machine info message to let us know what kind of GM machine we are connecting to.
+//
+// o This whole application is a C# .Net conversion from the original GMD and it inherits all the (terrible) existing behavior.
+//   A serious debugger needs to rework the connection method and greatly improve usability.
+//
+
+namespace gmDebuggerNet
+{
+  // Central application logic class
+  public class App
+  {
+    // NOTE: MSVC will look for Scilexer.dll in the search path for form designer.  
+    //       Simplest work around is to copy the file to Windows\SysWOW64 (or Windows\System32 for 32bit OS)
+    //       I don't know why it worked without doing this the first time.
+
+    public DebuggerSession m_debuggerSession;               // Debugger session for messaging
+    public OurDebuggerRecInterface m_debuggerRecInterface;  // Interface to handle rec messages
+    public Network m_network;                               // Network connection
+    public DebuggerState m_state;                           // Debugger state
+    public MainForm m_mainForm;                             // Main form
+    public OutputWin m_outputWin;                           // Log window
+    protected long m_timeLastPollMachineStateMS;            // Time since last machine state poll in MS
+    public ScintillaNet.Marker m_markerBreakpoint;          // Break point marker
+    public ScintillaNet.Marker m_markerArrow;               // Current execution point marker
+
+    // Constructor
+    public App()
+    {
+      m_network = new Network();
+      m_debuggerSession = new DebuggerSession(m_network);
+      m_debuggerRecInterface = new OurDebuggerRecInterface(this);
+      m_state = new DebuggerState();
+
+      m_timeLastPollMachineStateMS = 0;
+    }
+
+    public bool Init(MainForm a_mainForm)
+    {
+      int port = 49001;
+
+      m_mainForm = a_mainForm;
+      
+      m_outputWin = new OutputWin();
+
+      m_outputWin.GetControl().Parent = m_mainForm.GetOutput();
+      m_outputWin.GetControl().Dock = DockStyle.Fill;
+      m_outputWin.SetLineLimit(20);
+
+      InitScintilla();
+
+      if (!m_network.Open(port))
+      {
+        return false;
+      }
+
+      m_outputWin.AddLogText(OutputWin.LogType.Info, "Listening on port '" + port.ToString() + "'");
+
+      return true;
+    }
+
+    public void InitScintilla()
+    {
+      ScintillaNet.Scintilla sourceView = m_mainForm.GetSourceView();
+      
+      sourceView.Margins[0].Width = 20; // Show line numbers
+      sourceView.IsReadOnly = true; // Disable editing
+      
+      sourceView.ConfigurationManager.Language = "cpp";
+      sourceView.EndOfLine.Mode = ScintillaNet.EndOfLineMode.Crlf;
+
+      m_markerBreakpoint = sourceView.Markers[0];
+      m_markerBreakpoint.Symbol = ScintillaNet.MarkerSymbol.RoundRectangle;
+      m_markerBreakpoint.ForeColor = Color.Black;
+      m_markerBreakpoint.BackColor = Color.Red;
+
+      m_markerArrow = sourceView.Markers[1];
+      m_markerArrow.Symbol = ScintillaNet.MarkerSymbol.Arrow;
+      m_markerArrow.ForeColor = Color.Black;
+      m_markerArrow.BackColor = Color.Blue;
+    }
+
+    public void OnTick(object a_sender, EventArgs a_eventArgs)
+    {
+      if( m_network.IsConnected )
+      {
+        m_state.m_isDebugging = true;
+
+        // Process incomming net messages
+        m_mainForm.SuspendLayout(); // Attempt to speed up UI which will be updated by incoming net messages
+        m_debuggerSession.Update(m_debuggerRecInterface);
+        m_mainForm.ResumeLayout();
+
+        // Periodically grab the thread states
+        const long POLL_MACHINE_RATE = 5000; // 5 second
+        long currentTimeMS = DateTime.Now.Ticks / 10000; // Convert 100ns to MS
+        long deltaTime = currentTimeMS - m_timeLastPollMachineStateMS;
+        if( deltaTime >= POLL_MACHINE_RATE )
+        {
+          //m_outputWin.AddLogText(OutputWin.LogType.Info, "poll" + deltaTime.ToString());
+          m_timeLastPollMachineStateMS = currentTimeMS; 
+          
+          // Poll for thread changes
+          m_debuggerSession.gmMachineGetThreadInfo();
+        }
+      }
+      else if( m_state.m_isDebugging )
+      {
+        m_state.m_isDebugging = false;
+      }
+
+      m_mainForm.UpdateToolBar();
+
+      if( (m_network != null ) && (m_network.m_closeStatus == Network.CloseStatus.LostConnection) )
+      {
+        m_network.ClearCloseStatus();
+        m_outputWin.AddLogText(OutputWin.LogType.Info, "Lost connection");
+      }
+    }
+
+    public void Disconnect()
+    {
+      m_mainForm.GetThreads().Items.Clear();
+      ClearCurrentContext();
+
+      if( m_network.IsConnected )
+      {
+        m_network.Done();
+      }
+
+      m_state.Clear();
+    }
+
+    static public ListViewItem MakeListViewItem(String a_label, Object a_item, Object a_user)
+    {
+      ListViewItem newItem = new ListViewItem();
+      newItem.Text = a_label;
+      newItem.SubItems.Add(a_item.ToString());
+      newItem.Tag = a_user;
+      return newItem;
+    }
+
+
+    public void ClearCurrentContext()
+    {
+      /* What was the point of this, I think to clear focus  
+            int sel = -1;
+            ListView listViewThreads = m_mainForm.GetThreads();
+            if( listViewThreads.SelectedIndices.Count > 0 )
+            {
+              sel = listViewThreads.SelectedIndices[0];
+              //ORIGINAL m_threadsWindow.SetItemState(sel, 0, LVIS_SELECTED | LVIS_FOCUSED);
+            }
+      */
+
+      m_state.m_currentDebugThread = 0;
+
+      // Unselect thread
+      ListView listViewThreads = m_mainForm.GetThreads();
+      foreach(ListViewItem item in listViewThreads.Items)
+      {
+        item.Selected = false;
+      }
+      m_state.m_currentPos = -1;
+
+      // clear the windows
+      SetSource(0, ""); // hackorama
+      m_mainForm.GetLocals().Items.Clear();
+      m_mainForm.GetCallStack().Items.Clear();
+    }
+
+    public void RemoveThread(int a_threadId)
+    {
+      if (a_threadId <= 0)
+      {
+        return;
+      }
+
+      for(int thIndex=0; thIndex < m_state.m_threads.Count; ++thIndex)
+      {
+        if( m_state.m_threads[thIndex].m_id == a_threadId )
+        {
+          ListView listViewThreads = m_mainForm.GetThreads();
+          for(int itemIndex=0; itemIndex < listViewThreads.Items.Count; ++itemIndex)
+          {
+            if( ((DebuggerState.ThreadInfo)listViewThreads.Items[itemIndex].Tag).m_id == a_threadId )
+            {
+              listViewThreads.Items.RemoveAt(itemIndex);
+              break;
+            }
+          }
+          
+          m_state.m_threads.RemoveAt(thIndex);
+          break;
+        }
+      }
+    }
+
+    public bool SetSource(uint a_sourceId, String a_source)
+    {
+      if (a_sourceId == m_state.m_sourceId)
+      {
+        return true;
+      }
+
+      ScintillaNet.Scintilla sourceView = m_mainForm.GetSourceView();
+
+      // do we have the source
+      foreach (DebuggerState.Source source in m_state.m_sources)
+      {
+        if (source.m_id == a_sourceId)
+        {
+          sourceView.IsReadOnly = false;
+          sourceView.Text = source.m_source;
+          sourceView.IsReadOnly = true;
+          m_state.m_sourceId = a_sourceId;
+          return true;
+        }
+      }
+
+      // we dont have the source, add it
+      if (a_source != null)
+      {
+        sourceView.IsReadOnly = false;
+        sourceView.Text = a_source;
+        sourceView.IsReadOnly = true;
+        m_state.m_sourceId = a_sourceId;
+        m_state.m_sources.Add(new DebuggerState.Source(a_source, a_sourceId));
+        return true;
+      }
+
+      return false;
+    }
+
+    public void SetLine(int a_line)
+    {
+      ScintillaNet.Scintilla sourceView = m_mainForm.GetSourceView();
+
+      if (m_state.m_currentPos >= 0)
+      {
+        sourceView.Lines[m_state.m_currentPos].DeleteMarker(m_markerArrow);
+        m_state.m_currentPos = -1;
+      }
+      m_state.m_currentPos = a_line - 1;
+      sourceView.Lines[m_state.m_currentPos].AddMarker(m_markerArrow);
+
+      // center the source view around the cursor
+      int topLine = sourceView.Lines.FirstVisible.Number;
+      int visLines = sourceView.Lines.VisibleCount;
+      int scrollLines = 0;
+      int centre = (topLine + (visLines >> 1));
+      int lq = centre - (visLines >> 2);
+      int hq = centre + (visLines >> 2);
+
+      if (m_state.m_currentPos < lq)
+      {
+        scrollLines = m_state.m_currentPos - centre;
+      }
+      else if (m_state.m_currentPos > hq)
+      {
+        scrollLines = m_state.m_currentPos - centre;
+      }
+      // LineScroll(0, scrollLines);
+      sourceView.Scrolling.ScrollBy(0, scrollLines);
+    }
+
+    public static String GetThreadStateAsString(int a_stateId)
+    {
+      String stateDesc = "unknown";
+      switch (a_stateId)
+      {
+        case 0: stateDesc = "running"; break;
+        case 1: stateDesc = "blocked"; break;
+        case 2: stateDesc = "sleeping"; break;
+        case 3: stateDesc = "exception"; break;
+        case 4: stateDesc = "broken"; break;
+        default: break;
+      }
+
+      return stateDesc;
+    }
+
+    public void UpdateThreadWindow()
+    {
+      // Update display from data
+      ListView listView = m_mainForm.GetThreads();
+      listView.Items.Clear();
+
+      for (int threadIndex = 0; threadIndex < m_state.m_threads.Count; ++threadIndex)
+      {
+        DebuggerState.ThreadInfo curThreadInfo = m_state.m_threads[threadIndex];
+
+        String stateDesc = App.GetThreadStateAsString(curThreadInfo.m_state);
+
+        listView.Items.Add(App.MakeListViewItem(curThreadInfo.m_id.ToString(), stateDesc, curThreadInfo));
+      }
+    }
+
+    public void FindAddThread(int a_threadId, int a_state, bool a_select)
+    {
+      if (a_threadId <= 0)
+      {
+        return;
+      }
+
+      ListView listView = m_mainForm.GetThreads();
+
+      // Clear selection
+      if (a_select)
+      {
+        foreach (ListViewItem item in listView.Items)
+        {
+          item.Selected = false;
+        }
+      }
+
+      // find in list
+      for (int thIndex = 0; thIndex < m_state.m_threads.Count; ++thIndex)
+      {
+        DebuggerState.ThreadInfo info = m_state.m_threads[thIndex];
+
+        if (info.m_id == a_threadId)
+        {
+          // update state
+          if (info.m_state != a_state || a_select)
+          {
+            if (info.m_state != a_state)
+            {
+              info.m_state = a_state;
+            }
+
+            for (int itemIndex = 0; itemIndex < listView.Items.Count; ++itemIndex)
+            {
+              if (listView.Items[itemIndex].Tag == info)
+              {
+                String stateDesc = GetThreadStateAsString(info.m_state);
+                listView.Items[itemIndex] = App.MakeListViewItem(info.m_id.ToString(), stateDesc, info);
+
+                if (a_select)
+                {
+                  listView.Items[itemIndex].Selected = true;
+                }
+                break;
+              }
+            }
+          }
+          return;
+        }
+      }
+
+      // add
+      {
+        DebuggerState.ThreadInfo info = new DebuggerState.ThreadInfo(a_threadId, a_state);
+        m_state.m_threads.Add(info);
+
+        String stateDesc = GetThreadStateAsString(info.m_state);
+        listView.Items.Insert(0, App.MakeListViewItem(info.m_id.ToString(), stateDesc, info));
+
+        if (a_select)
+        {
+          listView.Items[0].Selected = true;
+        }
+      }
+    }
+
+    public void OnExit()
+    {
+      if( m_debuggerSession != null )
+      {
+        m_debuggerSession.gmMachineQuit();
+      }
+      System.Threading.Thread.Sleep(500); // wait for quit message to post (hack)
+      Disconnect();
+    }
+
+    public void OnGetThreadContext(DebuggerState.ThreadInfo a_threadInfo)
+    {
+      m_debuggerSession.gmMachineGetContext(a_threadInfo.m_id, 0);
+    }
+
+    public void OnResumeAll()
+    {
+      if (m_network.IsConnected && m_state.m_isDebugging)
+      {
+        foreach (DebuggerState.ThreadInfo threadInfo in m_state.m_threads)
+        {
+          // send run command
+          m_debuggerSession.gmMachineRun(threadInfo.m_id);
+        }
+      }
+    }
+
+    public void OnBreakAll()
+    {
+      if (m_network.IsConnected && m_state.m_isDebugging)
+      {
+        foreach (DebuggerState.ThreadInfo threadInfo in m_state.m_threads)
+        {
+          // send break command
+          m_debuggerSession.gmMachineBreak(threadInfo.m_id);
+        }
+      }
+    }
+
+    public void OnStepInto()
+    {
+      if (m_network.IsConnected && m_state.m_isDebugging)
+      {
+        m_debuggerSession.gmMachineStepInto(m_state.m_currentDebugThread);
+      }
+    }
+
+    public void OnStepOut()
+    {
+      if (m_network.IsConnected && m_state.m_isDebugging)
+      {
+        m_debuggerSession.gmMachineStepOut(m_state.m_currentDebugThread);
+      }
+    }
+
+    public void OnStepOver()
+    {
+      if (m_network.IsConnected && m_state.m_isDebugging)
+      {
+        m_debuggerSession.gmMachineStepOver(m_state.m_currentDebugThread);
+      }
+    }
+
+    public void OnRun()
+    {
+      if (m_network.IsConnected && m_state.m_isDebugging)
+      {
+        m_debuggerSession.gmMachineRun(m_state.m_currentDebugThread);
+      }
+    }
+
+    public void OnBreakCurrentThread() 
+    {
+      if( m_state.m_currentDebugThread != 0 )
+      {
+        m_debuggerSession.gmMachineBreak(m_state.m_currentDebugThread);
+      }
+    }
+
+    public void OnStopDebugging()
+    {
+      if (m_network.IsConnected && m_state.m_isDebugging)
+      {
+        m_debuggerSession.gmMachineQuit();
+        System.Threading.Thread.Sleep(500); // wait for quit message to post (hack)
+        Disconnect();
+      }
+    }
+
+    public void OnToggleBreakpoint() 
+    {
+      ScintillaNet.Scintilla sourceView = m_mainForm.GetSourceView();
+
+      // add a break point at the current line.
+      int line = sourceView.Lines.Current.Number; // m_scintillaEdit.GetCurrentPos();
+      bool enabled = true;
+
+      // do we have a break point at this line already???
+      if (sourceView.Lines[line].GetMarkers().Contains(m_markerBreakpoint))
+      {
+        enabled = false;
+      }
+
+      if( m_state.m_currentDebugThread != 0 && (m_state.m_isDebugging != false) )
+      {
+        m_state.m_breakPoint.m_enabled = enabled;
+        m_state.m_breakPoint.m_allThreads = true;
+        m_state.m_breakPoint.m_responseId = ++m_state.m_responseId;
+        m_state.m_breakPoint.m_sourceId = m_state.m_sourceId;
+        m_state.m_breakPoint.m_lineNumber = line + 1;
+        m_state.m_breakPoint.m_threadId = 0;
+
+        m_debuggerSession.gmMachineSetBreakPoint(m_state.m_breakPoint.m_responseId,
+                                                 (int)m_state.m_breakPoint.m_sourceId, 
+                                                 m_state.m_breakPoint.m_lineNumber, 
+                                                 0, 
+                                                 enabled ? 1 : 0);
+      }
+    }
+
+
+  }
+
+  // Handle rec messages
+  public class OurDebuggerRecInterface : DebuggerRecInterface
+  {
+    App m_app;
+
+    // Constructor
+    public OurDebuggerRecInterface(App a_app)
+    {
+      m_app = a_app;
+    }
+
+    public void gmDebuggerBreak(int a_threadId, int a_sourceId, int a_lineNumber)
+    {
+      m_app.m_debuggerSession.gmMachineGetContext(a_threadId, 0);
+    }
+
+    public void gmDebuggerRun(int a_threadId)
+    {
+      String text = "thread " + a_threadId.ToString() + " started.";
+      m_app.m_outputWin.AddLogText(OutputWin.LogType.Info, text);
+      m_app.FindAddThread(a_threadId, 0, false);
+    }
+
+    public void gmDebuggerStop(int a_threadId)
+    {
+      String text = "thread " + a_threadId.ToString() + " stopped.";
+      m_app.m_outputWin.AddLogText(OutputWin.LogType.Info, text);
+      if( a_threadId == m_app.m_state.m_currentDebugThread )
+      {
+        m_app.ClearCurrentContext();
+      }
+      m_app.RemoveThread(a_threadId);
+    }
+
+    public void gmDebuggerSource(int a_sourceId, String a_sourceName, String a_source)
+    {
+      m_app.SetSource((uint)a_sourceId, a_source);
+      if( m_app.m_state.m_lineNumberOnSourceRcv != -1)
+      {
+        m_app.SetLine(m_app.m_state.m_lineNumberOnSourceRcv);
+        m_app.m_state.m_lineNumberOnSourceRcv = -1;
+      }
+    }
+
+    public void gmDebuggerException(int a_threadId)
+    {
+      System.Console.Beep();
+      m_app.m_debuggerSession.gmMachineGetContext(a_threadId, 0);
+    }
+    
+    
+    public void gmDebuggerBeginContext(int a_threadId, int a_callFrame)
+    {
+      m_app.m_state.m_currentDebugThread = a_threadId;
+      m_app.FindAddThread(m_app.m_state.m_currentDebugThread, 4, true);
+      m_app.m_state.m_currentCallFrame = a_callFrame;
+       
+      m_app.m_mainForm.GetLocals().Items.Clear();
+      m_app.m_mainForm.GetCallStack().Items.Clear();
+    }
+
+    public void gmDebuggerContextCallFrame(int a_callFrame, String a_functionName, int a_sourceId, int a_lineNumber, String a_thisSymbol, String a_thisValue, int a_thisId)
+    {
+      ListView listViewCS = m_app.m_mainForm.GetCallStack();
+
+      String functionDesc = a_functionName + " (" + a_lineNumber.ToString() + ")";
+      listViewCS.Items.Add(new ListViewItem(functionDesc));
+       
+      if( m_app.m_state.m_currentCallFrame == a_callFrame )
+      {
+        ListView listViewLocals = m_app.m_mainForm.GetLocals();
+
+        // add "this"
+        int index = listViewLocals.Items.Count;
+        listViewLocals.Items.Insert(index, App.MakeListViewItem(a_thisSymbol, a_thisValue, null) );
+
+        // do we have the source code?
+        m_app.m_state.m_lineNumberOnSourceRcv = -1;
+        if (!m_app.SetSource((uint)a_sourceId, null))
+        {
+          // request source
+          m_app.m_debuggerSession.gmMachineGetSource(a_sourceId);
+          m_app.m_state.m_lineNumberOnSourceRcv = a_lineNumber;
+        }
+        else
+        {
+          // update the position cursor
+          m_app.SetLine(a_lineNumber);
+        }
+      }
+    }
+
+    public void gmDebuggerContextVariable(String a_varSymbol, String a_varValue, int a_varId)
+    {
+      ListView listViewLocals = m_app.m_mainForm.GetLocals();
+      listViewLocals.Items.Add( App.MakeListViewItem(a_varSymbol, a_varValue, null) );
+    }
+
+    public void gmDebuggerEndContext()
+    {
+      // Do nothing
+    }
+
+    public void gmDebuggerBeginSourceInfo()
+    {
+      // Do nothing
+    }
+
+    public void gmDebuggerSourceInfo(int a_sourceId, String a_sourceName)
+    {
+      // Do nothing
+    }
+
+    public void gmDebuggerEndSourceInfo()
+    {
+      // Do nothing
+    }
+
+    public void gmDebuggerBeginThreadInfo()
+    {
+      // Clear data
+      m_app.m_state.m_threads.Clear();
+    }
+
+    public void gmDebuggerThreadInfo(int a_threadId, int a_threadState)
+    {
+      // Fill data
+      m_app.m_state.m_threads.Add( new DebuggerState.ThreadInfo(a_threadId, a_threadState) );
+    }
+    
+    public void gmDebuggerEndThreadInfo()
+    {
+      // Update display from data
+      m_app.UpdateThreadWindow();
+    }
+
+    public void gmDebuggerError(String a_error)
+    {
+      m_app.m_outputWin.AddLogText(OutputWin.LogType.Error, a_error);
+    }
+
+    public void gmDebuggerMessage(String a_message)
+    {
+      m_app.m_outputWin.AddLogText(OutputWin.LogType.Info, a_message);
+    }
+
+    public void gmDebuggerAck(int a_response, int a_posNeg)
+    {
+      if( (a_response == m_app.m_state.m_responseId) && (a_posNeg != 0) )
+      {
+        ScintillaNet.Scintilla sourceView = m_app.m_mainForm.GetSourceView();
+
+        if( m_app.m_state.m_breakPoint.m_enabled )
+        {
+          sourceView.Lines[m_app.m_state.m_breakPoint.m_lineNumber - 1].AddMarker( m_app.m_markerBreakpoint );
+        }
+        else
+        {
+          sourceView.Lines[m_app.m_state.m_breakPoint.m_lineNumber - 1].DeleteMarker(m_app.m_markerBreakpoint);
+        }
+      }
+    }
+
+    public void gmDebuggerQuit()
+    {
+      m_app.m_outputWin.AddLogText(OutputWin.LogType.Info, "Disconnected");
+      m_app.Disconnect();
+    }
+
+  }
+}

+ 476 - 0
gmsrc/src/gmddotnet/Debugger.cs

@@ -0,0 +1,476 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using System.IO;
+
+namespace gmDebuggerNet
+{
+
+  // Network message packet codes
+  public class FOURCC
+  {
+    public static Int32 MakeFOURCC(char ch0, char ch1, char ch2, char ch3)
+    {
+      return ((Int32)(byte)(ch0) | ((byte)(ch1) << 8) | ((byte)(ch2) << 16) | ((byte)(ch3) << 24));
+    }
+
+    public static readonly int ID_mrun = FOURCC.MakeFOURCC('m','r','u','n');
+    public static readonly int ID_msin = FOURCC.MakeFOURCC('m','s','i','n');
+    public static readonly int ID_msou = FOURCC.MakeFOURCC('m','s','o','u');
+    public static readonly int ID_msov = FOURCC.MakeFOURCC('m','s','o','v');
+    public static readonly int ID_mgct = FOURCC.MakeFOURCC('m','g','c','t');
+    public static readonly int ID_mgsr = FOURCC.MakeFOURCC('m','g','s','r');
+    public static readonly int ID_mgsi = FOURCC.MakeFOURCC('m','g','s','i');
+    public static readonly int ID_mgti = FOURCC.MakeFOURCC('m','g','t','i');
+    public static readonly int ID_mgvi = FOURCC.MakeFOURCC('m','g','v','i');
+    public static readonly int ID_msbp = FOURCC.MakeFOURCC('m','s','b','p');
+    public static readonly int ID_mbrk = FOURCC.MakeFOURCC('m','b','r','k');
+    public static readonly int ID_mend = FOURCC.MakeFOURCC('m','e','n','d');
+
+    public static readonly int ID_dbrk = FOURCC.MakeFOURCC('d','b','r','k');
+    public static readonly int ID_dexc = FOURCC.MakeFOURCC('d','e','x','c');
+    public static readonly int ID_drun = FOURCC.MakeFOURCC('d','r','u','n');
+    public static readonly int ID_dstp = FOURCC.MakeFOURCC('d','s','t','p');
+    public static readonly int ID_dsrc = FOURCC.MakeFOURCC('d','s','r','c');
+    public static readonly int ID_dctx = FOURCC.MakeFOURCC('d','c','t','x');
+    public static readonly int ID_call = FOURCC.MakeFOURCC('c','a','l','l');
+    public static readonly int ID_vari = FOURCC.MakeFOURCC('v','a','r','i');
+    public static readonly int ID_done = FOURCC.MakeFOURCC('d','o','n','e');
+    public static readonly int ID_dsri = FOURCC.MakeFOURCC('d','s','r','i');
+    public static readonly int ID_srci = FOURCC.MakeFOURCC('s','r','c','i');
+    public static readonly int ID_dthi = FOURCC.MakeFOURCC('d','t','h','i');
+    public static readonly int ID_thri = FOURCC.MakeFOURCC('t','h','r','i');
+    public static readonly int ID_derr = FOURCC.MakeFOURCC('d','e','r','r');
+    public static readonly int ID_dmsg = FOURCC.MakeFOURCC('d','m','s','g');
+    public static readonly int ID_dack = FOURCC.MakeFOURCC('d','a','c','k');
+    public static readonly int ID_dend = FOURCC.MakeFOURCC('d','e','n','d');
+  }
+
+
+  // Debug session for message handling
+  public class DebuggerSession
+  {
+    protected Network m_network;                            // Network connection
+    protected MemoryStream m_outStream;                     // Current send stream
+    protected MemoryStream m_inStreamCur;                   // Current rec stream
+    protected System.Text.UTF8Encoding m_textEncoding;      // helper for string to byte array conversion
+
+    // Constructor
+    public DebuggerSession(Network a_network)
+    {
+      m_network = a_network;
+
+      m_textEncoding = new System.Text.UTF8Encoding();
+
+      m_outStream = new MemoryStream();
+      m_inStreamCur = null;
+    }
+
+    // Process incomming net messages
+    public void Update(DebuggerRecInterface a_iRec)
+    {
+      int msgLimit = 100; // NOTE: This can improve UI responsiveness, but can cause the queue buffer to grow!
+      for(;;) // While messages are queued
+      {
+        m_inStreamCur = m_network.GetFirstInQueue();
+        
+        // Limit messages in case we cause app to freeze
+        if( --msgLimit <= 0 )
+        {
+          break;
+        }
+
+        if (m_inStreamCur == null)
+        {
+          break;
+        }
+
+        int msgId = 0;
+        Unpack(out msgId);
+
+        if( FOURCC.ID_dbrk == msgId )
+        {
+          int threadId, sourceId, lineNum;
+
+          Unpack(out threadId).Unpack(out sourceId).Unpack(out lineNum);
+          a_iRec.gmDebuggerBreak(threadId, sourceId, lineNum);
+        }
+        else if( FOURCC.ID_drun == msgId )
+        {
+          int threadId;
+
+          Unpack(out threadId);
+          a_iRec.gmDebuggerRun(threadId);
+        }
+        else if( FOURCC.ID_dstp == msgId )
+        {
+          int threadId;
+
+          Unpack(out threadId);
+          a_iRec.gmDebuggerStop(threadId);
+        }
+        else if( FOURCC.ID_dsrc == msgId )
+        {
+          int sourceId;
+          String sourceName, source;
+
+          Unpack(out sourceId).Unpack(out sourceName).Unpack(out source);
+          a_iRec.gmDebuggerSource(sourceId, sourceName, source);
+        }
+        else if( FOURCC.ID_dexc == msgId )
+        {
+          int threadId;
+
+          Unpack(out threadId);
+          a_iRec.gmDebuggerException(threadId);
+        }
+        else if( FOURCC.ID_dctx == msgId )
+        {
+          int threadId, callFrame;
+
+          Unpack(out threadId).Unpack(out callFrame); // thread id, callframe
+          a_iRec.gmDebuggerBeginContext(threadId, callFrame);
+          for(;;)
+          {
+            int id;
+            Unpack(out id);
+            if(id == FOURCC.ID_call)
+            {
+              String functionName, thisSymbol, thisValue;
+              int sourceId, lineNum, thisId;
+
+              Unpack(out callFrame).Unpack(out functionName).Unpack(out sourceId).Unpack(out lineNum).Unpack(out thisSymbol).Unpack(out thisValue).Unpack(out thisId);
+              a_iRec.gmDebuggerContextCallFrame(callFrame, functionName, sourceId, lineNum, thisSymbol, thisValue, thisId);
+            }
+            else if (id == FOURCC.ID_vari)
+            {
+              int varId;
+              String varSymbol, varValue;
+
+              Unpack(out varSymbol).Unpack(out varValue).Unpack(out varId);
+              a_iRec.gmDebuggerContextVariable(varSymbol, varValue, varId);
+            }
+            else if (id == FOURCC.ID_done)
+            {
+              break;
+            }
+            else
+            {
+              break;
+            }
+          }
+          a_iRec.gmDebuggerEndContext();
+       }
+       else if( FOURCC.ID_dsri == msgId )
+       {
+          // todo
+          break;
+        }
+        else if( FOURCC.ID_dthi == msgId )
+        {
+          a_iRec.gmDebuggerBeginThreadInfo();
+          for(;;)
+          {
+            int id, threadId, threadState;
+
+            Unpack(out id);
+            if(id == FOURCC.ID_thri)
+            {
+              Unpack(out threadId).Unpack(out threadState);
+              a_iRec.gmDebuggerThreadInfo(threadId, threadState);
+            }
+            else if (id == FOURCC.ID_done)
+            {
+              break;
+            }
+            else
+            {
+              break;
+            }
+          }
+          a_iRec.gmDebuggerEndThreadInfo();
+        }
+        else if( FOURCC.ID_derr == msgId )
+        {
+          String errorMessage;
+
+          Unpack(out errorMessage);
+          a_iRec.gmDebuggerError(errorMessage);
+        }
+        else if( FOURCC.ID_dmsg == msgId )
+        {
+          String message;
+
+          Unpack(out message);
+          a_iRec.gmDebuggerMessage(message);
+        }
+        else if( FOURCC.ID_dack == msgId )
+        {
+          int response, posNeg;
+
+          Unpack(out response).Unpack(out posNeg);
+          a_iRec.gmDebuggerAck(response, posNeg);
+        }
+        else if( FOURCC.ID_dend == msgId )
+        {
+          a_iRec.gmDebuggerQuit();
+        }
+        else
+        {
+          // unknown Id
+        }
+      }
+    }
+
+    public DebuggerSession Pack(int a_value)
+    {
+      m_outStream.Write(BitConverter.GetBytes(a_value), 0, 4);
+      return this;
+    }
+
+    public DebuggerSession Pack(String a_string)
+    {
+      m_outStream.Write(m_textEncoding.GetBytes(a_string), 0, a_string.Length);
+      return this;
+    }
+
+    // TODO, something like this is needed for 64bit
+    //public DebuggerSession UnpackIntPtr(out long a_value)
+    //{
+    //  if( Is64bitGM )
+    //  {
+    //    byte[] value = new byte[8];
+
+    //    m_inStreamCur.Read(value, 0, 8);
+    //    a_value = BitConverter.ToInt64(value, 0);
+    //    return this;
+    //  }
+    //  else
+    //  {
+    //    byte[] value = new byte[4];
+
+    //    m_inStreamCur.Read(value, 0, 4);
+    //    a_value = BitConverter.ToInt32(value, 0);
+    //    return this;
+    //  }
+    //}
+
+    public DebuggerSession Unpack(out int a_value)
+    {
+      byte[] value = new byte[4];
+
+      m_inStreamCur.Read(value, 0, 4);
+      a_value = BitConverter.ToInt32(value, 0);
+      return this;
+    }
+
+    public DebuggerSession Unpack(out String a_string)
+    {
+      a_string = "";
+
+      byte[] rawBuffer = m_inStreamCur.GetBuffer();
+
+      long startPos = m_inStreamCur.Position;
+      long curPos = startPos;
+      long endPos = m_inStreamCur.Length - 1;
+      for (; curPos <= endPos; ++curPos)
+      {
+        if (rawBuffer[curPos] == 0)
+        {
+          break;
+        }
+      }
+
+      long stringLength = curPos - startPos;
+      if (stringLength > 0)
+      {
+        a_string = m_textEncoding.GetString(rawBuffer, (int)startPos, (int)stringLength);
+      }
+
+      m_inStreamCur.Seek(startPos + stringLength + 1, SeekOrigin.Begin); // Skip past string we just read
+
+      return this;
+    }
+
+    public void Send()
+    {
+      m_network.Send(m_outStream);
+      m_outStream.SetLength(0); // Reset buffer to recycle
+    }
+
+    public void gmMachineRun(int a_threadId)
+    {
+      Pack(FOURCC.ID_mrun).Pack(a_threadId).Send();
+    }
+
+    public void gmMachineStepInto(int a_threadId)
+    {
+      Pack(FOURCC.ID_msin).Pack(a_threadId).Send();
+    }
+
+    public void gmMachineStepOver(int a_threadId)
+    {
+      Pack(FOURCC.ID_msov).Pack(a_threadId).Send();
+    }
+
+    public void gmMachineStepOut(int a_threadId)
+    {
+      Pack(FOURCC.ID_msou).Pack(a_threadId).Send();
+    }
+
+    public void gmMachineGetContext(int a_threadId, int a_callframe)
+    {
+      Pack(FOURCC.ID_mgct).Pack(a_threadId).Pack(a_callframe).Send();
+    }
+
+    public void gmMachineGetSource(int a_sourceId)
+    {
+      Pack(FOURCC.ID_mgsr).Pack(a_sourceId).Send();
+    }
+
+    public void gmMachineGetSourceInfo()
+    {
+      Pack(FOURCC.ID_mgsi).Send();
+    }
+
+    public void gmMachineGetThreadInfo()
+    {
+      Pack(FOURCC.ID_mgti).Send();
+    }
+
+    public void gmMachineGetVariableInfo(int a_variableId)
+    {
+      Pack(FOURCC.ID_mgvi).Pack(a_variableId).Send();
+    }
+
+    public void gmMachineSetBreakPoint(int a_responseId, int a_sourceId, int a_lineNumber, int a_threadId, int a_enabled)
+    {
+      Pack(FOURCC.ID_msbp).Pack(a_responseId).Pack(a_sourceId).Pack(a_lineNumber).Pack(a_threadId).Pack(a_enabled).Send();
+    }
+
+    public void gmMachineBreak(int a_threadId)
+    {
+      Pack(FOURCC.ID_mbrk).Pack(a_threadId).Send();
+    }
+
+    public void gmMachineQuit()
+    {
+      Pack(FOURCC.ID_mend).Send();
+    }
+
+  };
+
+  
+  // Interface expected for rec messages
+  public interface DebuggerRecInterface
+  {
+    void gmDebuggerBreak(int a_threadId, int a_sourceId, int a_lineNumber);
+    void gmDebuggerRun(int a_threadId);
+    void gmDebuggerStop(int a_threadId);
+    void gmDebuggerSource(int a_sourceId, String a_sourceName, String a_source);
+    void gmDebuggerException(int a_threadId);
+
+    void gmDebuggerBeginContext(int a_threadId, int a_callFrame);
+    void gmDebuggerContextCallFrame(int a_callFrame, String a_functionName, int a_sourceId, int a_lineNumber, String a_thisSymbol, String a_thisValue, int a_thisId);
+    void gmDebuggerContextVariable(String a_varSymbol, String a_varValue, int a_varId);
+    void gmDebuggerEndContext();
+
+    void gmDebuggerBeginSourceInfo();
+    void gmDebuggerSourceInfo(int a_sourceId, String a_sourceName);
+    void gmDebuggerEndSourceInfo();
+
+    void gmDebuggerBeginThreadInfo();
+    void gmDebuggerThreadInfo(int a_threadId, int a_threadState);
+    void gmDebuggerEndThreadInfo();
+
+    void gmDebuggerError(String a_error);
+    void gmDebuggerMessage(String a_message);
+    void gmDebuggerAck(int a_response, int a_posNeg);
+    void gmDebuggerQuit();
+  }
+
+  // State of the remote virtual machine, filled from rec messages
+  public class DebuggerState
+  {
+    // Thread info
+    public class ThreadInfo
+    {
+      public int m_id;
+      public int m_state;
+
+      public ThreadInfo()
+      {
+        m_id = 0;
+        m_state = 0;
+      }
+
+      public ThreadInfo(int a_id, int a_state)
+      {
+        m_id = a_id;
+        m_state = a_state;
+      }
+
+    };
+
+    // Source code info
+    public class Source
+    {
+      public String m_source;
+      public uint m_id;
+
+      public Source()
+      {
+      }
+
+      public Source(String a_source, uint a_id)
+      {
+        m_source = a_source;
+        m_id = a_id;
+      }
+    };
+
+    // Breakpoint info
+    public class gmdBreakPoint
+    {
+      public bool m_enabled;
+      public bool m_allThreads;
+      public int m_responseId;
+      public int m_lineNumber;
+      public int m_threadId;
+      public uint m_sourceId;
+    };
+
+
+    public List<ThreadInfo> m_threads;            // current running threads.
+    public List<Source> m_sources;                // list of source codes
+    public int m_currentCallFrame;                // current stack frame
+    public uint m_sourceId;                       // source id of the source code currently being viewed, 0 for none
+    public int m_currentDebugThread;              // thread id of the current context thread
+    public int m_currentPos;                      // execute pos. -1 for invalid.
+    public gmdBreakPoint m_breakPoint;            // last break point command
+    public int m_responseId;                      // current rolling response id
+    public int m_lineNumberOnSourceRcv;           // current line number in loaded source
+    public bool m_isDebugging;
+
+    public DebuggerState()
+    {
+      Clear();
+    }
+
+    public void Clear()
+    {
+      m_threads = new List<ThreadInfo>();
+      m_sources = new List<Source>();
+      m_currentDebugThread = 0;
+      m_currentPos = -1;
+      m_breakPoint = new gmdBreakPoint();
+      m_responseId = 100;
+      m_sourceId = 0;
+      m_lineNumberOnSourceRcv = -1;
+      m_isDebugging = false;
+    }
+
+  };
+}

+ 448 - 0
gmsrc/src/gmddotnet/Form1.Designer.cs

@@ -0,0 +1,448 @@
+namespace gmDebuggerNet
+{
+  partial class MainForm
+  {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing)
+    {
+      if (disposing && (components != null))
+      {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent()
+    {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
+      this.m_menu = new System.Windows.Forms.MenuStrip();
+      this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.m_toolBar = new System.Windows.Forms.ToolStrip();
+      this.buttonStepInto = new System.Windows.Forms.ToolStripButton();
+      this.buttonStepOver = new System.Windows.Forms.ToolStripButton();
+      this.buttonStepOut = new System.Windows.Forms.ToolStripButton();
+      this.buttonRun = new System.Windows.Forms.ToolStripButton();
+      this.buttonStopDebugging = new System.Windows.Forms.ToolStripButton();
+      this.buttonToggleBreakpoint = new System.Windows.Forms.ToolStripButton();
+      this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+      this.buttonBreakAll = new System.Windows.Forms.ToolStripButton();
+      this.buttonResumeAll = new System.Windows.Forms.ToolStripButton();
+      this.buttonBreakCurrent = new System.Windows.Forms.ToolStripButton();
+      this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+      this.m_statusStrip = new System.Windows.Forms.StatusStrip();
+      this.m_splitContainerV = new System.Windows.Forms.SplitContainer();
+      this.m_splitContainerH = new System.Windows.Forms.SplitContainer();
+      this.m_scintilla = new ScintillaNet.Scintilla();
+      this.m_output = new System.Windows.Forms.Panel();
+      this.m_threads = new System.Windows.Forms.ListView();
+      this.ThreadId = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.Status = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.m_callstack = new System.Windows.Forms.ListView();
+      this.CallStack = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.m_locals = new System.Windows.Forms.ListView();
+      this.Variable = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.Value = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.m_menu.SuspendLayout();
+      this.m_toolBar.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.m_splitContainerV)).BeginInit();
+      this.m_splitContainerV.Panel1.SuspendLayout();
+      this.m_splitContainerV.Panel2.SuspendLayout();
+      this.m_splitContainerV.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.m_splitContainerH)).BeginInit();
+      this.m_splitContainerH.Panel1.SuspendLayout();
+      this.m_splitContainerH.Panel2.SuspendLayout();
+      this.m_splitContainerH.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.m_scintilla)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // m_menu
+      // 
+      this.m_menu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.fileToolStripMenuItem,
+            this.helpToolStripMenuItem});
+      this.m_menu.Location = new System.Drawing.Point(0, 0);
+      this.m_menu.Name = "m_menu";
+      this.m_menu.Size = new System.Drawing.Size(963, 24);
+      this.m_menu.TabIndex = 0;
+      this.m_menu.Text = "menuStrip1";
+      // 
+      // fileToolStripMenuItem
+      // 
+      this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.exitToolStripMenuItem});
+      this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
+      this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
+      this.fileToolStripMenuItem.Text = "File";
+      // 
+      // exitToolStripMenuItem
+      // 
+      this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
+      this.exitToolStripMenuItem.Size = new System.Drawing.Size(92, 22);
+      this.exitToolStripMenuItem.Text = "Exit";
+      this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
+      // 
+      // helpToolStripMenuItem
+      // 
+      this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.aboutToolStripMenuItem});
+      this.helpToolStripMenuItem.Name = "helpToolStripMenuItem";
+      this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
+      this.helpToolStripMenuItem.Text = "Help";
+      // 
+      // aboutToolStripMenuItem
+      // 
+      this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
+      this.aboutToolStripMenuItem.Size = new System.Drawing.Size(199, 22);
+      this.aboutToolStripMenuItem.Text = "About gmDebuggerNet";
+      this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);
+      // 
+      // m_toolBar
+      // 
+      this.m_toolBar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.buttonStepInto,
+            this.buttonStepOver,
+            this.buttonStepOut,
+            this.buttonRun,
+            this.buttonStopDebugging,
+            this.buttonToggleBreakpoint,
+            this.toolStripSeparator1,
+            this.buttonBreakAll,
+            this.buttonResumeAll,
+            this.buttonBreakCurrent,
+            this.toolStripSeparator2});
+      this.m_toolBar.Location = new System.Drawing.Point(0, 24);
+      this.m_toolBar.Name = "m_toolBar";
+      this.m_toolBar.Size = new System.Drawing.Size(963, 25);
+      this.m_toolBar.TabIndex = 1;
+      this.m_toolBar.Text = "toolStrip1";
+      // 
+      // buttonStepInto
+      // 
+      this.buttonStepInto.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.buttonStepInto.Image = ((System.Drawing.Image)(resources.GetObject("buttonStepInto.Image")));
+      this.buttonStepInto.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.buttonStepInto.Name = "buttonStepInto";
+      this.buttonStepInto.Size = new System.Drawing.Size(23, 22);
+      this.buttonStepInto.Text = "Step Into (F11)";
+      this.buttonStepInto.Click += new System.EventHandler(this.buttonStepInto_Click);
+      // 
+      // buttonStepOver
+      // 
+      this.buttonStepOver.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.buttonStepOver.Image = ((System.Drawing.Image)(resources.GetObject("buttonStepOver.Image")));
+      this.buttonStepOver.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.buttonStepOver.Name = "buttonStepOver";
+      this.buttonStepOver.Size = new System.Drawing.Size(23, 22);
+      this.buttonStepOver.Text = "Step Over (F10)";
+      this.buttonStepOver.Click += new System.EventHandler(this.buttonStepOver_Click);
+      // 
+      // buttonStepOut
+      // 
+      this.buttonStepOut.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.buttonStepOut.Image = ((System.Drawing.Image)(resources.GetObject("buttonStepOut.Image")));
+      this.buttonStepOut.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.buttonStepOut.Name = "buttonStepOut";
+      this.buttonStepOut.Size = new System.Drawing.Size(23, 22);
+      this.buttonStepOut.Text = "Step Out (shift + F11)";
+      this.buttonStepOut.Click += new System.EventHandler(this.buttonStepOut_Click);
+      // 
+      // buttonRun
+      // 
+      this.buttonRun.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.buttonRun.Image = ((System.Drawing.Image)(resources.GetObject("buttonRun.Image")));
+      this.buttonRun.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.buttonRun.Name = "buttonRun";
+      this.buttonRun.Size = new System.Drawing.Size(23, 22);
+      this.buttonRun.Text = "Run (F5)";
+      this.buttonRun.Click += new System.EventHandler(this.buttonRun_Click);
+      // 
+      // buttonStopDebugging
+      // 
+      this.buttonStopDebugging.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.buttonStopDebugging.Image = ((System.Drawing.Image)(resources.GetObject("buttonStopDebugging.Image")));
+      this.buttonStopDebugging.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.buttonStopDebugging.Name = "buttonStopDebugging";
+      this.buttonStopDebugging.Size = new System.Drawing.Size(23, 22);
+      this.buttonStopDebugging.Text = "Stop Debugging (shift + F5)";
+      this.buttonStopDebugging.Click += new System.EventHandler(this.buttonStopDebugging_Click);
+      // 
+      // buttonToggleBreakpoint
+      // 
+      this.buttonToggleBreakpoint.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.buttonToggleBreakpoint.Image = ((System.Drawing.Image)(resources.GetObject("buttonToggleBreakpoint.Image")));
+      this.buttonToggleBreakpoint.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.buttonToggleBreakpoint.Name = "buttonToggleBreakpoint";
+      this.buttonToggleBreakpoint.Size = new System.Drawing.Size(23, 22);
+      this.buttonToggleBreakpoint.Text = "Toggle Breakpoint (F9)";
+      this.buttonToggleBreakpoint.Click += new System.EventHandler(this.buttonToggleBreakpoint_Click);
+      // 
+      // toolStripSeparator1
+      // 
+      this.toolStripSeparator1.Name = "toolStripSeparator1";
+      this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);
+      // 
+      // buttonBreakAll
+      // 
+      this.buttonBreakAll.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.buttonBreakAll.Image = ((System.Drawing.Image)(resources.GetObject("buttonBreakAll.Image")));
+      this.buttonBreakAll.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.buttonBreakAll.Name = "buttonBreakAll";
+      this.buttonBreakAll.Size = new System.Drawing.Size(23, 22);
+      this.buttonBreakAll.Text = "Break All";
+      this.buttonBreakAll.Click += new System.EventHandler(this.buttonBreakAll_Click);
+      // 
+      // buttonResumeAll
+      // 
+      this.buttonResumeAll.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.buttonResumeAll.Image = ((System.Drawing.Image)(resources.GetObject("buttonResumeAll.Image")));
+      this.buttonResumeAll.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.buttonResumeAll.Name = "buttonResumeAll";
+      this.buttonResumeAll.Size = new System.Drawing.Size(23, 22);
+      this.buttonResumeAll.Text = "Resume All";
+      this.buttonResumeAll.Click += new System.EventHandler(this.buttonResumeAll_Click);
+      // 
+      // buttonBreakCurrent
+      // 
+      this.buttonBreakCurrent.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.buttonBreakCurrent.Image = ((System.Drawing.Image)(resources.GetObject("buttonBreakCurrent.Image")));
+      this.buttonBreakCurrent.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.buttonBreakCurrent.Name = "buttonBreakCurrent";
+      this.buttonBreakCurrent.Size = new System.Drawing.Size(23, 22);
+      this.buttonBreakCurrent.Text = "Break Current";
+      this.buttonBreakCurrent.Click += new System.EventHandler(this.buttonBreakCurrent_Click);
+      // 
+      // toolStripSeparator2
+      // 
+      this.toolStripSeparator2.Name = "toolStripSeparator2";
+      this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25);
+      // 
+      // m_statusStrip
+      // 
+      this.m_statusStrip.Location = new System.Drawing.Point(0, 509);
+      this.m_statusStrip.Name = "m_statusStrip";
+      this.m_statusStrip.Size = new System.Drawing.Size(963, 22);
+      this.m_statusStrip.TabIndex = 3;
+      this.m_statusStrip.Text = "statusStrip1";
+      // 
+      // m_splitContainerV
+      // 
+      this.m_splitContainerV.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.m_splitContainerV.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.m_splitContainerV.Location = new System.Drawing.Point(0, 49);
+      this.m_splitContainerV.Name = "m_splitContainerV";
+      // 
+      // m_splitContainerV.Panel1
+      // 
+      this.m_splitContainerV.Panel1.Controls.Add(this.m_splitContainerH);
+      // 
+      // m_splitContainerV.Panel2
+      // 
+      this.m_splitContainerV.Panel2.Controls.Add(this.m_threads);
+      this.m_splitContainerV.Panel2.Controls.Add(this.m_callstack);
+      this.m_splitContainerV.Panel2.Controls.Add(this.m_locals);
+      this.m_splitContainerV.Size = new System.Drawing.Size(963, 460);
+      this.m_splitContainerV.SplitterDistance = 703;
+      this.m_splitContainerV.TabIndex = 4;
+      // 
+      // m_splitContainerH
+      // 
+      this.m_splitContainerH.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+      this.m_splitContainerH.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.m_splitContainerH.Location = new System.Drawing.Point(0, 0);
+      this.m_splitContainerH.Name = "m_splitContainerH";
+      this.m_splitContainerH.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // m_splitContainerH.Panel1
+      // 
+      this.m_splitContainerH.Panel1.Controls.Add(this.m_scintilla);
+      // 
+      // m_splitContainerH.Panel2
+      // 
+      this.m_splitContainerH.Panel2.Controls.Add(this.m_output);
+      this.m_splitContainerH.Size = new System.Drawing.Size(703, 460);
+      this.m_splitContainerH.SplitterDistance = 364;
+      this.m_splitContainerH.TabIndex = 0;
+      // 
+      // m_scintilla
+      // 
+      this.m_scintilla.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.m_scintilla.Location = new System.Drawing.Point(0, 0);
+      this.m_scintilla.Name = "m_scintilla";
+      this.m_scintilla.Size = new System.Drawing.Size(699, 360);
+      this.m_scintilla.Styles.BraceBad.FontName = "Verdana";
+      this.m_scintilla.Styles.BraceLight.FontName = "Verdana";
+      this.m_scintilla.Styles.ControlChar.FontName = "Verdana";
+      this.m_scintilla.Styles.Default.FontName = "Verdana";
+      this.m_scintilla.Styles.IndentGuide.FontName = "Verdana";
+      this.m_scintilla.Styles.LastPredefined.FontName = "Verdana";
+      this.m_scintilla.Styles.LineNumber.FontName = "Verdana";
+      this.m_scintilla.Styles.Max.FontName = "Verdana";
+      this.m_scintilla.TabIndex = 0;
+      // 
+      // m_output
+      // 
+      this.m_output.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.m_output.Location = new System.Drawing.Point(0, 0);
+      this.m_output.Name = "m_output";
+      this.m_output.Size = new System.Drawing.Size(699, 88);
+      this.m_output.TabIndex = 0;
+      // 
+      // m_threads
+      // 
+      this.m_threads.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.ThreadId,
+            this.Status});
+      this.m_threads.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.m_threads.FullRowSelect = true;
+      this.m_threads.GridLines = true;
+      this.m_threads.Location = new System.Drawing.Point(0, 296);
+      this.m_threads.MultiSelect = false;
+      this.m_threads.Name = "m_threads";
+      this.m_threads.Size = new System.Drawing.Size(252, 160);
+      this.m_threads.TabIndex = 2;
+      this.m_threads.UseCompatibleStateImageBehavior = false;
+      this.m_threads.View = System.Windows.Forms.View.Details;
+      this.m_threads.Click += new System.EventHandler(this.m_threads_Click);
+      // 
+      // ThreadId
+      // 
+      this.ThreadId.Tag = "";
+      this.ThreadId.Text = "ThreadId";
+      this.ThreadId.Width = 78;
+      // 
+      // Status
+      // 
+      this.Status.Tag = "";
+      this.Status.Text = "Status";
+      this.Status.Width = 54;
+      // 
+      // m_callstack
+      // 
+      this.m_callstack.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.CallStack});
+      this.m_callstack.Dock = System.Windows.Forms.DockStyle.Top;
+      this.m_callstack.GridLines = true;
+      this.m_callstack.Location = new System.Drawing.Point(0, 123);
+      this.m_callstack.MultiSelect = false;
+      this.m_callstack.Name = "m_callstack";
+      this.m_callstack.Size = new System.Drawing.Size(252, 173);
+      this.m_callstack.TabIndex = 1;
+      this.m_callstack.UseCompatibleStateImageBehavior = false;
+      this.m_callstack.View = System.Windows.Forms.View.Details;
+      // 
+      // CallStack
+      // 
+      this.CallStack.Text = "Call Stack";
+      this.CallStack.Width = 80;
+      // 
+      // m_locals
+      // 
+      this.m_locals.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.Variable,
+            this.Value});
+      this.m_locals.Dock = System.Windows.Forms.DockStyle.Top;
+      this.m_locals.GridLines = true;
+      this.m_locals.Location = new System.Drawing.Point(0, 0);
+      this.m_locals.MultiSelect = false;
+      this.m_locals.Name = "m_locals";
+      this.m_locals.Size = new System.Drawing.Size(252, 123);
+      this.m_locals.TabIndex = 0;
+      this.m_locals.UseCompatibleStateImageBehavior = false;
+      this.m_locals.View = System.Windows.Forms.View.Details;
+      // 
+      // Variable
+      // 
+      this.Variable.Text = "Variable";
+      this.Variable.Width = 65;
+      // 
+      // Value
+      // 
+      this.Value.Text = "Value";
+      this.Value.Width = 50;
+      // 
+      // MainForm
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(963, 531);
+      this.Controls.Add(this.m_splitContainerV);
+      this.Controls.Add(this.m_statusStrip);
+      this.Controls.Add(this.m_toolBar);
+      this.Controls.Add(this.m_menu);
+      this.MainMenuStrip = this.m_menu;
+      this.MinimumSize = new System.Drawing.Size(512, 512);
+      this.Name = "MainForm";
+      this.Text = "gmDebuggerNet";
+      this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
+      this.Load += new System.EventHandler(this.MainForm_Load);
+      this.SizeChanged += new System.EventHandler(this.MainForm_SizeChanged);
+      this.m_menu.ResumeLayout(false);
+      this.m_menu.PerformLayout();
+      this.m_toolBar.ResumeLayout(false);
+      this.m_toolBar.PerformLayout();
+      this.m_splitContainerV.Panel1.ResumeLayout(false);
+      this.m_splitContainerV.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.m_splitContainerV)).EndInit();
+      this.m_splitContainerV.ResumeLayout(false);
+      this.m_splitContainerH.Panel1.ResumeLayout(false);
+      this.m_splitContainerH.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.m_splitContainerH)).EndInit();
+      this.m_splitContainerH.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.m_scintilla)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.MenuStrip m_menu;
+    private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
+    private System.Windows.Forms.ToolStrip m_toolBar;
+    private System.Windows.Forms.StatusStrip m_statusStrip;
+    private System.Windows.Forms.SplitContainer m_splitContainerV;
+    private System.Windows.Forms.SplitContainer m_splitContainerH;
+    private System.Windows.Forms.ToolStripButton buttonStepInto;
+    private System.Windows.Forms.ToolStripButton buttonStepOver;
+    private System.Windows.Forms.ToolStripButton buttonStepOut;
+    private System.Windows.Forms.ToolStripButton buttonRun;
+    private System.Windows.Forms.ToolStripButton buttonStopDebugging;
+    private System.Windows.Forms.ToolStripButton buttonToggleBreakpoint;
+    private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+    private System.Windows.Forms.ToolStripButton buttonBreakAll;
+    private System.Windows.Forms.ToolStripButton buttonResumeAll;
+    private System.Windows.Forms.ToolStripButton buttonBreakCurrent;
+    private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+    private ScintillaNet.Scintilla m_scintilla;
+    private System.Windows.Forms.ListView m_threads;
+    private System.Windows.Forms.ListView m_callstack;
+    private System.Windows.Forms.ListView m_locals;
+    private System.Windows.Forms.ColumnHeader CallStack;
+    private System.Windows.Forms.ColumnHeader Variable;
+    private System.Windows.Forms.ColumnHeader Value;
+    private System.Windows.Forms.ColumnHeader ThreadId;
+    private System.Windows.Forms.ColumnHeader Status;
+    private System.Windows.Forms.Panel m_output;
+  }
+}
+

+ 275 - 0
gmsrc/src/gmddotnet/Form1.cs

@@ -0,0 +1,275 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace gmDebuggerNet
+{
+  public partial class MainForm : Form
+  {
+    public App m_app;
+    public Timer m_tick;
+
+    public MainForm()
+    {
+      InitializeComponent();
+
+      // Allow form to receive keyboard focus
+      CreateControl();
+      SetStyle(ControlStyles.Selectable, true);
+      this.UpdateStyles();
+
+      // Allow us to process some shortcut keys instead of Scintilla
+      m_scintilla.KeyDown += new KeyEventHandler(ScintillaKeyDown);
+
+      // Create app instance
+      m_app = new App();
+      m_app.Init(this);
+
+      // Update tick
+      m_tick = new Timer();
+      m_tick.Tick += new EventHandler(m_app.OnTick);
+      m_tick.Interval = 1; //Interval in MS
+      m_tick.Start();
+    }
+
+    public System.Windows.Forms.ListView GetLocals() { return m_locals; }
+    public System.Windows.Forms.ListView GetThreads() { return m_threads; }
+    public System.Windows.Forms.ListView GetCallStack() { return m_callstack; }
+    public ScintillaNet.Scintilla GetSourceView() { return m_scintilla; }
+    public System.Windows.Forms.Panel GetOutput() { return m_output; }
+
+    public void UpdateToolBar()
+    {
+      bool hasCurrentThread = false;
+      bool isDebugging = false;
+
+      if( m_app.m_state.m_currentDebugThread != 0 )
+      {
+        hasCurrentThread = true;
+      }
+      if( m_app.m_state.m_isDebugging )
+      {
+        isDebugging = true;
+      }
+
+      buttonStepInto.Enabled = hasCurrentThread;
+      buttonStepOver.Enabled = hasCurrentThread;
+      buttonStepOut.Enabled = hasCurrentThread;
+      buttonRun.Enabled = hasCurrentThread;
+      buttonToggleBreakpoint.Enabled = hasCurrentThread;
+      buttonBreakCurrent.Enabled = hasCurrentThread;
+
+      buttonStopDebugging.Enabled = isDebugging;
+      buttonBreakAll.Enabled = isDebugging;
+      buttonResumeAll.Enabled = isDebugging;
+    }
+
+    private void exitToolStripMenuItem_Click(object sender, EventArgs e)
+    {
+      Close();
+    }
+
+    private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
+    {
+      DialogResult result = MessageBox.Show(this, 
+                                            "Example debugger for GameMonkey Script", 
+                                            "About gmDebuggerNet",
+                                            MessageBoxButtons.OK,
+                                            MessageBoxIcon.Information,
+                                            MessageBoxDefaultButton.Button1);
+
+    }
+
+    private void m_threads_Click(object sender, EventArgs e)
+    {
+      if (m_threads.SelectedItems.Count > 0)
+      {
+        ListViewItem selected = m_threads.SelectedItems[0];
+        if ((selected != null) && (selected.Tag != null))
+        {
+          m_app.OnGetThreadContext( (DebuggerState.ThreadInfo)selected.Tag );
+        }
+      }
+    }
+
+    private void buttonResumeAll_Click(object sender, EventArgs e)
+    {
+      m_app.OnResumeAll();
+    }
+
+    private void buttonBreakAll_Click(object sender, EventArgs e)
+    {
+      m_app.OnBreakAll();
+    }
+
+    private void buttonStepInto_Click(object sender, EventArgs e)
+    {
+      m_app.OnStepInto();
+    }
+
+    private void buttonStepOver_Click(object sender, EventArgs e)
+    {
+      m_app.OnStepOver();
+    }
+
+    private void buttonStepOut_Click(object sender, EventArgs e)
+    {
+      m_app.OnStepOut();
+    }
+
+    private void buttonRun_Click(object sender, EventArgs e)
+    {
+      m_app.OnRun();
+    }
+
+    private void buttonStopDebugging_Click(object sender, EventArgs e)
+    {
+      m_app.OnStopDebugging();
+    }
+
+    private void buttonToggleBreakpoint_Click(object sender, EventArgs e)
+    {
+      m_app.OnToggleBreakpoint();
+    }
+
+    private void buttonBreakCurrent_Click(object sender, EventArgs e)
+    {
+      m_app.OnBreakCurrentThread();
+    }
+
+    // Still need to handle keys from Scintilla
+    void ScintillaKeyDown(object sender, KeyEventArgs e)
+    {
+      OnKeyDown(e);
+    }
+
+    // Overriding this to grab keys as early as possible
+    protected override bool ProcessDialogKey(	Keys a_keyData )
+    {
+      KeyEventArgs keyArgs = new KeyEventArgs(a_keyData);
+
+      this.OnKeyDown( keyArgs );
+
+      if(keyArgs.Handled)
+      {
+        return true;
+      }
+
+      return base.ProcessDialogKey(a_keyData);
+    } 
+
+    //private void MainForm_KeyDown(object sender, KeyEventArgs e)
+    protected override void OnKeyDown(KeyEventArgs e)
+    {
+      bool processInput = true;
+
+      if (e.Shift == true )
+      {
+        if( e.KeyCode == Keys.F11 )
+        {
+          buttonStepOut_Click(null, null);
+          processInput = false;
+        }
+        else if (e.KeyCode == Keys.F5)
+        {
+          buttonStopDebugging_Click(null, null);
+          processInput = false;
+        }
+      }
+      else
+      {
+        if (e.KeyCode == Keys.F11)
+        {
+          buttonStepInto_Click(null, null);
+          processInput = false;
+        }
+        else if (e.KeyCode == Keys.F10)
+        {
+          buttonStepOver_Click(null, null);
+          processInput = false;
+        }
+        else if (e.KeyCode == Keys.F5)
+        {
+          buttonRun_Click(null, null);
+          processInput = false;
+        }
+        else if (e.KeyCode == Keys.F9)
+        {
+          buttonToggleBreakpoint_Click(null, null);
+          processInput = false;
+        }
+        else if (e.KeyCode == Keys.F8)
+        {
+          buttonBreakCurrent_Click(null, null);
+          processInput = false;
+        }
+      }
+
+      if( !processInput )
+      {
+        e.Handled = true;
+      }
+
+      base.OnKeyDown(e);
+    }
+
+    private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
+    {
+      if( m_app != null )
+      {
+        m_app.OnExit();
+      }
+    }
+
+    private void MainForm_SizeChanged(object sender, EventArgs e)
+    {
+      ResizeComponents();
+    }
+
+    public void ResizeComponents()
+    {
+      // Set column widths based on number of columns
+      ResizeListViewColumns(m_locals);
+      ResizeListViewColumns(m_threads);
+      ResizeListViewColumns(m_callstack);
+
+      // Spread panels vertically
+      int totalHeight = m_splitContainerV.Panel2.Height;
+      int panelHeight = totalHeight / 3;
+      if (panelHeight < 10) // Paranoid clamp size
+      {
+        panelHeight = 10;
+      }
+
+      m_locals.Height = panelHeight;
+      m_callstack.Height = panelHeight;
+      m_threads.Height = panelHeight;
+    }
+
+    public void ResizeListViewColumns(ListView a_listView)
+    {
+      int numColumns = a_listView.Columns.Count;
+      int columnWidth = (m_locals.Width - 2) / numColumns;
+      if (columnWidth < 10) // Paranoid clamp size
+      {
+        columnWidth = 10;
+      }
+      
+      for(int colIndex=0; colIndex < a_listView.Columns.Count; ++colIndex)
+      {
+        a_listView.Columns[colIndex].Width = columnWidth;
+      }
+    }
+
+    private void MainForm_Load(object sender, EventArgs e)
+    {
+      ResizeComponents();
+    }
+
+  }
+}

+ 202 - 0
gmsrc/src/gmddotnet/Form1.resx

@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="m_menu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="m_toolBar.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>132, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="buttonStepInto.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABtSURBVDhPYzhw4MB/SjADTDMDw///2DAhw8EG4NIME8dn
+        CNwF2BTR3wAGoJUgjB4uCD6qPNj7yJLo3sDlBRRLsBlAKEYwDEB3OraYQXYdsnraeIFg4kEOaFxOw54u
+        8MQCIVtxyeNNicQYSrEBAO+Ps41Z6uQuAAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="buttonStepOver.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABzSURBVDhPtZJdDsAgCIN7/1NxM7ap+IPMdC4+kJioH6UU
+        IqJ/CwYAVNnyTROE/dy/60FVCTuSgc5CcLd5Ko/YzkPX4l2oxD5PphWoX8AW5M38pHol3d95UFXXZGYv
+        jo6zisCQE2Y7oVo2ZLSSXeDn2EeNLmNn17TwM9VSAAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="buttonStepOut.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAB1SURBVDhPrZJRDoAwCEO5/6m42RSXTkCBoPtYTDb61tYR
+        M4/OIhpmnjpimRWAhqQADEffCxg5qMRwUQL8BWkEOk9l+ax+X0OXAwhx6G+a0AnfD9AWKwcPp7fA2vsd
+        AUWavFkHKOm1KPV3whK7T3pF/yrcBjgAxMyxC8PQ32cAAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="buttonRun.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABgSURBVDhPrZILCgAgCEO9/6m8WWGwoGEfWUGE0N6maO7e
+        lGuKOLRlgFlbEg/A7SBliLcAbiWggD8BTimeAPgE56w+tvAlAbt/mwGi8zv3IHPmGWTiBSDNQFnn8iqz
+        mQzoqtoRjIRRYbAAAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="buttonStopDebugging.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACFSURBVDhPpZKLDYAwCETZfyo2q4JcAygqoUnT9MPrHUDM
+        vCaTJsES2wYQraBYAeWQ1+eEStvqGc43IFsR6IYjMgG3hVqC3ThAaQG/PSmBXFl7ORABKQd+HyxU5fwN
+        eKtEyqGqgpVQBZ95zYm8smp4SFD12QcGUL9X+e+NNGnndivnz8aAAzgV/D7ZvzdTAAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="buttonToggleBreakpoint.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABlSURBVDhPpZNtCgAgCEN3/1N5M/sAYwmS6Q8h0LeVKURE
+        q4EIBKAWYY1PGDBJtYhELudVxJA/rzybHfgF8i1MoA9nXb37dm7BPwLctP6bT/eqX8UCvgepIbkGoDKe
+        P0sSLkZGZAAJqDUwIB0KcAAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="buttonBreakAll.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABSSURBVDhPYzhw4MB/SjEDpQaA9A9SQxgYGP6DMNiJRLBh
+        QQH3DkgTUCcYE8tGMQRZEzkGgV0yeAxBdw1ZYQIPICJiBDnWMGKHkpQ7SFMsuV4CADLvpfKQq+DMAAAA
+        AElFTkSuQmCC
+</value>
+  </data>
+  <data name="buttonResumeAll.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABQSURBVDhPYzhw4MB/SjEDpQaA9A9SQxgYGP6DMNiJRLBh
+        QQH3DlgTDBLJRjEExQAyDAK7ZPAYguEacsIEHkBExAhyrGHEDiUpd5CmWHK9BAAFHaXySchZxwAAAABJ
+        RU5ErkJggg==
+</value>
+  </data>
+  <data name="buttonBreakCurrent.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAAA4AAAAPCAYAAADUFP50AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABPSURBVDhPYzhw4MB/cjADuiYGBob/2DCGOmQBXJpg4ihq
+        YRyY5P//DP+xYXTNYKcS0gQzCFnzqEa0EKZe4BATJVjjET0REJPsqJNWScklAHcbCEU2A636AAAAAElF
+        TkSuQmCC
+</value>
+  </data>
+  <metadata name="m_statusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>239, 17</value>
+  </metadata>
+</root>

BIN
gmsrc/src/gmddotnet/Icons/IconBreakAll.bmp


BIN
gmsrc/src/gmddotnet/Icons/IconBreakCurrent.bmp


BIN
gmsrc/src/gmddotnet/Icons/IconResumeAll.bmp


BIN
gmsrc/src/gmddotnet/Icons/IconRun.bmp


BIN
gmsrc/src/gmddotnet/Icons/IconStepInto.bmp


BIN
gmsrc/src/gmddotnet/Icons/IconStepOut.bmp


BIN
gmsrc/src/gmddotnet/Icons/IconStepOver.bmp


BIN
gmsrc/src/gmddotnet/Icons/IconStopDebugging.bmp


BIN
gmsrc/src/gmddotnet/Icons/IconToggleBreakpoint.bmp


+ 290 - 0
gmsrc/src/gmddotnet/Network.cs

@@ -0,0 +1,290 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using System.Threading;
+using System.Net.Sockets;
+using System.Net;
+using System.Windows.Forms;
+using System.IO;
+
+namespace gmDebuggerNet
+{
+  // A raw buffer to recieve network data
+  public class NetBuffer
+  {
+    public const int BufferSize = 1024;           // Size of buffer
+    public byte[] m_bytes = new byte[BufferSize];  // Buffer
+  }
+
+  // State used to make logical packets from the TCP stream
+  public enum ReadState
+  {
+    StateSearching = 0,
+    StateGettingMessage = 1,
+  };
+
+  // Network communication helper, connect, send, receive data via sockets
+  public class Network
+  {
+    // Status when net work is closed
+    public enum CloseStatus
+    {
+      Unknown,
+      Closed,                                     // We closed the connection
+      LostConnection,                             // Connection was lost or dropped
+    };
+
+    public static readonly int PACKET_ID = 0x4fe27d9a;
+
+    protected Socket m_socketListener;                                // Socket to listen for connection
+    protected Socket m_socketWorker;                                  // Socket to send and rec data
+    protected NetBuffer m_buffer = new NetBuffer();                   // Rec buffer
+    public bool IsConnected = false;                                  // Is connected?
+    public CloseStatus m_closeStatus = CloseStatus.Unknown;           // Status when closed
+    protected MemoryStream m_inStreamTemp;                            // Temporary rec stream
+    protected Queue<MemoryStream> m_inQueue;                          // Queue of rec messages
+    protected Mutex m_mutexInQueue;                                   // semaphore for rec queue
+    protected ReadState m_readState = ReadState.StateSearching;       // State for parsing rec stream into messages
+    protected int m_readBytesNeeded = 4 + 4; // Id + size             // Bytes needed for current message (in rec stream)
+    
+    public Network()
+    {
+      m_mutexInQueue = new Mutex();
+
+      m_inStreamTemp = new MemoryStream();
+      m_inQueue = new Queue< MemoryStream >();
+    }
+
+    public void ClearCloseStatus()
+    {
+      m_closeStatus = CloseStatus.Unknown;
+    }
+
+    public MemoryStream GetFirstInQueue()
+    {
+      MemoryStream ret = null;
+      
+      m_mutexInQueue.WaitOne();
+
+      if( m_inQueue.Count > 0 )
+      {
+        ret = m_inQueue.Dequeue();
+      } 
+      
+      m_mutexInQueue.ReleaseMutex();
+
+      return ret;
+    }
+    
+    // Cleanup connection
+    public void Done()
+    {
+      Close();
+    }
+
+    // Start new connection
+    public bool Open(int a_port)
+    {
+      m_readState = ReadState.StateSearching;
+      m_readBytesNeeded = 4 + 4; // Id + size
+
+      try
+      {
+        // Try to open socket at port
+        m_socketListener = new Socket(AddressFamily.Unspecified, SocketType.Stream, ProtocolType.Tcp);
+        // Bind socket to IP
+        m_socketListener.Bind(new IPEndPoint(IPAddress.Any, a_port));
+        // Start listening
+        m_socketListener.Listen(4);
+        // Callback for any client connection attempts
+        m_socketListener.BeginAccept(new AsyncCallback(CallbackClientConnect), null);
+      }
+      catch( SocketException ex )
+      {
+        MessageBox.Show( ex.Message );
+        return false;
+      }
+
+      return true;
+    }
+
+    public void CallbackClientConnect(IAsyncResult a_result)
+    {
+      try
+      {
+        m_socketWorker = m_socketListener.EndAccept(a_result);
+        m_socketWorker.BeginReceive(m_buffer.m_bytes, 0, NetBuffer.BufferSize, 0, new AsyncCallback(CallbackReceive), this);
+
+        IsConnected = true;
+      }
+      catch (ObjectDisposedException)
+      {
+        System.Diagnostics.Debugger.Log(0, "1", "\n CallbackClientConnection: Socket has been closed\n");
+      }
+      catch (SocketException ex)
+      {
+        MessageBox.Show(ex.Message);
+      }
+
+    }
+
+    public void CallbackReceive(IAsyncResult a_asyncResult)
+    {
+      if( m_socketWorker == null )
+      {
+        return; // Connection closed
+      }
+      if( m_socketWorker.Connected == false )
+      {
+        return; // Lost connection
+      }
+      
+      bool cleanupNeeded = false;
+
+      try // NOTE: socket can lose connection while this async function is in process, above checks are inadequate alone
+      {
+        int numBytesRec = m_socketWorker.EndReceive(a_asyncResult);
+        int curRecPos = 0;
+
+        if (numBytesRec > 0)
+        {
+          while( numBytesRec > 0 ) // Consume received bytes
+          {
+            int have = (numBytesRec > m_readBytesNeeded) ? m_readBytesNeeded : numBytesRec;
+            m_readBytesNeeded -= have;
+            numBytesRec -= have;
+
+            // Append current logical packet
+            m_inStreamTemp.Write(m_buffer.m_bytes, curRecPos, have);
+            curRecPos += have;
+
+            // Can we change state?
+            if( m_readBytesNeeded == 0 )
+            {
+              if( m_readState == ReadState.StateSearching )
+              {
+                m_readState = ReadState.StateGettingMessage;
+
+                // Check first 4 bytes is ID
+                int packetId = BitConverter.ToInt32(m_inStreamTemp.GetBuffer(), 0);
+
+                if( packetId != PACKET_ID )
+                {
+                  throw new Exception("Unexpected Packet Id");
+                }
+              
+                // Size is next 4 bytes
+                int packetSize = BitConverter.ToInt32(m_inStreamTemp.GetBuffer(), 4);
+              
+                m_readBytesNeeded = packetSize;
+              }
+              else if( m_readState == ReadState.StateGettingMessage )
+              {
+                m_readState = ReadState.StateSearching;
+
+                // Append complete packet to queue
+                m_inStreamTemp.Seek(4 + 4, SeekOrigin.Begin); // Skip past packet Id, Size
+                m_mutexInQueue.WaitOne();
+                m_inQueue.Enqueue( m_inStreamTemp );
+                m_mutexInQueue.ReleaseMutex();
+              
+                m_inStreamTemp = new MemoryStream();
+                m_readBytesNeeded = 4 + 4; // Id + size
+              }
+            }
+          }
+        }
+
+        m_socketWorker.BeginReceive(m_buffer.m_bytes, 0, NetBuffer.BufferSize, 0, new AsyncCallback(CallbackReceive), this);
+      }
+      catch ( System.Net.Sockets.SocketException ) //ex)
+      {
+        //MessageBox.Show(ex.Message);
+        cleanupNeeded = true;
+      }
+      finally
+      {
+        if( cleanupNeeded )
+        {
+          Close();
+          m_closeStatus = CloseStatus.LostConnection;
+        }
+      }
+    }
+
+    public void Close()
+    {
+       if( m_socketListener != null )
+      {
+        if( m_socketListener.Connected )
+        {
+          m_socketListener.Shutdown(SocketShutdown.Both);
+        }
+        m_socketListener.Close();
+        m_socketListener = null;
+      }
+      if( m_socketWorker != null )
+      {
+        if (m_socketWorker.Connected)
+        {
+          m_socketWorker.Shutdown(SocketShutdown.Both);
+        }
+        m_socketWorker.Close();
+        m_socketWorker = null;
+      }
+
+      IsConnected = false;
+    }
+
+    public void Send(MemoryStream a_stream)
+    {
+      if( IsConnected )
+      {
+        // Send Syncronously
+/*
+        // Prefix with Id and Size as these are not part of the buffer
+        m_socketWorker.Send(BitConverter.GetBytes((int)PACKET_ID), 4, SocketFlags.None);
+        m_socketWorker.Send(BitConverter.GetBytes((int)a_stream.Length), 4, SocketFlags.None);
+
+        m_socketWorker.Send(a_stream.GetBuffer(), (int)a_stream.Length, SocketFlags.None);
+ */
+        // Send Asyncronously
+
+        // Copy message to temporary buffer so we can fire and forget (May be more efficient to recycle a pool of buffers)
+        int outBufferSize = (int)a_stream.Length + 4 + 4;
+        int curOffset = 0;
+        byte[] outBufferTemp = new byte[ outBufferSize ];
+        
+        Buffer.BlockCopy(BitConverter.GetBytes((int)PACKET_ID), 0, outBufferTemp, curOffset, 4);
+        curOffset += 4;
+        Buffer.BlockCopy(BitConverter.GetBytes((int)a_stream.Length), 0, outBufferTemp, curOffset, 4);
+        curOffset += 4;
+        Buffer.BlockCopy(a_stream.GetBuffer(), 0, outBufferTemp, curOffset, (int)a_stream.Length);
+
+        // Start the async send
+        m_socketWorker.BeginSend( outBufferTemp, 0, outBufferSize,0, new AsyncCallback(SendCallback), m_socketWorker);
+      }
+      a_stream.SetLength(0); // Reset buffer to recycle
+    }
+
+    private void SendCallback(IAsyncResult ar)
+    {
+      try
+      {
+        // Retrieve the socket from the state object.
+        //Network This = (Network)ar.AsyncState;
+        //Socket socket = This.m_socketWorker;
+
+        // Complete sending the data to the remote device.
+        int bytesSent = m_socketWorker.EndSend(ar);
+      }
+      catch (Exception )//ex)
+      {
+        //MessageBox.Show(ex.Message);
+      }
+    }
+
+  }
+}

+ 200 - 0
gmsrc/src/gmddotnet/OutputWin.cs

@@ -0,0 +1,200 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.Drawing;
+
+
+namespace gmDebuggerNet
+{
+  // Quick and dirty log window
+  // Uses RichTextBox to store a limited set of colored lines of text
+  public class OutputWin
+  {
+    public enum LogType
+    {
+      Info,
+      Warning,
+      Error,
+    };
+
+    protected RichTextBox m_control;
+    protected Int32 m_maxLines;
+    protected Color m_colorError;
+    protected Color m_colorWarning;
+    protected Color m_colorInfo;
+ 
+    public OutputWin()
+    {
+      m_control = null;
+
+      m_colorError = Color.Red;
+      m_colorWarning = Color.OrangeRed;
+      m_colorInfo = Color.Black;
+
+      m_maxLines = 200;
+
+      m_control = new RichTextBox();
+      m_control.ReadOnly = true;
+    }
+
+    public Control GetControl()                           { return m_control; }
+
+    public void AddLogText(LogType a_logType, String a_text)
+    {
+      if( m_control == null )
+      {
+        return;
+      }
+  
+      switch (a_logType)
+      {
+        case LogType.Error:
+        {
+          FormsUtils.RTBAppendLine(m_control, a_text, m_colorError);
+          break;
+        }
+        case LogType.Warning:
+        {
+          FormsUtils.RTBAppendLine(m_control, a_text, m_colorWarning);
+          break;
+        }
+        default: // LogType.Info
+        {
+          FormsUtils.RTBAppendLine(m_control, a_text, m_colorInfo);
+          break;
+        }
+      }
+  
+      FormsUtils.RTBScrollToEnd(m_control); // Do we want to do this?
+
+      TrimToLineLimit();    
+    }
+
+
+    public void TrimToLineLimit()
+    {
+      if( m_control == null )
+      {
+        return;
+      }
+      while( FormsUtils.RTBGetNumLines(m_control) > m_maxLines )
+      {
+        FormsUtils.RTBDeleteFirstLine(m_control);
+      }
+    }
+
+    public void SetLineLimit(int a_maxLines)
+    {
+      m_maxLines = a_maxLines;
+      if( m_control != null )
+      {
+        TrimToLineLimit();
+      }
+    }
+
+    public void Clear()
+    {
+      if( m_control != null )
+      {
+        m_control.Clear();
+      }
+    }
+
+  }
+
+  // Helpers to work with RichTextBox control
+  // Pasted from another project
+  public class FormsUtils
+  {
+    static public void RTBSelectLine(RichTextBox a_rtb, int a_line)
+    {
+      int start = a_rtb.GetFirstCharIndexFromLine(a_line);
+      int end = a_rtb.GetFirstCharIndexFromLine(a_line + 1);
+
+      if( start < 0 )
+      {
+        start = 0;
+        end = 0;
+      }
+      if( end < 0 )
+      {
+        end = a_rtb.Text.Length;
+      }
+
+      a_rtb.Select(start, end - start);
+    }
+
+
+    static public void RTBDeleteSelected(RichTextBox a_rtb)
+    {
+      bool oldReadOnly = a_rtb.ReadOnly;
+      a_rtb.ReadOnly = false;
+
+      a_rtb.SelectedText = "";
+
+      a_rtb.ReadOnly = oldReadOnly;
+    }
+
+
+    static public void RTBAppendLine(RichTextBox a_rtb, String a_text)
+    {
+      bool oldReadOnly = a_rtb.ReadOnly;
+      a_rtb.ReadOnly = false;
+
+      a_rtb.AppendText(a_text);
+      a_rtb.AppendText( "\r\n" );
+
+      a_rtb.ReadOnly = oldReadOnly;
+    }
+
+
+    static public void RTBAppendLine(RichTextBox a_rtb, String a_text, Color a_color)
+    {
+      bool oldReadOnly = a_rtb.ReadOnly;
+      a_rtb.ReadOnly = false;
+
+      a_rtb.AppendText(a_text);
+
+      int lastLine = a_rtb.Lines.Length - 1;
+
+      RTBSelectLine(a_rtb, lastLine);
+      a_rtb.SelectionColor = a_color;
+
+      a_rtb.AppendText( "\r\n" );
+
+      a_rtb.ReadOnly = oldReadOnly;
+    }
+
+
+    static public void RTBDeleteFirstLine(RichTextBox a_rtb)
+    {
+      if( a_rtb.Lines.Length > 0 )
+      {
+        RTBSelectLine(a_rtb, 0);
+        RTBDeleteSelected(a_rtb);
+      }
+    }
+
+
+    static public int RTBGetNumLines(RichTextBox a_rtb)
+    {
+      return a_rtb.Lines.Length;
+    }
+
+
+    static public void RTBScrollToEnd(RichTextBox a_rtb)
+    {
+      int lastChar = a_rtb.TextLength - 1;
+      if( lastChar < 0 )
+      {
+        lastChar = 0;
+      }
+      a_rtb.SelectionStart = lastChar;
+      a_rtb.SelectionLength  = 0;
+      a_rtb.ScrollToCaret();  
+    }
+
+  }
+}

+ 21 - 0
gmsrc/src/gmddotnet/Program.cs

@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace gmDebuggerNet
+{
+  static class Program
+  {
+    /// <summary>
+    /// The main entry point for the application.
+    /// </summary>
+    [STAThread]
+    static void Main()
+    {
+      Application.EnableVisualStyles();
+      Application.SetCompatibleTextRenderingDefault(false);
+      Application.Run(new MainForm());
+    }
+  }
+}

+ 36 - 0
gmsrc/src/gmddotnet/Properties/AssemblyInfo.cs

@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("gmDebuggerNet")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("gmDebuggerNet")]
+[assembly: AssemblyCopyright("Copyright ©  2012")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("8bccc785-47bc-48ca-a44e-101cbcc349bd")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

+ 63 - 0
gmsrc/src/gmddotnet/Properties/Resources.Designer.cs

@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.239
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace gmDebuggerNet.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("gmDebuggerNet.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+    }
+}

+ 117 - 0
gmsrc/src/gmddotnet/Properties/Resources.resx

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 26 - 0
gmsrc/src/gmddotnet/Properties/Settings.Designer.cs

@@ -0,0 +1,26 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.239
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace gmDebuggerNet.Properties {
+    
+    
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default {
+            get {
+                return defaultInstance;
+            }
+        }
+    }
+}

+ 7 - 0
gmsrc/src/gmddotnet/Properties/Settings.settings

@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>

+ 15 - 0
gmsrc/src/gmddotnet/ReadMe_gmDebuggerNet.txt

@@ -0,0 +1,15 @@
+This project is simply an experiment to convert the example debugger to C# .Net from C++ MFC.
+It is as identically flawed and terrible as the original.
+
+To build:
+o The files 'SciLexer.dll' and 'ScintillaNet.dll' may need to be copied into the executable folder ie. bin\Debug
+o If the MS Visual Studio designer does not show and edit the main form correctly, you may need to copy 'SciLexer.dll' to 
+  a PATH location such as Windows\SysWOW64 (or Windows\System32 for 32bit OS)
+  If there is need to add Scintilla to the toolbox: ToolBox (right click), Choose Items, Browse (locate ScintillaNet.dll, check box, ok)
+  If there is need to add Scintilla Reference: Solution Explorer, References (right click), Add Reference, Browse (locate ScintillaNet.dll) 
+
+Notes:
+o App.cs may have some TODO comments at the top
+o You will need to allow firewall access to run the debugger.
+o The debugger works the same as the original... Run debugger first, then run a GM script with debugger support (eg. GME someScript.gm -d ) 
+

+ 224 - 0
gmsrc/src/gmddotnet/ScintillaNet/ReadMe.rtf

@@ -0,0 +1,224 @@
+{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31506\stshfloch31506\stshfhich31506\stshfbi31507\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}
+{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;}
+{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Verdana;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
+{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}
+{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
+{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}
+{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f302\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f303\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
+{\f305\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f306\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f307\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f308\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
+{\f309\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f310\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f322\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}{\f323\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;}
+{\f325\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f326\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f327\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f328\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);}
+{\f329\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f330\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f642\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f643\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;}
+{\f645\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f646\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f649\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f650\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);}
+{\f672\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f673\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f675\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f676\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}
+{\f679\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f680\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\f692\fbidi \fswiss\fcharset238\fprq2 Verdana CE;}{\f693\fbidi \fswiss\fcharset204\fprq2 Verdana Cyr;}
+{\f695\fbidi \fswiss\fcharset161\fprq2 Verdana Greek;}{\f696\fbidi \fswiss\fcharset162\fprq2 Verdana Tur;}{\f699\fbidi \fswiss\fcharset186\fprq2 Verdana Baltic;}{\f700\fbidi \fswiss\fcharset163\fprq2 Verdana (Vietnamese);}
+{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
+{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
+{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
+{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}
+{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}
+{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}
+{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}
+{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
+{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
+{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}
+{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
+{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
+{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
+{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}
+{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}
+{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}
+{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}
+{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
+{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
+{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}
+{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;
+\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp \f31506\fs22 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 
+\ltrch\fcs0 \f39\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 \styrsid262955 Normal;}{\s1\ql \li0\ri0\sb480\sl276\slmult1
+\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af31503\afs28\alang1025 \ltrch\fcs0 \b\fs22\lang1033\langfe1033\loch\f39\hich\af39\dbch\af31501\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext0 \slink15 \sqformat \spriority9 \styrsid262955 heading 1;}{\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af31503\afs26\alang1025 
+\ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f39\hich\af39\dbch\af31501\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \slink16 \sunhideused \sqformat \spriority9 \styrsid262955 heading 2;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 
+Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv 
+\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 
+\snext11 \ssemihidden \sunhideused \sqformat Normal Table;}{\*\cs15 \additive \rtlch\fcs1 \ab\af31503\afs28 \ltrch\fcs0 \b\fs28\loch\f39\hich\af39\dbch\af31501 \sbasedon10 \slink1 \slocked \spriority9 \styrsid262955 Heading 1 Char;}{\*\cs16 \additive 
+\rtlch\fcs1 \ab\af31503\afs26 \ltrch\fcs0 \b\fs26\loch\f39\hich\af39\dbch\af31501 \sbasedon10 \slink2 \slocked \spriority9 \styrsid262955 Heading 2 Char;}{\s17\ql \li720\ri0\sa200\sl276\slmult1
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\contextualspace \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f39\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext17 \sqformat \spriority34 \styrsid262955 List Paragraph;}}{\*\listtable{\list\listtemplateid-369743384\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelspace0\levelindent0{\leveltext
+\'01*;}{\levelnumbers;}\hres0\chhres0 }{\listname ;}\listid-2}{\list\listtemplateid510419376\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698689
+\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
+\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
+\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}
+\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 
+\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 
+\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 
+\fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }
+{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname 
+;}\listid971208084}{\list\listtemplateid-1774691702\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}
+\f3\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 
+\fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 
+\fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 
+\fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\lin3600 }
+{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\lin4320 }{\listlevel
+\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23
+\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0
+\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname ;}\listid1981382222}}{\*\listoverridetable
+{\listoverride\listid-2\listoverridecount1{\lfolevel\listoverrideformat{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }}\ls1}
+{\listoverride\listid971208084\listoverridecount0\ls2}{\listoverride\listid1981382222\listoverridecount0\ls3}}{\*\rsidtbl \rsid262955\rsid1052713}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440
+\mintLim0\mnaryLim1}{\info{\author Chris}{\operator Chris}{\creatim\yr2009\mo10\dy21\hr11\min11}{\revtim\yr2009\mo10\dy21\hr11\min17}{\version1}{\edmins6}{\nofpages1}{\nofwords115}{\nofchars656}{\nofcharsws770}{\vern32771}}{\*\xmlnstbl {\xmlns1 http://sch
+emas.microsoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect 
+\widowctrl\ftnbj\aenddoc\trackmoves1\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen
+\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1440\dgvorigin1440\dghshow1\dgvshow1
+\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct
+\asianbrkrule\rsidroot262955\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0
+{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sectrsid4201044\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}
+{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}
+{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar
+\s1\ql \li0\ri0\sb480\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0\pararsid262955 \rtlch\fcs1 \ab\af31503\afs28\alang1025 \ltrch\fcs0 
+\b\fs22\lang1033\langfe1033\loch\af39\hich\af39\dbch\af31501\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af31503 \ltrch\fcs0 \insrsid262955\charrsid262955 \hich\af39\dbch\af31501\loch\f39 ScintillaN}{\rtlch\fcs1 \af31503 \ltrch\fcs0 \insrsid262955 
+\hich\af39\dbch\af31501\loch\f39 et}{\rtlch\fcs1 \af31503 \ltrch\fcs0 \insrsid262955\charrsid262955 \hich\af39\dbch\af31501\loch\f39  2.2
+\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid262955 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f39\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {
+\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid262955\charrsid262955 This version of ScintillaN}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid262955 et}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid262955\charrsid262955 
+ will work with Visual Studio 2005 and 2008 including express editions. ScintillaN}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid262955 et}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid262955\charrsid262955 
+ relies on the unmanaged dll SciLexer.dll. When deploying your software make sure SciLexer.dll is in the same folder as ScintillaNet.dll. 
+\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid262955 \rtlch\fcs1 \ab\af31503\afs26\alang1025 \ltrch\fcs0 
+\b\fs20\lang1033\langfe1033\loch\af39\hich\af39\dbch\af31501\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af31503 \ltrch\fcs0 \insrsid262955\charrsid262955 \hich\af39\dbch\af31501\loch\f39 What'\hich\af39\dbch\af31501\loch\f39 s }{\rtlch\fcs1 
+\af31503\afs20 \ltrch\fcs0 \insrsid262955\charrsid262955 \hich\af39\dbch\af31501\loch\f39 installed}{\rtlch\fcs1 \af31503 \ltrch\fcs0 \insrsid262955\charrsid262955 \hich\af39\dbch\af31501\loch\f39 ?}{\rtlch\fcs1 \af31503 \ltrch\fcs0 \insrsid262955 
+\par {\listtext\pard\plain\ltrpar \s17 \rtlch\fcs1 \af31507\afs22 \ltrch\fcs0 \f3\fs20\insrsid262955\charrsid262955 \loch\af3\dbch\af31506\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s17\ql \fi-360\li720\ri0\sa200\sl276\slmult1
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0\pararsid262955\contextualspace \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f39\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af31507 \ltrch\fcs0 
+\insrsid262955\charrsid262955 GAC
+\par {\listtext\pard\plain\ltrpar \s17 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f2\fs20\insrsid262955\charrsid262955 \hich\af2\dbch\af31506\loch\f2 o\tab}}\pard \ltrpar\s17\ql \fi-360\li1440\ri0\sa200\sl276\slmult1
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl1\adjustright\rin0\lin1440\itap0\pararsid262955\contextualspace {\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid262955\charrsid262955 ScintillaNET.dll
+\par {\listtext\pard\plain\ltrpar \s17 \rtlch\fcs1 \af31507\afs22 \ltrch\fcs0 \f3\fs20\insrsid262955\charrsid262955 \loch\af3\dbch\af31506\hich\f3 \'b7\tab}}\pard \ltrpar\s17\ql \fi-360\li720\ri0\sa200\sl276\slmult1
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0\pararsid262955\contextualspace {\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid262955\charrsid262955 System Directory
+\par {\listtext\pard\plain\ltrpar \s17 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f2\fs20\insrsid262955\charrsid262955 \hich\af2\dbch\af31506\loch\f2 o\tab}}\pard \ltrpar\s17\ql \fi-360\li1440\ri0\sa200\sl276\slmult1
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl1\adjustright\rin0\lin1440\itap0\pararsid262955\contextualspace {\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid262955\charrsid262955 SciLexer.dll v1.7.6.0
+\par {\listtext\pard\plain\ltrpar \s17 \rtlch\fcs1 \af31507\afs22 \ltrch\fcs0 \f3\fs20\insrsid262955\charrsid262955 \loch\af3\dbch\af31506\hich\f3 \'b7\tab}}\pard \ltrpar\s17\ql \fi-360\li720\ri0\sa200\sl276\slmult1
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0\pararsid262955\contextualspace {\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid262955\charrsid262955 Program Files\\ScintillaNET
+\par {\listtext\pard\plain\ltrpar \s17 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f2\fs20\insrsid262955\charrsid262955 \hich\af2\dbch\af31506\loch\f2 o\tab}}\pard \ltrpar\s17\ql \fi-360\li1440\ri0\sa200\sl276\slmult1
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl1\adjustright\rin0\lin1440\itap0\pararsid262955\contextualspace {\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid262955\charrsid262955 SciLexer.dll
+\par {\listtext\pard\plain\ltrpar \s17 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f2\fs20\insrsid262955\charrsid262955 \hich\af2\dbch\af31506\loch\f2 o\tab}ScintillaNET.dll
+\par {\listtext\pard\plain\ltrpar \s17 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f2\fs20\insrsid262955\charrsid262955 \hich\af2\dbch\af31506\loch\f2 o\tab}license.rtf
+\par {\listtext\pard\plain\ltrpar \s17 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f2\fs20\insrsid262955\charrsid262955 \hich\af2\dbch\af31506\loch\f2 o\tab}Release Notes.htm
+\par {\listtext\pard\plain\ltrpar \s17 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f2\fs20\insrsid262955\charrsid262955 \hich\af2\dbch\af31506\loch\f2 o\tab}ReadMe.rtf (This file)
+\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid262955 \rtlch\fcs1 \ab\af31503\afs26\alang1025 \ltrch\fcs0 
+\b\fs20\lang1033\langfe1033\loch\af39\hich\af39\dbch\af31501\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af31503 \ltrch\fcs0 \insrsid262955\charrsid262955 \hich\af39\dbch\af31501\loch\f39 Getting Started
+\par {\listtext\pard\plain\ltrpar \s17 \rtlch\fcs1 \af31507\afs22 \ltrch\fcs0 \f3\fs20\insrsid262955\charrsid262955 \loch\af3\dbch\af31506\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s17\ql \fi-360\li720\ri0\sa200\sl276\slmult1
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin720\itap0\pararsid262955\contextualspace \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f39\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af31507 \ltrch\fcs0 
+\insrsid262955\charrsid262955 Start from a Windows Forms Project (VS2005/VS2008 or Express Editions)
+\par {\listtext\pard\plain\ltrpar \s17 \rtlch\fcs1 \af31507\afs22 \ltrch\fcs0 \f3\fs20\insrsid262955\charrsid262955 \loch\af3\dbch\af31506\hich\f3 \'b7\tab}Right click the Toolbox window, Select Choose Items...
+\par {\listtext\pard\plain\ltrpar \s17 \rtlch\fcs1 \af31507\afs22 \ltrch\fcs0 \f3\fs20\insrsid262955\charrsid262955 \loch\af3\dbch\af31506\hich\f3 \'b7\tab}Under the .NET Framework Components tab check the Scintilla component.
+\par {\listtext\pard\plain\ltrpar \s17 \rtlch\fcs1 \af31507\afs22 \ltrch\fcs0 \f3\fs20\insrsid262955\charrsid262955 \loch\af3\dbch\af31506\hich\f3 \'b7\tab}Click OK
+\par {\listtext\pard\plain\ltrpar \s17 \rtlch\fcs1 \af31507\afs22 \ltrch\fcs0 \f3\fs20\insrsid262955\charrsid262955 \loch\af3\dbch\af31506\hich\f3 \'b7\tab}Scintilla is now available in your designer toolbox. Simply drag it onto the design surface.}{
+\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid1052713\charrsid262955 
+\par }{\*\themedata 504b030414000600080000002100828abc13fa0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb6ac3301045f785fe83d0b6d8
+72ba28a5d8cea249777d2cd20f18e4b12d6a8f843409c9df77ecb850ba082d74231062ce997b55ae8fe3a00e1893f354e9555e6885647de3a8abf4fbee29bbd7
+2a3150038327acf409935ed7d757e5ee14302999a654e99e393c18936c8f23a4dc072479697d1c81e51a3b13c07e4087e6b628ee8cf5c4489cf1c4d075f92a0b
+44d7a07a83c82f308ac7b0a0f0fbf90c2480980b58abc733615aa2d210c2e02cb04430076a7ee833dfb6ce62e3ed7e14693e8317d8cd0433bf5c60f53fea2fe7
+065bd80facb647e9e25c7fc421fd2ddb526b2e9373fed4bb902e182e97b7b461e6bfad3f010000ffff0300504b030414000600080000002100a5d6a7e7c00000
+00360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4fc7060abb08
+84a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b63095120f88d94fbc
+52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462a1a82fe353
+bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f7468656d652f7468
+656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b4b0d592c9c
+070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b4757e8d3f7
+29e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f7468656d65
+312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87615b8116d8
+a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad79482a9c04
+98f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b5d8a314d3c
+94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab999fb7b471
+7509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9699640f671
+9e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd5868b37a088d1
+e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d60cf03ac1a5
+193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f9e7ef3f2d1
+17d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be15c308d3f2
+8acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a99793849c26ae6
+6252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d32a423279a
+668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2af074481847
+bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86e877f0034e
+16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb44f95d843b
+5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a6409fb44d0
+8741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c3d9058edf2
+c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db02565e85f3b966
+0d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276b9f7dec44b
+7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8c33585b5fb
+9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e51440ca2e0
+088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95b21be5ceaf
+8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff6dce591a26
+ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec69ffb9e65d0
+28d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239b75a5bb1e6
+345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a44959d366ad93
+b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e82db8df9f30
+254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f74
+68656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f24
+51eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198
+720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528
+a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100828abc13fa0000001c0200001300000000000000000000000000
+000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b000000000000000000000000
+002b0100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000140200007468
+656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b000016000000000000000000
+00000000d10200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b010000270000000000
+00000000000000009b0900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000960a00000000}
+{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d
+617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169
+6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363
+656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e}
+{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;
+\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4;
+\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;
+\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7;
+\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font;
+\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision;
+\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;
+\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;
+\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;
+\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000
+4d73786d6c322e534158584d4c5265616465722e352e3000000000000000000000060000
+d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffffec69d9888b8b3d4c859eaf6cd158be0f0000000000000000000000009086
+13ba7a52ca01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000105000000000000}}

+ 259 - 0
gmsrc/src/gmddotnet/ScintillaNet/Release Notes.htm

@@ -0,0 +1,259 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+	<title></title>
+	<style>
+		html, body, table
+		{
+			font: normal 10pt Verdana;
+		}
+		
+		li
+		{
+			margin-bottom:7px;
+		}
+		
+		h1
+		{
+			font-size:18pt;
+		}
+		
+		h2
+		{
+			font-size:14pt;
+		}
+	</style>
+</head>
+<body>
+	<h1>ScintillaNet 2.2 Release</h1>
+	<p>
+		2009-10-21 Chris Rickard<br />
+		Built against changeset 60365
+	</p>
+	<p>
+		Primarily this is a bugfix release. Only a couple new features are included and they are there becuase they fix/workaround an existing issue.	
+	</p>
+	<h2>Breaking Changes</h2>
+	<ul>
+		<li>
+		All members and strings containing White<b>S</b>pace have been changed to White<b>s</b>pace. White<b>s</b>pace
+		is the accepted spelling and is the spelling used by the .NET framework. (Ignore System.Xml.Schema.XmlSchemaWhiteSpace :)
+		Along the same lines INativeScintilla.GetViewWS() changed to INativeScintilla.GetViewWs()
+		</li>
+		<li>
+		Various members' access changed from public to private or internal. In these cases it didn't make much sense to expose them
+		publicly so in theory noone should be using them thus this won't break anyones code.
+		</li>
+		<li>
+		Most of the EventArg classes changed their properties to be read-only. This is consistent with the style used by the .NET framework. This
+		may potentially break code, initialize all the variables in the constructor where appropriate. If there is a legitimate need to set an
+		EventArg property after construction I'll add it back in.
+		</li>
+		<li>
+		Markers and Lines.VisibleLines implementations were buggy and have been fixed. If you were using them before and made workarounds to
+		compensate for the buggy behavior this will most likely break it.
+		</li>
+		<li>DwellEnd event changed from EventHandler to EventHandler&lt;ScintillaMouseEventArgs&gt; </li>
+		<li>In the static Utilities class PtrToStringUtf8 and MarshalStr have been removed and replaced IntPtrToString</li>
+	</ul>
+	<h2>New Features</h2>
+	<ul>
+	<li>
+	New property Caption sets the Win32 Window Text/Caption. This was introduced to make an elegant workaround. The Control.Text property is usually
+	used but has proven to be problematic because of ScintillaNet's Text implementation. Also we don't want to load a 100mb file in the document then
+	have Windows try to echo this property, it adds a ton of unneeded overhead. Caption now controls this completely, it defaults to the Scintilla
+	control's Type Name (ScintillaNet.Scintilla unless subclassed) but can be changed.
+	</li>
+	<li>
+	UseWhitespaceForeColor/UseWhitespaceBackColor control wether or not the corresponding Whitespace colors are used or inherit from the default style.
+	</li>
+	<li>
+	Style class now has an indexer overload that takes a string. The style names are specific to each lexer and can be found in the ScintillaNet project
+	under Configuration/BuiltIn/LexerStyleNames
+	</li>
+	<li>
+	SelectionForeColor/SelectionBackColor now supports the Transparent color. When Transparent selection colors don't override styled text colors. While 
+	this is inconsistent with other properties like WhitespaceForeColor that have a corresponding UseXXX property I think it's more intuitive and I may
+	change the others in the future. Note that only Transparent is supported, alpha values in any other color are ignored.
+	</li>
+	</ul>
+	<h2>Issues fixed with this release</h2>
+		<table cellpadding="2">
+		<thead style="background-color:ThreeDFace;">
+		<tr>
+		<th>Issue #</th>
+		<th>Title</th>
+		</tr>
+		</thead>
+			<tr>
+				<td>
+					11811
+				</td>
+				<td>
+					<a href="http://scintillanet.codeplex.com/WorkItem/View.aspx?WorkItemId=11811">ScintillaNet
+						in MDIChild destroys after Hide() - WM_DESTROY</a>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					21730
+				</td>
+				<td>
+					<a href="http://scintillanet.codeplex.com/WorkItem/View.aspx?WorkItemId=21730">InsertSnippet</a>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					24622
+				</td>
+				<td>
+					<a href="http://scintillanet.codeplex.com/WorkItem/View.aspx?WorkItemId=24622">Some
+						Fixes</a>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					20491
+				</td>
+				<td>
+					<a href="http://scintillanet.codeplex.com/WorkItem/View.aspx?WorkItemId=20491">Scintilla.Encoding
+						Can Be Out-Of-Sync With Internal Scintilla Code Page</a>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					20097
+				</td>
+				<td>
+					<a href="http://scintillanet.codeplex.com/WorkItem/View.aspx?WorkItemId=20097">Dispose
+						method throws Win32Exception</a>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					10105
+				</td>
+				<td>
+					<a href="http://scintillanet.codeplex.com/WorkItem/View.aspx?WorkItemId=10105">Drag
+						Drop events are never fired</a>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					18351
+				</td>
+				<td>
+					<a href="http://scintillanet.codeplex.com/WorkItem/View.aspx?WorkItemId=18351">Possible
+						bug on japanese OS</a>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					18281
+				</td>
+				<td>
+					<a href="http://scintillanet.codeplex.com/WorkItem/View.aspx?WorkItemId=18281">Throw
+						OutOfMemoryException when open large file</a>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					21053
+				</td>
+				<td>
+					<a href="http://scintillanet.codeplex.com/WorkItem/View.aspx?WorkItemId=21053">TextChanged
+						Event Should Behave Like Other Controls</a>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					18445
+				</td>
+				<td>
+					<a href="http://scintillanet.codeplex.com/WorkItem/View.aspx?WorkItemId=18445">Reset
+						of &#39;transparency&#39; for selection fore color</a>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					18554
+				</td>
+				<td>
+					<a href="http://scintillanet.codeplex.com/WorkItem/View.aspx?WorkItemId=18554">BindableCommand.WordPartLeft
+						not mapped to keystroke</a>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					20397
+				</td>
+				<td>
+					<a href="http://scintillanet.codeplex.com/WorkItem/View.aspx?WorkItemId=20397">ConfigurationManager
+						:: getCustomConfigPath uses wrong variable</a>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					21678
+				</td>
+				<td>
+					<a href="http://scintillanet.codeplex.com/WorkItem/View.aspx?WorkItemId=21678">VisibleLines
+						broken</a>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					24777
+				</td>
+				<td>
+					<a href="http://scintillanet.codeplex.com/WorkItem/View.aspx?WorkItemId=24777">Default
+						font &quot;Arial&quot; throws exception from PageInformation</a>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					21729
+				</td>
+				<td>
+					<a href="http://scintillanet.codeplex.com/WorkItem/View.aspx?WorkItemId=21729">PreviousActiveSnippetLink</a>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					24911
+				</td>
+				<td>
+					<a href="http://scintillanet.codeplex.com/WorkItem/View.aspx?WorkItemId=24911">Problems
+						with Markers</a>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					17869
+				</td>
+				<td>
+					<a href="http://scintillanet.codeplex.com/WorkItem/View.aspx?WorkItemId=17869">SearchFlags
+						ignored</a>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					18028
+				</td>
+				<td>
+					<a href="http://scintillanet.codeplex.com/WorkItem/View.aspx?WorkItemId=18028">DwellEnd
+						event</a>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					18297
+				</td>
+				<td>
+					<a href="http://scintillanet.codeplex.com/WorkItem/View.aspx?WorkItemId=18297">NullReferenceException</a>
+				</td>
+			</tr>
+		</table>
+	
+</body>
+</html>

BIN
gmsrc/src/gmddotnet/ScintillaNet/SciLexer.dll


BIN
gmsrc/src/gmddotnet/ScintillaNet/ScintillaNet.dll


BIN
gmsrc/src/gmddotnet/ScintillaNet/license.rtf


+ 3 - 0
gmsrc/src/gmddotnet/app.config

@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<configuration>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

+ 135 - 0
gmsrc/src/gmddotnet/gmDebuggerNet.csproj

@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{7970A424-77A2-4C5D-856B-7104BA959D02}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>gmDebuggerNet</RootNamespace>
+    <AssemblyName>gmDebuggerNet</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="ScintillaNet, Version=2.2.3581.19319, Culture=neutral, PublicKeyToken=948d6c9751444115, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>ScintillaNet\ScintillaNet.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="App.cs" />
+    <Compile Include="Debugger.cs" />
+    <Compile Include="Form1.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Form1.Designer.cs">
+      <DependentUpon>Form1.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Network.cs" />
+    <Compile Include="OutputWin.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <EmbeddedResource Include="Form1.resx">
+      <DependentUpon>Form1.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+      <DesignTime>True</DesignTime>
+    </Compile>
+    <None Include="app.config" />
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include=".NETFramework,Version=v4.0">
+      <Visible>False</Visible>
+      <ProductName>Microsoft .NET Framework 4 %28x86 and x64%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

+ 20 - 0
gmsrc/src/gmddotnet/gmDebuggerNet.sln

@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gmDebuggerNet", "gmDebuggerNet.csproj", "{7970A424-77A2-4C5D-856B-7104BA959D02}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|x86 = Debug|x86
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{7970A424-77A2-4C5D-856B-7104BA959D02}.Debug|x86.ActiveCfg = Debug|x86
+		{7970A424-77A2-4C5D-856B-7104BA959D02}.Debug|x86.Build.0 = Debug|x86
+		{7970A424-77A2-4C5D-856B-7104BA959D02}.Release|x86.ActiveCfg = Release|x86
+		{7970A424-77A2-4C5D-856B-7104BA959D02}.Release|x86.Build.0 = Release|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal