diff --git a/Aura Debugger/Aura Debugger/Aura Debugger.csproj b/Aura Debugger/Aura Debugger/Aura Debugger.csproj
index 728065a..6a4b4af 100644
--- a/Aura Debugger/Aura Debugger/Aura Debugger.csproj
+++ b/Aura Debugger/Aura Debugger/Aura Debugger.csproj
@@ -31,6 +31,9 @@
prompt
4
+
+ Cosmos.ico
+
@@ -45,16 +48,19 @@
+
Form
Form1.cs
+
Form1.cs
+ Designer
ResXFileCodeGenerator
@@ -78,5 +84,8 @@
+
+
+
\ No newline at end of file
diff --git a/Aura Debugger/Aura Debugger/ConfigManager.cs b/Aura Debugger/Aura Debugger/ConfigManager.cs
new file mode 100644
index 0000000..ac92eac
--- /dev/null
+++ b/Aura Debugger/Aura Debugger/ConfigManager.cs
@@ -0,0 +1,81 @@
+using System;
+using System.IO;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Drawing;
+
+namespace Aura_Debugger
+{
+ public static class ConfigManager
+ {
+ public static string FileName = "cnd_config.ini";
+
+ public static bool WordWrap = true;
+ public static bool AutoScroll = true;
+
+ public static void SaveConfig()
+ {
+ WordWrap = Program.MainForm.GetWordWrap();
+ AutoScroll = Program.MainForm.GetAutoScroll();
+
+ string config = "word_wrap," + WordWrap.ToString() + "\n";
+ config += "auto_scroll," + AutoScroll.ToString() + "\n";
+ config += "win_pos," + Program.MainForm.Location.X.ToString() + "," + Program.MainForm.Location.Y.ToString() + "\n";
+ config += "win_size," + Program.MainForm.Size.Width.ToString() + "," + Program.MainForm.Size.Height.ToString() + "\n";
+ File.WriteAllText(FileName, config);
+ }
+
+ public static void LoadConfig()
+ {
+ if (!File.Exists(FileName))
+ {
+ NetworkManager.WriteInfo("Generating new configuration file");
+ SaveConfig();
+ }
+
+ string[] config = File.ReadAllLines(FileName);
+
+ for (int i = 0; i < config.Length; i++)
+ {
+ string[] parts = config[i].Split(',');
+ if (parts.Length == 0) { continue; }
+
+ if (parts[0] == "word_wrap")
+ {
+ if (parts.Length < 2) { NetworkManager.WriteError("Error parsing word wrap property in configuration file"); return; }
+ WordWrap = bool.Parse(parts[1]);
+ Program.MainForm.SetWordWrap(WordWrap);
+ }
+
+ if (parts[0] == "auto_scroll")
+ {
+ if (parts.Length < 2) { NetworkManager.WriteError("Error parsing auto scroll property in configuration file"); return; }
+ AutoScroll = bool.Parse(parts[1]);
+ Program.MainForm.SetAutoScroll(AutoScroll);
+ }
+
+ if (parts[0] == "win_pos")
+ {
+ if (parts.Length < 3) { NetworkManager.WriteError("Error parsing window position property in configuration file"); return; }
+ int x = 0, y = 0;
+ if (!int.TryParse(parts[1], out x)) { NetworkManager.WriteError("Error parsing window X position value in configuration file"); return; }
+ if (!int.TryParse(parts[2], out y)) { NetworkManager.WriteError("Error parsing window Y position value in configuration file"); return; }
+ Program.MainForm.SetDesktopLocation(x, y);
+ }
+
+ if (parts[0] == "win_size")
+ {
+ if (parts.Length < 3) { NetworkManager.WriteError("Error parsing window size property in configuration file"); return; }
+ int x = 0, y = 0;
+ if (!int.TryParse(parts[1], out x)) { NetworkManager.WriteError("Error parsing window width value in configuration file"); return; }
+ if (!int.TryParse(parts[2], out y)) { NetworkManager.WriteError("Error parsing window height value in configuration file"); return; }
+ Program.MainForm.Size = new Size(x, y);
+ }
+ }
+
+ NetworkManager.WriteInfo("Loaded configuration file");
+ }
+ }
+}
diff --git a/Aura Debugger/Aura Debugger/Cosmos.ico b/Aura Debugger/Aura Debugger/Cosmos.ico
new file mode 100644
index 0000000..fcdc401
Binary files /dev/null and b/Aura Debugger/Aura Debugger/Cosmos.ico differ
diff --git a/Aura Debugger/Aura Debugger/Form1.Designer.cs b/Aura Debugger/Aura Debugger/Form1.Designer.cs
index ccbff9d..090f67d 100644
--- a/Aura Debugger/Aura Debugger/Form1.Designer.cs
+++ b/Aura Debugger/Aura Debugger/Form1.Designer.cs
@@ -28,146 +28,251 @@ protected override void Dispose(bool disposing)
///
private void InitializeComponent()
{
- this.textBox1 = new System.Windows.Forms.TextBox();
- this.label1 = new System.Windows.Forms.Label();
- this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
- this.checkBox1 = new System.Windows.Forms.CheckBox();
- this.button1 = new System.Windows.Forms.Button();
- this.button2 = new System.Windows.Forms.Button();
- this.label2 = new System.Windows.Forms.Label();
- this.button3 = new System.Windows.Forms.Button();
- this.textBox2 = new System.Windows.Forms.TextBox();
- this.button4 = new System.Windows.Forms.Button();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
+ this.LabelStatus = new System.Windows.Forms.Label();
+ this.WorkerWait = new System.ComponentModel.BackgroundWorker();
+ this.ChkAutoScroll = new System.Windows.Forms.CheckBox();
+ this.BtnClear = new System.Windows.Forms.Button();
+ this.BtnCopy = new System.Windows.Forms.Button();
+ this.LabelReceived = new System.Windows.Forms.Label();
+ this.BtnConnect = new System.Windows.Forms.Button();
+ this.TxtIP = new System.Windows.Forms.TextBox();
+ this.BtnWait = new System.Windows.Forms.Button();
this.label3 = new System.Windows.Forms.Label();
- this.backgroundWorker2 = new System.ComponentModel.BackgroundWorker();
+ this.WorkerConnect = new System.ComponentModel.BackgroundWorker();
+ this.LabelIP = new System.Windows.Forms.Label();
+ this.ChkWordWrap = new System.Windows.Forms.CheckBox();
+ this.TxtOutput = new System.Windows.Forms.RichTextBox();
+ this.BtnSave = new System.Windows.Forms.Button();
this.SuspendLayout();
//
- // textBox1
- //
- this.textBox1.Location = new System.Drawing.Point(13, 42);
- this.textBox1.Multiline = true;
- this.textBox1.Name = "textBox1";
- this.textBox1.ReadOnly = true;
- this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
- this.textBox1.Size = new System.Drawing.Size(701, 453);
- this.textBox1.TabIndex = 0;
- this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged);
- //
- // label1
- //
- this.label1.AutoSize = true;
- this.label1.Location = new System.Drawing.Point(10, 506);
- this.label1.Name = "label1";
- this.label1.Size = new System.Drawing.Size(160, 13);
- this.label1.TabIndex = 1;
- this.label1.Text = "Waiting at XXX.XXX.X.XX, 4224";
- this.label1.Visible = false;
- //
- // backgroundWorker1
- //
- this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);
- //
- // checkBox1
- //
- this.checkBox1.AutoSize = true;
- this.checkBox1.Location = new System.Drawing.Point(642, 505);
- this.checkBox1.Name = "checkBox1";
- this.checkBox1.Size = new System.Drawing.Size(72, 17);
- this.checkBox1.TabIndex = 2;
- this.checkBox1.Text = "Autoscroll";
- this.checkBox1.UseVisualStyleBackColor = true;
- this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
- //
- // button1
- //
- this.button1.Location = new System.Drawing.Point(13, 13);
- this.button1.Name = "button1";
- this.button1.Size = new System.Drawing.Size(75, 23);
- this.button1.TabIndex = 3;
- this.button1.Text = "Clear";
- this.button1.UseVisualStyleBackColor = true;
- this.button1.Click += new System.EventHandler(this.button1_Click);
- //
- // button2
- //
- this.button2.Location = new System.Drawing.Point(94, 13);
- this.button2.Name = "button2";
- this.button2.Size = new System.Drawing.Size(75, 23);
- this.button2.TabIndex = 4;
- this.button2.Text = "Copy";
- this.button2.UseVisualStyleBackColor = true;
- this.button2.Click += new System.EventHandler(this.button2_Click);
- //
- // label2
- //
- this.label2.AutoSize = true;
- this.label2.Location = new System.Drawing.Point(175, 18);
- this.label2.Name = "label2";
- this.label2.Size = new System.Drawing.Size(87, 13);
- this.label2.TabIndex = 5;
- this.label2.Text = "Received logs: 0";
- //
- // button3
- //
- this.button3.Location = new System.Drawing.Point(508, 13);
- this.button3.Name = "button3";
- this.button3.Size = new System.Drawing.Size(59, 23);
- this.button3.TabIndex = 6;
- this.button3.Text = "Connect";
- this.button3.UseVisualStyleBackColor = true;
- this.button3.Click += new System.EventHandler(this.button3_Click);
- //
- // textBox2
- //
- this.textBox2.Location = new System.Drawing.Point(353, 15);
- this.textBox2.Name = "textBox2";
- this.textBox2.Size = new System.Drawing.Size(149, 20);
- this.textBox2.TabIndex = 7;
- //
- // button4
- //
- this.button4.Location = new System.Drawing.Point(593, 13);
- this.button4.Name = "button4";
- this.button4.Size = new System.Drawing.Size(121, 23);
- this.button4.TabIndex = 8;
- this.button4.Text = "Wait for connection";
- this.button4.UseVisualStyleBackColor = true;
- this.button4.Click += new System.EventHandler(this.button4_Click);
+ // LabelStatus
+ //
+ this.LabelStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.LabelStatus.AutoSize = true;
+ this.LabelStatus.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.LabelStatus.ForeColor = System.Drawing.Color.White;
+ this.LabelStatus.Location = new System.Drawing.Point(12, 522);
+ this.LabelStatus.Name = "LabelStatus";
+ this.LabelStatus.Size = new System.Drawing.Size(38, 13);
+ this.LabelStatus.TabIndex = 1;
+ this.LabelStatus.Text = "Ready";
+ this.LabelStatus.Visible = true;
+ //
+ // WorkerWait
+ //
+ this.WorkerWait.DoWork += new System.ComponentModel.DoWorkEventHandler(this.WorkerWait_DoWork);
+ //
+ // ChkAutoScroll
+ //
+ this.ChkAutoScroll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.ChkAutoScroll.AutoSize = true;
+ this.ChkAutoScroll.Checked = true;
+ this.ChkAutoScroll.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.ChkAutoScroll.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.ChkAutoScroll.ForeColor = System.Drawing.Color.White;
+ this.ChkAutoScroll.Location = new System.Drawing.Point(687, 521);
+ this.ChkAutoScroll.Name = "ChkAutoScroll";
+ this.ChkAutoScroll.Size = new System.Drawing.Size(73, 17);
+ this.ChkAutoScroll.TabIndex = 2;
+ this.ChkAutoScroll.Text = "Autoscroll";
+ this.ChkAutoScroll.UseVisualStyleBackColor = true;
+ this.ChkAutoScroll.CheckedChanged += new System.EventHandler(this.ChkAutoScroll_CheckedChanged);
+ //
+ // BtnClear
+ //
+ this.BtnClear.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(36)))), ((int)(((byte)(36)))), ((int)(((byte)(36)))));
+ this.BtnClear.FlatAppearance.BorderColor = System.Drawing.Color.Gray;
+ this.BtnClear.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(80)))), ((int)(((byte)(233)))));
+ this.BtnClear.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(255)))));
+ this.BtnClear.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.BtnClear.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.BtnClear.ForeColor = System.Drawing.Color.White;
+ this.BtnClear.Location = new System.Drawing.Point(12, 14);
+ this.BtnClear.Name = "BtnClear";
+ this.BtnClear.Size = new System.Drawing.Size(75, 23);
+ this.BtnClear.TabIndex = 3;
+ this.BtnClear.Text = "Clear";
+ this.BtnClear.UseVisualStyleBackColor = false;
+ this.BtnClear.Click += new System.EventHandler(this.BtnClear_Click);
+ //
+ // BtnCopy
+ //
+ this.BtnCopy.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(36)))), ((int)(((byte)(36)))), ((int)(((byte)(36)))));
+ this.BtnCopy.FlatAppearance.BorderColor = System.Drawing.Color.Gray;
+ this.BtnCopy.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(80)))), ((int)(((byte)(233)))));
+ this.BtnCopy.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(255)))));
+ this.BtnCopy.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.BtnCopy.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.BtnCopy.ForeColor = System.Drawing.Color.White;
+ this.BtnCopy.Location = new System.Drawing.Point(93, 14);
+ this.BtnCopy.Name = "BtnCopy";
+ this.BtnCopy.Size = new System.Drawing.Size(75, 23);
+ this.BtnCopy.TabIndex = 4;
+ this.BtnCopy.Text = "Copy";
+ this.BtnCopy.UseVisualStyleBackColor = false;
+ this.BtnCopy.Click += new System.EventHandler(this.BtnCopy_Click);
+ //
+ // LabelReceived
+ //
+ this.LabelReceived.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
+ this.LabelReceived.AutoSize = true;
+ this.LabelReceived.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.LabelReceived.ForeColor = System.Drawing.Color.White;
+ this.LabelReceived.Location = new System.Drawing.Point(343, 522);
+ this.LabelReceived.Name = "LabelReceived";
+ this.LabelReceived.Size = new System.Drawing.Size(86, 13);
+ this.LabelReceived.TabIndex = 5;
+ this.LabelReceived.Text = "Received logs: 0";
+ //
+ // BtnConnect
+ //
+ this.BtnConnect.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.BtnConnect.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(36)))), ((int)(((byte)(36)))), ((int)(((byte)(36)))));
+ this.BtnConnect.FlatAppearance.BorderColor = System.Drawing.Color.Gray;
+ this.BtnConnect.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(80)))), ((int)(((byte)(233)))));
+ this.BtnConnect.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(255)))));
+ this.BtnConnect.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.BtnConnect.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.BtnConnect.ForeColor = System.Drawing.Color.Lime;
+ this.BtnConnect.Location = new System.Drawing.Point(542, 14);
+ this.BtnConnect.Name = "BtnConnect";
+ this.BtnConnect.Size = new System.Drawing.Size(78, 23);
+ this.BtnConnect.TabIndex = 6;
+ this.BtnConnect.Text = "Connect";
+ this.BtnConnect.UseVisualStyleBackColor = false;
+ this.BtnConnect.Click += new System.EventHandler(this.BtnConnect_Click);
+ //
+ // TxtIP
+ //
+ this.TxtIP.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.TxtIP.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(36)))), ((int)(((byte)(36)))), ((int)(((byte)(36)))));
+ this.TxtIP.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.TxtIP.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.TxtIP.ForeColor = System.Drawing.Color.White;
+ this.TxtIP.Location = new System.Drawing.Point(353, 14);
+ this.TxtIP.Name = "TxtIP";
+ this.TxtIP.Size = new System.Drawing.Size(183, 23);
+ this.TxtIP.TabIndex = 7;
+ //
+ // BtnWait
+ //
+ this.BtnWait.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.BtnWait.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(36)))), ((int)(((byte)(36)))), ((int)(((byte)(36)))));
+ this.BtnWait.FlatAppearance.BorderColor = System.Drawing.Color.Gray;
+ this.BtnWait.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(80)))), ((int)(((byte)(233)))));
+ this.BtnWait.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(255)))));
+ this.BtnWait.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.BtnWait.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.BtnWait.ForeColor = System.Drawing.Color.White;
+ this.BtnWait.Location = new System.Drawing.Point(643, 14);
+ this.BtnWait.Name = "BtnWait";
+ this.BtnWait.Size = new System.Drawing.Size(117, 23);
+ this.BtnWait.TabIndex = 8;
+ this.BtnWait.Text = "Wait for connection";
+ this.BtnWait.UseVisualStyleBackColor = false;
+ this.BtnWait.Click += new System.EventHandler(this.BtnWait_Click);
//
// label3
//
+ this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.label3.AutoSize = true;
- this.label3.Location = new System.Drawing.Point(573, 17);
+ this.label3.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label3.ForeColor = System.Drawing.Color.White;
+ this.label3.Location = new System.Drawing.Point(624, 19);
this.label3.Name = "label3";
- this.label3.Size = new System.Drawing.Size(16, 13);
+ this.label3.Size = new System.Drawing.Size(17, 13);
this.label3.TabIndex = 9;
this.label3.Text = "or";
//
- // backgroundWorker2
+ // WorkerConnect
+ //
+ this.WorkerConnect.DoWork += new System.ComponentModel.DoWorkEventHandler(this.WorkerConnect_DoWork);
+ //
+ // LabelIP
+ //
+ this.LabelIP.AutoSize = true;
+ this.LabelIP.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.LabelIP.ForeColor = System.Drawing.Color.White;
+ this.LabelIP.Location = new System.Drawing.Point(302, 19);
+ this.LabelIP.Name = "LabelIP";
+ this.LabelIP.Size = new System.Drawing.Size(45, 13);
+ this.LabelIP.TabIndex = 10;
+ this.LabelIP.Text = "IP/Port:";
//
- this.backgroundWorker2.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker2_DoWork);
+ // ChkWordWrap
+ //
+ this.ChkWordWrap.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.ChkWordWrap.AutoSize = true;
+ this.ChkWordWrap.Checked = true;
+ this.ChkWordWrap.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.ChkWordWrap.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.ChkWordWrap.ForeColor = System.Drawing.Color.White;
+ this.ChkWordWrap.Location = new System.Drawing.Point(593, 521);
+ this.ChkWordWrap.Name = "ChkWordWrap";
+ this.ChkWordWrap.Size = new System.Drawing.Size(81, 17);
+ this.ChkWordWrap.TabIndex = 11;
+ this.ChkWordWrap.Text = "Word Wrap";
+ this.ChkWordWrap.UseVisualStyleBackColor = true;
+ this.ChkWordWrap.CheckedChanged += new System.EventHandler(this.ChkWordWrap_CheckedChanged);
+ //
+ // TxtOutput
+ //
+ this.TxtOutput.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.TxtOutput.BackColor = System.Drawing.Color.Black;
+ this.TxtOutput.BorderStyle = System.Windows.Forms.BorderStyle.None;
+ this.TxtOutput.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.TxtOutput.ForeColor = System.Drawing.Color.White;
+ this.TxtOutput.Location = new System.Drawing.Point(12, 50);
+ this.TxtOutput.Name = "TxtOutput";
+ this.TxtOutput.Size = new System.Drawing.Size(748, 465);
+ this.TxtOutput.TabIndex = 12;
+ this.TxtOutput.Text = "";
+ this.TxtOutput.TextChanged += new System.EventHandler(this.TxtOutput_TextChanged);
+ //
+ // BtnSave
+ //
+ this.BtnSave.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(36)))), ((int)(((byte)(36)))), ((int)(((byte)(36)))));
+ this.BtnSave.FlatAppearance.BorderColor = System.Drawing.Color.Gray;
+ this.BtnSave.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(80)))), ((int)(((byte)(233)))));
+ this.BtnSave.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(255)))));
+ this.BtnSave.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.BtnSave.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.BtnSave.ForeColor = System.Drawing.Color.White;
+ this.BtnSave.Location = new System.Drawing.Point(174, 14);
+ this.BtnSave.Name = "BtnSave";
+ this.BtnSave.Size = new System.Drawing.Size(75, 23);
+ this.BtnSave.TabIndex = 13;
+ this.BtnSave.Text = "Save...";
+ this.BtnSave.UseVisualStyleBackColor = false;
+ this.BtnSave.Click += new System.EventHandler(this.BtnSave_Click);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.BackColor = System.Drawing.Color.White;
- this.ClientSize = new System.Drawing.Size(726, 530);
+ this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18)))));
+ this.ClientSize = new System.Drawing.Size(772, 545);
+ this.Controls.Add(this.BtnSave);
+ this.Controls.Add(this.TxtOutput);
+ this.Controls.Add(this.ChkWordWrap);
+ this.Controls.Add(this.LabelIP);
this.Controls.Add(this.label3);
- this.Controls.Add(this.button4);
- this.Controls.Add(this.textBox2);
- this.Controls.Add(this.button3);
- this.Controls.Add(this.label2);
- this.Controls.Add(this.button2);
- this.Controls.Add(this.button1);
- this.Controls.Add(this.checkBox1);
- this.Controls.Add(this.label1);
- this.Controls.Add(this.textBox1);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
- this.MaximizeBox = false;
+ this.Controls.Add(this.BtnWait);
+ this.Controls.Add(this.TxtIP);
+ this.Controls.Add(this.BtnConnect);
+ this.Controls.Add(this.LabelReceived);
+ this.Controls.Add(this.BtnCopy);
+ this.Controls.Add(this.BtnClear);
+ this.Controls.Add(this.ChkAutoScroll);
+ this.Controls.Add(this.LabelStatus);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "Form1";
- this.ShowIcon = false;
- this.Text = "Aura Debugger v0.2";
+ this.Text = "Cosmos Network Debugger";
+ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);
this.PerformLayout();
@@ -175,19 +280,21 @@ private void InitializeComponent()
}
#endregion
-
- private System.Windows.Forms.TextBox textBox1;
- private System.Windows.Forms.Label label1;
- private System.ComponentModel.BackgroundWorker backgroundWorker1;
- private System.Windows.Forms.CheckBox checkBox1;
- private System.Windows.Forms.Button button1;
- private System.Windows.Forms.Button button2;
- private System.Windows.Forms.Label label2;
- private System.Windows.Forms.Button button3;
- private System.Windows.Forms.TextBox textBox2;
- private System.Windows.Forms.Button button4;
+ private System.Windows.Forms.Label LabelStatus;
+ private System.ComponentModel.BackgroundWorker WorkerWait;
+ private System.Windows.Forms.CheckBox ChkAutoScroll;
+ private System.Windows.Forms.Button BtnClear;
+ private System.Windows.Forms.Button BtnCopy;
+ private System.Windows.Forms.Label LabelReceived;
+ private System.Windows.Forms.Button BtnConnect;
+ private System.Windows.Forms.TextBox TxtIP;
+ private System.Windows.Forms.Button BtnWait;
private System.Windows.Forms.Label label3;
- private System.ComponentModel.BackgroundWorker backgroundWorker2;
+ private System.ComponentModel.BackgroundWorker WorkerConnect;
+ private System.Windows.Forms.Label LabelIP;
+ private System.Windows.Forms.CheckBox ChkWordWrap;
+ private System.Windows.Forms.RichTextBox TxtOutput;
+ private System.Windows.Forms.Button BtnSave;
}
}
diff --git a/Aura Debugger/Aura Debugger/Form1.cs b/Aura Debugger/Aura Debugger/Form1.cs
index 4782af0..24aeae3 100644
--- a/Aura Debugger/Aura Debugger/Form1.cs
+++ b/Aura Debugger/Aura Debugger/Form1.cs
@@ -6,16 +6,20 @@
*/
using System;
+using System.IO;
using System.ComponentModel;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
+using System.Drawing;
namespace Aura_Debugger
{
public partial class Form1 : Form
{
+ private bool autoscroll = true;
+
public Form1()
{
InitializeComponent();
@@ -23,202 +27,218 @@ public Form1()
private void Form1_Load(object sender, EventArgs e)
{
- button1.Enabled = false;
- button2.Enabled = false;
- label1.Visible = false;
+ ResetState();
+ ConfigManager.LoadConfig();
}
- int packetnumber = 0;
- int port = 4224;
+ // wait for connection
+ private void WorkerWait_DoWork(object sen, DoWorkEventArgs e)
+ {
+ NetworkManager.WaitForConnection();
+ }
- private void backgroundWorker1_DoWork(object sen, DoWorkEventArgs e)
+ // connect
+ private void WorkerConnect_DoWork(object sender, DoWorkEventArgs e)
{
- TcpListener server = null;
+ NetworkManager.Connect(TxtIP.Text);
+ }
- try
+ public void ResetState()
+ {
+ Invoke((MethodInvoker)(() =>
{
- server = new TcpListener(IPAddress.Any, port);
-
- server.Start();
-
- Byte[] bytes = new Byte[256];
-
- while (true)
+ if (TxtOutput.Text.Length == 0)
{
- WriteTextBox("Waiting for a connection...");
-
- TcpClient client = server.AcceptTcpClient();
- WriteTextBox("Connected!");
-
- DebuggerConnected();
-
- NetworkStream stream = client.GetStream();
+ BtnClear.Enabled = false;
+ BtnCopy.Enabled = false;
+ }
+ TxtIP.Enabled = true;
+ BtnWait.Enabled = true;
+ BtnConnect.Enabled = true;
- int i;
+ BtnConnect.Text = "Connect";
+ BtnConnect.ForeColor = Color.LawnGreen;
- while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
- {
- packetnumber++;
- WriteTextBox(Encoding.ASCII.GetString(bytes, 0, i));
- }
+ LabelStatus.Text = "Ready to connect";
+ }));
+ }
- client.Close();
- WriteTextBox("Connection closed!");
- }
- }
- catch (SocketException ee)
- {
- WriteTextBox("Socket Exception: " + ee);
- }
- finally
+ public void ConnectingState()
+ {
+ Invoke((MethodInvoker)(() =>
{
- server.Stop();
- WriteTextBox("Connection closed!");
- }
+ BtnConnect.Text = "Disconnect";
+ BtnConnect.ForeColor = Color.Tomato;
+ BtnWait.Enabled = false;
+ LabelStatus.Text = "Attempting connection to: " + NetworkManager.IP + ":" + NetworkManager.Port.ToString();
+ }));
}
- private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
+ public void ConnectedState()
{
- try
+ Invoke((MethodInvoker)(() =>
{
- string[] splitted = textBox2.Text.Split(':');
- string ip = splitted[0];
- string port = splitted[1];
-
- Byte[] bytes = new Byte[256];
-
- while (true)
- {
- WriteTextBox("Waiting to connect...");
+ BtnClear.Enabled = true;
+ BtnCopy.Enabled = true;
+ TxtIP.Enabled = false;
+ BtnWait.Enabled = false;
+ BtnConnect.Enabled = true;
+ BtnWait.Enabled = false;
- TcpClient client = new TcpClient();
+ BtnConnect.Text = "Disconnect";
+ BtnConnect.ForeColor = Color.Tomato;
- client.Connect(ip, int.Parse(port));
-
- //label1.Text = "Connected to " + ip + ", " + port;
- //label1.Visible = true;
+ LabelStatus.Text = "Connected to: " + NetworkManager.IP + ":" + NetworkManager.Port.ToString();
+ }));
+ }
- WriteTextBox("Connected!");
+ public void WaitState()
+ {
+ ConnectedState();
+ Invoke((MethodInvoker)(() =>
+ {
+ LabelStatus.Text = "Waiting for: " + NetworkManager.IP + ":" + NetworkManager.Port.ToString();
+ }));
+ }
- NetworkStream stream = client.GetStream();
+ public void WriteTextBox(string message)
+ {
+ WriteTextBox(message, Color.White);
+ }
- int i;
+ public void WriteTextBox(string message, Color color)
+ {
+ Invoke((MethodInvoker)(() =>
+ {
+ TxtOutput.SelectionStart = TxtOutput.TextLength;
+ TxtOutput.SelectionLength = 0;
- while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
- {
- packetnumber++;
- WriteTextBox(Encoding.ASCII.GetString(bytes, 0, i));
- }
+ TxtOutput.SelectionColor = color;
+ TxtOutput.AppendText(message);
+ TxtOutput.SelectionColor = TxtOutput.ForeColor;
+ }));
+ }
- client.Close();
- WriteTextBox("Connection closed!");
- }
- }
- catch (SocketException ee)
- {
- WriteTextBox("Socket Exception: " + ee);
- }
- finally
+ public void ClearLog()
+ {
+ Invoke((MethodInvoker)(() =>
{
- WriteTextBox("Connection closed!");
- }
+ NetworkManager.PacketNumber = 0;
+ TxtOutput.Clear();
+ LabelReceived.Text = "Received Logs: 0";
+ }));
+ }
+
+ public bool GetWordWrap()
+ {
+ return TxtOutput.WordWrap;
}
- void DebuggerConnected()
+ public bool GetAutoScroll()
+ {
+ return autoscroll;
+ }
+
+ public void SetWordWrap(bool wrap)
{
Invoke((MethodInvoker)(() =>
{
- button1.Enabled = true;
- button2.Enabled = true;
+ if (wrap)
+ {
+ TxtOutput.WordWrap = true;
+ TxtOutput.ScrollBars = RichTextBoxScrollBars.ForcedVertical;
+ ChkWordWrap.Checked = true;
+ }
+ else
+ {
+ TxtOutput.WordWrap = false;
+ TxtOutput.ScrollBars = RichTextBoxScrollBars.ForcedBoth;
+ ChkWordWrap.Checked = false;
+ }
}));
}
- void WriteTextBox(String message)
+ public void SetAutoScroll(bool autoscrl)
{
Invoke((MethodInvoker)(() =>
{
- textBox1.Text += (@message + Environment.NewLine);
- label2.Text = "Received logs: " + packetnumber.ToString();
+ autoscroll = autoscrl;
+ ChkAutoScroll.Checked = autoscroll;
}));
}
- private void textBox1_TextChanged(object sender, EventArgs e)
+ private void TxtOutput_TextChanged(object sender, EventArgs e)
{
if (autoscroll)
{
- textBox1.SelectionStart = textBox1.Text.Length;
- textBox1.ScrollToCaret();
- }
- else
- {
- //Find a way to not move the bar at the top and block it
+ TxtOutput.SelectionStart = TxtOutput.Text.Length;
+ TxtOutput.ScrollToCaret();
}
}
- bool autoscroll = false;
-
- private void checkBox1_CheckedChanged(object sender, EventArgs e)
+ private void ChkAutoScroll_CheckedChanged(object sender, EventArgs e)
{
- if (!checkBox1.Checked)
- {
- autoscroll = false;
- }
- else
- {
- autoscroll = true;
- }
-
+ SetAutoScroll(ChkAutoScroll.Checked);
}
- private void button1_Click(object sender, EventArgs e)
+ private void BtnClear_Click(object sender, EventArgs e)
{
- textBox1.Text = "";
- packetnumber = 0;
- label2.Text = "Received logs: 0";
+ ClearLog();
}
- private void button2_Click(object sender, EventArgs e)
+ private void BtnCopy_Click(object sender, EventArgs e)
{
- Clipboard.SetText(textBox1.Text);
+ Clipboard.SetText(TxtOutput.Text);
}
- private void button4_Click(object sender, EventArgs e)
+ private void BtnWait_Click(object sender, EventArgs e)
{
- button4.Visible = false;
- button3.Visible = false;
- label3.Visible = false;
- textBox2.Visible = false;
-
- string IP = "XX.XX.XX.XX";
-
+ string IP = string.Empty;
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0))
{
- socket.Connect("8.8.8.8", 65530);
+ NetworkManager.IP = "8.8.8.8";
+ NetworkManager.Port = 65530;
+ socket.Connect(NetworkManager.IP, NetworkManager.Port);
var endPoint = socket.LocalEndPoint as IPEndPoint;
IP = endPoint.Address.ToString();
}
- label1.Text = "Waiting at " + IP + ", " + port;
- label1.Visible = true;
-
- backgroundWorker1.RunWorkerAsync();
+ WorkerWait.RunWorkerAsync();
}
- private void button3_Click(object sender, EventArgs e)
+ private void BtnConnect_Click(object sender, EventArgs e)
{
- if (textBox2.Text == "")
+ if (NetworkManager.Waiting || NetworkManager.Connected)
{
- MessageBox.Show("Please specify an IP Address and Port.");
+ if (NetworkManager.Client != null) { NetworkManager.Client.Close(); }
+ if (NetworkManager.Listener != null) { NetworkManager.Listener.Stop(); }
+ ResetState();
+ return;
}
- else
- {
- button4.Visible = false;
- button3.Visible = false;
- label3.Visible = false;
- textBox2.Visible = false;
- backgroundWorker2.RunWorkerAsync();
- }
+ if (TxtIP.Text.Length == 0) { MessageBox.Show("Please specify an IP address and port"); }
+ else { WorkerConnect.RunWorkerAsync(); }
+ }
+
+ private void ChkWordWrap_CheckedChanged(object sender, EventArgs e)
+ {
+ SetWordWrap(ChkWordWrap.Checked);
+ }
+
+ private void Form1_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ ConfigManager.SaveConfig();
+ }
+
+ private void BtnSave_Click(object sender, EventArgs e)
+ {
+ SaveFileDialog diag = new SaveFileDialog();
+ diag.Filter = "Text Files (.txt)|*.txt|All Files|*.*";
+
+ if (diag.ShowDialog() == DialogResult.OK)
+ {
+ File.WriteAllLines(diag.FileName, TxtOutput.Lines);
+ }
}
}
}
diff --git a/Aura Debugger/Aura Debugger/Form1.resx b/Aura Debugger/Aura Debugger/Form1.resx
index 10e3d35..73016f4 100644
--- a/Aura Debugger/Aura Debugger/Form1.resx
+++ b/Aura Debugger/Aura Debugger/Form1.resx
@@ -117,10 +117,439 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
+
17, 17
-
- 181, 17
+
+ 124, 19
+
+ 53
+
+
+
+
+ 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
+ /wC0s7Fm3tvY/2tpZv9sa2j/Z2Zj/97b2P+LiYT/WldS/1RSTf9QTkr/TUtH/0tJRf+wrav/nJmTnP7+
+ /gH///8A1NTTLt3b1/+bmpf/cnBt/3Jwbf+Ih4T/1NLO/29taf9pZ2L/YV9a/1tZVP9XVVH/mZeU/6qm
+ ntz5+fkG////APLy8g3BvbjxtLKv/3V0cP91dHD/dHJv/8TBvv/U0c7/iIeC/21rZ/+QjYn/iYeE/9LQ
+ zP+gnZii/f39Av///wD///8A3t7eItLQyvO1s7D/eHZz/3p4df96eHX/enh1/3FubP9xcGz/eXdy/6Oi
+ nv+3tbLM/Pz8A////wD///8A////AP7+/gGrqqel7Orn/5mXlP99e3f/fXt3/317d/99e3f/fXt3/317
+ d/+RkIz/ycbB6PT09Av///8A////AP///wD///8A/v7+AcDAv0bQzcnt8O7q/8vKxv95eHX/b25r/25t
+ av+Tko7/6ujl/9LPyvHv7+8Q////AP///wD///8A////AP///wD+/v4BwcC/SbWxqtro5uL+8e/r//Lw
+ 7P/y8Oz/7+3p/+Ti3v2opaKQ/v7+Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAAAACAEAAAAAAAAAAA
+ AAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD8/PwD7+/vELi3s1eQjIaUgn11s4B7c8KBe3O+g311r5eTjom9vLlQ6+rqFf39/QL///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD6+voF6enpFs3NzDSdmpV7f3lxwYuGf+iempP0qKWg+qWinPiZlY/yh4J64n14b72fnZl20tLSLerq
+ 6hX7+/sE////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP7+
+ /gHs7OwTp6Wha5GOh+S2tLH/vbu4/8G+u//Bvrv/wb67/8G+u//Bvrv/wb67/8G+u//Bvrv/wb67/8C9
+ uv++u7j/tbOw/4eCetvU09Mu/v7+Af///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD+/v4B7+/vEJqYlH+wran/vbu4/8K/vP/Cv7z/wr+8/8K/vP/Cv7z/wr+8/8K/vP/Cv7z/wr+8/8K/
+ vP/Cv7z/wr+8/8K/vP/Bvrv/ure0/5yZl4n7+/sE////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A+vr6Ba+urFurqab8wL67/8PBvv/Dwb7/tbOw/0ZFRP8jIiD/JCMh/yQjIf8kIyH/JCMh/yQj
+ If8kIyH/JCMh/yQjIf8jIiH/PTw6/7WzsP/Dwb7/lZKL1Ovr6xT///8A////AP///wD///8A////AP//
+ /wD///8A////AP39/QLg4OAflZCK0cK/vP/Fwr//xcK//4eFg/8jIiD/JSQi/yUkIv8lJCL/JSQi/yUk
+ Iv8lJCL/JSQi/yUkIv8lJCL/JSQi/yUkIv8lJCL/paOg/8XCv/+WkY3R7OzsE////wD///8A////AP//
+ /wD///8A////AP///wD///8Azc3MNamlofnFwr//x8TB/5GPjP8mJST/JyYl/ycmJf8nJiX/JyYl/ycm
+ Jf8nJiX/JyYl/ycmJf8nJiX/JyYl/ycmJf8nJiX/JyYl/yYlJP/HxMH/xsPA/5yal6b5+fkG////AP//
+ /wD///8A////AP///wD///8A////APn5+QabmpeIwb+7/8jGwv/IxsL/PDs5/ykoJv8pKCb/KSgm/yko
+ Jv8pKCb/KSgm/ykoJv8pKCb/KSgm/ykoJv8pKCb/KSgm/ykoJv8pKCb/MC8u/8jGwv/GxMD/m5qXj/7+
+ /gH///8A////AP///wD///8A////AP///wD7+/sEvLu6S7i1sPvKyMT/srCt/yopJ/8sKyn/LCsp/ywr
+ Kf8sKyn/LCsp/ywrKf8sKyn/KCcl/01MSv+Afnv/kpCN/4mIhf9mZWL/Ozo4/yopKP90cnD/ysjE/8C/
+ u/+opqRn////AP///wD///8A////AP///wD///8A////APPz8wyGgHisxcPA/8vJxv99e3j/Liwq/y4s
+ Kv8uLCr/Liwq/y4sKv8uLCr/Liwq/09OTP/Ewr//y8nG/8vJxv/Lycb/y8nG/8vJxv/Lycb/r62q/7Sy
+ sP/Lycb/vby5/7u7uUz///8A////AP///wD///8A////AP///wD///8AyMfGPb27uP/Ny8f/zszI/zAv
+ Lf8xMC3/MTAt/zEwLf8xMC3/MTAt/0RCQP/OzMj/NzY0/y8uLP9CQT//LSwr/zEwLf8xMC3/Ly4r/zIx
+ L/+rqaX/zszI/87MyP/Bv7r+sK6sW/7+/gH///8A////AP///wD///8A////AP///wCsqqhhxMO//8/N
+ yf+Zl5X/MzIv/zMyL/8zMi//MzIv/zMyL/8zMi//hoSB/z8+O/8zMi//MzIv/zMyL/8zMi//MzIv/zMy
+ L/8zMi//MzIv/zk4Nv/Ny8f/z83J/8zKxv+cmpep9PT0C////wD///8A////AP///wD///8A+/v7BJ6d
+ mpvQzsr/x8XB/zQzMf83NTP/NzUz/zc1M/83NTP/NzUz/01MS//S0Mz/MC8u/zc1M/83NTP/NzUz/zc1
+ M/83NTP/NzUz/zc1M/83NTP/NzUz/zc1M/+cm5f/0tDM/8G/u/y+vbtK/Pz8A////wD///8A////AP//
+ /wD19fUKoZ+atdPRzv+wrqz/MjEv/zk3NP85NzT/OTc0/zk3NP84NjP/paWi/9PRzv9FREL/OTc0/zk3
+ NP85NzT/OTc0/zk3NP85NzT/OTc0/zk3NP85NzT/OTc0/317ef/T0c7/zMrH/5iUj4j39/cI////AP//
+ /wD///8A////AOjo6Befm5PW1tTQ/5OSj/88Ozj/PDs4/zw7OP88Ozj/PDs4/zw7OP/W1ND/1tTQ/2Zk
+ Yv88Ozj/PDs4/zw7OP88Ozj/PDs4/zw7OP88Ozj/PDs4/zw7OP88Ozj/QD88/6yqpv/T0c3/mJSM5djY
+ 1yr///8A////AP///wD///8A5OTkG6OfmN7Y1dL/joyK/z49Ov8+PTr/Pj06/z49Ov8+PTr/RkRC/9jV
+ 0v/Y1dL/SEZE/z49Ov8+PTr/Pj06/z49Ov8+PTr/Pj06/z49Ov8+PTr/Pj06/z49Ov86OTf/hIKA/9bT
+ 0f+yraj2xMPCQv///wD///8A////AP///wDj4+McpaKb39rY1f+PjYv/Q0E9/0NBPf9DQT3/Q0E9/0NB
+ Pf9RUE3/2tjV/9rY1f9FREL/TUpG/0xKRv9LSUX/S0lE/0lHQv9IRkL/R0RA/0ZEQP9FQz7/REI+/z48
+ OP9sa2j/2dfU/8fFwf25uLZQ////AP///wD///8A////AOfn5xijn5jZ3NrW/5WTkP9FQz//RUM//0pI
+ RP9UUk3/Y2Ba/2VjX//c2tb/3NrW/1ZVVP9XVVD/VFJN/1FPSv9PTUj/TUtG/0xKRv9LSET/SkhD/0lH
+ Qv9IRkL/QT87/3l4dv/b2dX/vbq0+cHAvkf///8A////AP///wD///8A8vLyDaWhnb3f3Nn/t7Wz/2Zm
+ Yv9tbGn/bWxp/21saf9tbGn/ZGNf/9/c2f/f3Nn/sK6r/2FfWf9eXFf/W1hT/1hWUf9VU07/U1FN/1FP
+ Sv9QTkr/T0xI/05MR/9YVlP/0M3K/93a1/+WkIfg2trZJ////wD///8A////AP///wD4+PgHpKKep97c
+ 2P/Lycb/XFtZ/25tav9ubWr/bm1q/25tav9ramf/wL67/+De2v/g3tr/XFtW/2NiXf9fXlj/XFpW/1lX
+ U/9WVVH/VFNO/1NSTf9RUEv/UE9K/0pJRf+fnpv/3tzY/7Sxq/TGxcRA////AP///wD///8A////AP//
+ /wCmpaJt2tjU/+Ph3f+KiYf/cXBt/3Fwbf9xcG3/cXBt/3Fwbf9fXVv/4d/b/+Ph3f+opqP/cXBr/21q
+ ZP9oZWD/Y2Fc/2BdWP9dW1b/W1hT/1hWUf9XVFD/VFFN/0pIRv/j4d3/2dfT/6elom////8A////AP//
+ /wD///8A////AL28ukzV08//5OLe/9bU0P9ramf/c3Fu/3Nxbv9zcW7/c3Fu/3Nxbv+rqaf/5OLe/+Ti
+ 3v9qamj/c3Fs/29sZ/9pZ2L/ZWNe/2JfW/9fXVj/XFpV/1pYVP9TUE3/V1ZU/+Ti3v/X1tL/rKqnZP//
+ /wD///8A////AP///wD///8A7+/vEJGLgc3j4N3/5+Th/5mXk/92dXH/dnVx/3Z1cf92dXH/dnVx/3Fw
+ bP+ZmJb/5+Th/+fk4f/n5OH/uri1/3t5dv9raWf/i4mG/9rX1P/V09D/qail/9XT0P/n5OH/4+Dd/5mT
+ itrh4eAg////AP///wD///8A////AP///wD5+fkGpaOedN3b1//o5uL/rayp/3d1cv93dXL/d3Vy/3d1
+ cv93dXL/d3Vy/3VzcP+dnJn/6Obi/+jm4v/o5uL/6Obi/+jm4v/o5uL/6Obi/+Lg3P/g3tr/6Obi/+jm
+ 4v/X1dH+rKqmaff39wj///8A////AP///wD///8A////AP///wDy8vINp6Sgrebk4P/q6OT/ysnF/3Fv
+ bP96eHX/enh1/3p4df96eHX/enh1/3p4df96eHX/dnNx/2hmY/9iYF//ZGNh/3JwbP96eHX/eHRu/2Fg
+ Xv/q6OT/5+Xh/5yal475+fkG////AP///wD///8A////AP///wD///8A////AP39/QKvratf29nX/+ro
+ 5f/r6eb/kZCN/3t5df97eXX/e3l1/3t5df97eXX/e3l1/3t5df97eXX/e3l1/3t5df97eXX/e3l1/3t5
+ df97eXT/WlhS/+vp5v/p5+T/qKajpPj4+Af///8A////AP///wD///8A////AP///wD///8A////APr6
+ +gXCwb9Fx8S+9Ozq5//t6+j/3t3a/3BvbP99fHj/fXx4/318eP99fHj/fXx4/318eP99fHj/fXx4/318
+ eP99fHj/fXx4/318eP99fHj/vLu4/+3r6P+zrqbh4+PjHP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////APDw8A+in5mi5uPg/+7r6P/v7On/ysfE/2RiYP9+fXn/fn15/359ef9+fXn/fn15/359
+ ef9+fXn/fn15/359ef9+fXn/fn15/359ef+pp6T/7+zp/8nFv/TV1dQr////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////APj4+AfOzc00rqmi3uro5f/v7er/8O7r//Du6//c2tf/fn16/2Nj
+ YP9vbmr/fHp2/317eP95d3T/bWxp/2RjX/98e3r/2NbT//Du6//w7uv/ycXB89bW1in///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////APj4+Ae3trRTtrGq7ejm4v/w7ur/8e/r//Hv
+ 6//a2dX/mpmW/3Jxbv9kZGD/ZGNg/2VkYf92dXL/npyZ/9rZ1f/x7+v/8e/r/+/t6f+tqKDT6enpFv//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD4+PgH1dXULJiU
+ jJSyrqbo4uDc/+ro5P/w7ur/8vDs//Px7f/z8e3/8/Ht//Lw7P/w7ur/6ujk/+Lg3P+1sanqnZiRjOnp
+ 6Rb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD8/PwD7e3tEszMyzahnph/lo+GycG9tvPh3tv+6Obj/+nn5P/o5uP/39zZ/b66tPKVj4XKop6Yf8zL
+ yzfu7u4R/f39Av///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA
+ AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A/v7+Afr6+gXv7+8QysnHP6iloW+QjIaUhH92rIF7
+ c7uAe3PCgHtzwoF7c7uDfXWvjomCmaGemXm9vLlQ4ODfIvb29gn9/f0C////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A/v7+Afb29gnp6ekW2traJcHAv0SdmpV7gHtzr395
+ cdSLhn/omZSO8qKhmveopaD6qKWg+aKhmveZlY/yjoqD6oF9c9p9eG+9j4uGkrGwrVvS0tIt4+PjHPHx
+ 8Q77+/sE////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP39/QLy8vIN3t7eIbOysFiFgXmmh4J63aCd
+ l/eysKz/trSx/7m3s/+8urb/vry4/769uf++vbn/vr25/769uf++vLj/vLq2/7q4tP+4trL/tLKu/6yp
+ pf2RjYXsf3txx5uYk3/Y2Ngn8/PzDP7+/gH///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD+/v4B9/f3CODg4B+npaFrgnxzzaim
+ ovy2tLH/vLm2/7+9uv/Bvrv/wb67/8G+u//Bvrv/wb67/8G+u//Bvrv/wb67/8G+u//Bvrv/wb67/8G+
+ u//Bvrv/wb67/8C9uv++u7j/ube0/7KvrP+Hgnrburm3T/Ly8g3+/v4B////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////APz8/APv7+8QxMPCQIF7
+ cr6wran/u7i1/8C+u//Cv7z/wr+8/8K/vP/Cv7z/wr+8/8K/vP/Cv7z/wr+8/8K/vP/Cv7z/wr+8/8K/
+ vP/Cv7z/wr+8/8K/vP/Cv7z/wr+8/8K/vP/Cv7z/wr+8/8C+u/+6t7T/jIaA49LR0TD7+/sE////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A+/v7BOXl
+ 5RqkoZ5wko6G6rm2s//Bvrv/w8C9/8PAvf/DwL3/w8C9/8PAvf+tq6j/enl2/1JQT/85Nzb/Li0s/ygn
+ Jv8nJiX/JyYl/ygnJv8tLCv/NzY0/0pJR/9raWf/l5WS/8G+u//DwL3/w8C9/8PAvf/Cv7z/s7Ct/6Gf
+ m3Xy8vIN////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD6+voF39/fII2Kg5erqab8vry5/8LAvf/Dwb7/w8G+/8PBvv+1s7D/YWBe/ywrKv8jIiD/JCMh/yQj
+ If8kIyH/JCMh/yQjIf8kIyH/JCMh/yQjIf8kIyH/JCMh/yQjIf8kIyH/JCMh/yMiIf89PDr/qKaj/8PB
+ vv/Dwb7/uLa0/4WBd6rr6+sU////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////APv7+wTg4OAfiIJ7pLWyr//Cv7z/xcK//8XCv//Fwr//vru4/1BPTv8jIiD/JSQi/yUk
+ Iv8lJCL/JSQi/yUkIv8lJCL/JSQi/yUkIv8lJCL/JSQi/yUkIv8lJCL/JSQi/yUkIv8lJCL/JSQi/yUk
+ Iv8lJCL/hYSB/8XCv//Fwr//ure1/4iCe6Ts7OwT////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A/v7+Aejo6BeTj4qOtrOw/8TBvv/Gw8D/xsPA/8bDwP+GhIL/JSQj/yYl
+ JP8mJST/JiUk/yYlJP8mJST/JiUk/yYlJP8mJST/JiUk/yYlJP8mJST/JiUk/yYlJP8mJST/JiUk/yYl
+ JP8mJST/JiUk/yYlJP8kIyL/rquo/8bDwP/Gw8D/uLWy/5+dmHjy8vIN////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A8vLyDa+tq16ppaH5w8C9/8fEwf/HxMH/x8TB/1ta
+ WP8mJST/JyYl/ycmJf8nJiX/JyYl/ycmJf8nJiX/JyYl/ycmJf8nJiX/JyYl/ycmJf8nJiX/JyYl/ycm
+ Jf8nJiX/JyYl/ycmJf8nJiX/JyYl/ycmJf8mJST/x8TB/8fEwf/Gw8D/rquo/Li3tVH5+fkG////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD5+fkG0NDQMI6KguHBv7v/yMbC/8jG
+ wv/IxsL/T09N/ykoJv8pKCb/KSgm/ykoJv8pKCb/KSgm/ykoJv8pKCb/KSgm/ykoJv8pKCb/KSgm/yko
+ Jv8pKCb/KSgm/ykoJv8pKCb/KSgm/ykoJv8pKCb/KSgm/ykoJv8wLy7/yMbC/8jGwv/GxMD/mZaP79HR
+ 0S/+/v4B////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP7+/gHm5uYZh4J6p7y7
+ t//IxsL/ycfD/8nHw/9lZGL/Kikn/yopJ/8qKSf/Kikn/yopJ/8qKSf/Kikn/yopJ/8qKSf/Kikn/yop
+ J/8qKSf/Kikn/yopJ/8qKSf/Kikn/yopJ/8qKSf/Kikn/yopJ/8qKSf/Kikn/yopJ/9MS0r/ycfD/8nH
+ w//Dwr7/iYR72d3d3SL///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////APf3
+ 9wi8u7pLqaWg+MfFwf/KyMT/ysjE/5uZlv8qKSf/LCsp/ywrKf8sKyn/LCsp/ywrKf8sKyn/LCsp/ywr
+ Kf8sKyn/LCsp/ywrKf8oJyX/Ozo4/2BfXP+Afnv/kZCM/5ORjv+JiIX/dXRx/1hXVP87Ojj/KSgn/ywr
+ Kf90cnD/ysjE/8rIxP/Av7v/hH51tubm5hn///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AOfn5xiGgHiswL67/8vJxv/Lycb/y8nG/y8tK/8uLCr/Liwq/y4sKv8uLCr/Liwq/y4s
+ Kv8uLCr/Liwq/y4sKv8uLCr/Kyoo/3Rzcf/Ewr//y8nG/8vJxv/Lycb/y8nG/8vJxv/Lycb/y8nG/8vJ
+ xv/Lycb/ycfE/5WTkf+0srD/y8nG/8vJxv+9vLn/l5OOiO/v7xD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A+/v7BM7OzTOdmJHuycbD/83Kx//Nysf/eHZ1/y8uLP8vLiz/Ly4s/y8u
+ LP8vLiz/Ly4s/y8uLP8vLiz/Ly4s/y8uLP9GRUP/zcrH/83Kx//Nysf/zcrH/83Kx/+3tLH/i4mH/3d1
+ c/93dXP/jIqI/7e0sf/Nysf/zcrH/83Kx//Nysf/zcrH/83Kx/+3s7D9r66sWvT09Av///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A9PT0C6akoG+9u7j/zcvH/87MyP/OzMj/MC8t/zEw
+ Lf8xMC3/MTAt/zEwLf8xMC3/MTAt/zEwLf8xMC3/MTAt/1dVU//OzMj/QkE//y0sKf8vLiz/T05M/zY1
+ M/8tLCv/MTAt/zEwLf8xMC3/MTAt/y0sKv8yMS//iIeD/87MyP/OzMj/zszI/87MyP/Bv7r+i4Z/nubm
+ 5hn+/v4B////AP///wD///8A////AP///wD///8A////AP///wD///8A6OjoF4aBeKzEw7//z83J/8/N
+ yf+Zl5X/MzIv/zMyL/8zMi//MzIv/zMyL/8zMi//MzIv/zMyL/8zMi//PTw6/8/Nyf8/Pjv/MzIv/zMy
+ L/8zMi//MzIv/zMyL/8zMi//MzIv/zMyL/8zMi//MzIv/zMyL/8zMi//MzIv/0A/Pf/Ny8f/z83J/8/N
+ yf/Mysb/sK6q+rOysFn09PQL////AP///wD///8A////AP///wD///8A////AP///wD+/v4B29vbJI2H
+ f9nLyMX/0c7L/9HOy/9UU1H/NTMx/zUzMf81MzH/NTMx/zUzMf81MzH/NTMx/zUzMf8wLiz/ure1/9HO
+ y/8vLiz/NTMx/zUzMf81MzH/NTMx/zUzMf81MzH/NTMx/zUzMf81MzH/NTMx/zUzMf81MzH/NTMx/zUz
+ Mf88Ozn/0c7L/9HOy//Rzsv/ycbD/4mCesvg4OAf/v7+Af///wD///8A////AP///wD///8A////AP//
+ /wD7+/sExMTCQaupovbQzsr/0tDM/7y7t/80MzH/NzUz/zc1M/83NTP/NzUz/zc1M/83NTP/NzUz/zc1
+ M/9NTEv/0tDM/9LQzP8wLy7/NzUz/zc1M/83NTP/NzUz/zc1M/83NTP/NzUz/zc1M/83NTP/NzUz/zc1
+ M/83NTP/NzUz/zc1M/83NTP/ZmZj/9LQzP/S0Mz/0M7K/7Oxrfq+vbtK+fn5Bv///wD///8A////AP//
+ /wD///8A////AP///wD19fUKqaajbMLBvv/T0c7/09HO/42Miv8yMS//OTc0/zk3NP85NzT/OTc0/zk3
+ NP85NzT/OTc0/zg2M/+lpaL/09HO/9PRzv9FREL/OTc0/zk3NP85NzT/OTc0/zk3NP85NzT/OTc0/zk3
+ NP85NzT/OTc0/zk3NP85NzT/OTc0/zk3NP85NzT/MjAv/8jGw//T0c7/09HO/8XDwP+YlI+I7+/vEP//
+ /wD///8A////AP///wD///8A////AP///wDu7u4RlZGKkcjGwv/V08//1dPP/2ppZ/85ODX/Ojk2/zo5
+ Nv86OTb/Ojk2/zo5Nv86OTb/Ojk2/zIxMP/V08//1dPP/9XTz/+GhYL/Ojk2/zo5Nv86OTb/Ojk2/zo5
+ Nv86OTb/Ojk2/zo5Nv86OTb/Ojk2/zo5Nv86OTb/Ojk2/zo5Nv86OTb/Ojk2/358ef/V08//1dPP/83L
+ x/+GgHbA3t3dIv39/QL///8A////AP///wD///8A////AP///wDo6OgXiIJ5rcvJxf/W1ND/1tTQ/1FQ
+ Tv88Ozj/PDs4/zw7OP88Ozj/PDs4/zw7OP88Ozj/PDs4/zw7Of/W1ND/1tTQ/9bU0P9mZGL/PDs4/zw7
+ OP88Ozj/PDs4/zw7OP88Ozj/PDs4/zw7OP88Ozj/PDs4/zw7OP88Ozj/PDs4/zw7OP88Ozj/PDs4/0RD
+ Qf+sqqb/1tTQ/9HPy/+YlIzlvr27Tfj4+Af///8A////AP///wD///8A////AP///wDk5OQbh4J4vc/M
+ yf/Y1dL/2NXS/0VEQv8+PTr/Pj06/z49Ov8+PTr/Pj06/z49Ov8+PTr/Pj06/05MS//Y1dL/2NXS/9jV
+ 0v9IRkT/Pj06/z49Ov8+PTr/Pj06/z49Ov8+PTr/Pj06/z49Ov8+PTr/Pj06/z49Ov8+PTr/Pj06/z49
+ Ov8+PTr/Pj06/zc2NP+EgoD/2NXS/9XS0P+yraj2pKGcd/Ly8g3///8A////AP///wD///8A////AP//
+ /wDj4+MciYN5w9DPy//Z19P/2dfT/0FBP/9APzz/QD88/0A/PP9APzz/QD88/0A/PP9APzz/QD88/11c
+ Wv/Z19P/2dfT/9nX0/9APz3/QD88/0A/PP9APzz/QD88/0A/PP9APzz/QD88/0A/PP9APzz/QD88/0A/
+ PP9APzz/QD88/0A/PP9APzz/QD88/zY1M/9xb2z/2dfT/9jW0v/Avbn8mJSOjO/v7xD///8A////AP//
+ /wD///8A////AP///wDj4+MciIJ4wNHQzf/a2NX/2tjV/0RDQf9DQT3/Q0E9/0NBPf9DQT3/Q0E9/0NB
+ Pf9DQT3/REI+/19eXP/a2NX/2tjV/9rY1f9FREL/TUpG/01KRv9MSkb/TEpF/0tJRf9LSUT/SkhD/0lH
+ Qv9IRkL/R0VB/0dEQP9GRED/RUM//0VDPv9EQj7/REI+/zg2M/9sa2j/2tjV/9nX1P/HxcH9lZGKke/v
+ 7xD///8A////AP///wD///8A////AP///wDn5+cYiYN4s9LQzP/c2tb/3NrW/05NS/9FQz//RUM//0ZE
+ QP9KSET/UE5J/1lWUf9jYFr/aWZg/2JhX//c2tb/3NrW/9za1v9WVVT/WFZR/1ZUT/9UUk3/UlBL/1FO
+ Sv9PTUj/TkxH/01LRv9MSkb/S0lF/0tIRP9KSEP/SUdD/0lHQv9IRkL/SEZB/zs5Nv95eHb/3NrW/9rY
+ 1P+9urT5n5uWgfHx8Q7///8A////AP///wD///8A////AP///wDs7OwTkYyEm9DOyv/d29f/3dvX/2pp
+ Zv9WVFD/YmBd/2lnZP9samf/bGpn/2xqZ/9samf/bGpn/1pYVv/d29f/3dvX/93b1/91dHH/XltW/1tY
+ U/9ZVlH/V1RP/1VSTv9TUUz/UlBL/1FPSv9QTUn/T0xI/05MR/9NS0b/TEpG/0tJRf9LSUT/SkhE/0FA
+ Pv+dm5n/3dvX/9rY1P+kn5fstLKvXfb29gn///8A////AP///wD///8A////AP///wDy8vINoZ6Ze87M
+ yf/f3Nn/39zZ/5COjf9mZmL/bWxp/21saf9tbGn/bWxp/21saf9tbGn/bWxp/1taVv/f3Nn/39zZ/9/c
+ 2f+wrqv/YV9Z/2FfWf9eXFf/XFlU/1pXUv9YVlH/VlRP/1VSTv9TUU3/UlBL/1FPSv9QTkr/T01J/09M
+ SP9OTEf/TUtH/2RiYP/Qzcr/39zZ/9vY1f+WkIfgwL++SPj4+Af///8A////AP///wD///8A////AP//
+ /wD4+PgHube1U8LAuvve3Nj/4N7a/7e1sv9cW1n/bm1q/25tav9ubWr/bm1q/25tav9ubWr/bm1q/2lo
+ Zf/Avrv/4N7a/+De2v/g3tr/UVBN/2dmYP9jYl3/YV9a/15dV/9cWlb/WlhU/1hXUv9WVVH/VVRP/1RT
+ Tv9TUk3/UlFM/1FQS/9QT0r/T05K/0VEQP+fnpv/4N7a/93b1/+0sav0pqOfdPLy8g3///8A////AP//
+ /wD///8A////AP///wD+/v4B1NTTLKCblObd29j/4d/c/+Lg3f9eXlz/cG9s/3BvbP9wb2z/cG9s/3Bv
+ bP9wb2z/cG9s/3BvbP92dXP/4d/c/+Hf3P/h39z/n56b/25tZv9ramT/Z2Zh/2RjXf9hYFv/X15Z/11c
+ V/9bWlX/WVhT/1hXUv9WVVH/VVRQ/1RTT/9TUk7/UlFN/0dGQv9aWVf/4d/c/+De2//U0s//jYd+qenp
+ 6Rb///8A////AP///wD///8A////AP///wD///8A4+PjHIqEe77a2NT/4+Hd/+Ph3f+KiYf/cXBt/3Fw
+ bf9xcG3/cXBt/3Fwbf9xcG3/cXBt/3Fwbf9fXVv/4N7a/+Ph3f/j4d3/4+Hd/21raf9xcGv/b2xm/2to
+ Y/9oZWD/ZWJd/2JgW/9gXVj/XlxX/1xaVf9bWFP/WVdS/1hVUf9XVFD/VlNP/1JQTP9KSEb/4+Hd/+Ph
+ 3f/Z19P/joh9xOTk5Bv///8A////AP///wD///8A////AP///wD///8A7+/vEJuXkInV08//5OLe/+Ti
+ 3v/W1ND/ZGNh/3Nxbv9zcW7/c3Fu/3Nxbv9zcW7/c3Fu/3Nxbv9zcW7/cnFw/+Ti3v/k4t7/5OLe/+Ti
+ 3v9qamj/c3Fu/3Nxa/9vbGf/a2lj/2hmYf9lY17/Y2Fc/2FeWv9fXVj/XVtW/1xZVf9aWFT/WVdT/01K
+ R/9XVlT/5OLe/+Ti3v/X1tL/i4V7sejo6Bf///8A////AP///wD///8A////AP///wD///8A+fn5Br++
+ vEnCv7r64uDc/+Xj3//l49//ZmVi/3VzcP91c3D/dXNw/3VzcP91c3D/dXNw/3VzcP91c3D/b25r/52c
+ mf/l49//5ePf/+Xj3//l49//nZya/1taVP9zcm3/c3Fr/3BtZ/9saWT/aWZh/2dkX/9RT0v/S0pG/1tY
+ VP9fXFj/WllU/3Fvbf/IxsL/5ePf/+Ph3f/Bvrj4op+ZfPHx8Q7///8A////AP///wD///8A////AP//
+ /wD///8A/v7+Ad/f3yCRi4HN39zZ/+fk4f/n5OH/xsPA/2xrZ/92dXH/dnVx/3Z1cf92dXH/dnVx/3Z1
+ cf92dXH/dnVx/21rZ/+ZmJb/5+Th/+fk4f/n5OH/5+Th/+fk4f+6uLX/h4WC/29ta/9raWf/eHZ0/56c
+ mf/a19T/5+Th/8TCv/+pqKX/xMK//+fk4f/n5OH/5+Th/9/c2f+Zk4ray8vJPPr6+gX///8A////AP//
+ /wD///8A////AP///wD///8A////APLy8g2lo5501dPP/+bk4P/o5uL/6Obi/3NycP93dXL/d3Vy/3d1
+ cv93dXL/d3Vy/3d1cv93dXL/d3Vy/3d1cv91c3D/ZmVj/9XU0P/o5uL/6Obi/+jm4v/o5uL/6Obi/+jm
+ 4v/o5uL/6Obi/+jm4v/o5uL/6Obi/93b1//g3tr/6Obi/+jm4v/o5uL/4+He/8zKxf2sqqZp7+/vEP7+
+ /gH///8A////AP///wD///8A////AP///wD///8A////APz8/APa2tolmJKI1+Hf2//p5+P/6efj/+nn
+ 4/9gX1z/eXdz/3l3c/95d3P/eXdz/3l3c/95d3P/eXdz/3l3c/95d3P/eXdz/2xrZ/9kYmH/npya/83L
+ yP/n5eH/6efj/+nn4//p5+P/3tzY/768uf+Rj43/W1pX/2FfWf+Tko//6efj/+nn4//n5eH/zMnE+pWQ
+ iZbm5uYZ/f39Av///wD///8A////AP///wD///8A////AP///wD///8A////AP///wDy8vINsa+sYMvI
+ w/vm5OD/6ujk/+ro5P/KycX/aGdj/3p4df96eHX/enh1/3p4df96eHX/enh1/3p4df96eHX/enh1/3p4
+ df96eHX/enh1/3Jvbf9oZmP/Y2Fg/2JgX/9kY2H/bGtn/3h2cv96eHX/enZw/3Zybf9hYF7/6ujk/+ro
+ 5P/n5eH/paCX6MrKyjX5+fkG////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD9/f0C5eXlGpCKgaXb2df/6efk/+vp5v/r6eb/uLa0/2tqZ/97eXX/e3l1/3t5df97eXX/e3l1/3t5
+ df97eXX/e3l1/3t5df97eXX/e3l1/3t5df97eXX/e3l1/3t5df97eXX/e3l1/3t5df97eXX/e3l1/3t5
+ c/9aWFL/6+nm/+vp5v/p5+T/y8jE+7y7uU74+PgH////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A+vr6BdfX1yiXkYjV4uDd/+vp5v/s6uf/7Orn/8G/vP9lZGL/fXp2/316
+ dv99enb/fXp2/316dv99enb/fXp2/316dv99enb/fXp2/316dv99enb/fXp2/316dv99enb/fXp2/316
+ dv99enb/fXp2/316dv92c2z/yMfE/+zq5//s6uf/3NrY/5yYkojv7+8Q////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////APX19QrCwb9Framh6uXj4P/s6uf/7evo/+3r
+ 6P/e3dr/ZGNh/318eP99fHj/fXx4/318eP99fHj/fXx4/318eP99fHj/fXx4/318eP99fHj/fXx4/318
+ eP99fHj/fXx4/318eP99fHj/fXx4/318eP99fHj/jIuJ/+3r6P/t6+j/5OLf/5CKf8Pj4+Mc////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP7+/gHw8PAPtrSyWLOu
+ p+3m4+D/7ern/+/s6f/v7On/7+zp/6WjoP9kYmD/fn15/359ef9+fXn/fn15/359ef9+fXn/fn15/359
+ ef9+fXn/fn15/359ef9+fXn/fn15/359ef9+fXn/fn15/359ef9+fXn/Y2Jg/+/s6f/v7On/6ufk/6un
+ n+nV1dQr/v7+Af///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD+/v4B7+/vELu6uFCinZTf4uDd/+zq5//v7er/7+3q/+/t6v/v7er/n52b/2JhX/90c2//f315/399
+ ef9/fXn/f315/399ef9/fXn/f315/399ef9/fXn/f315/399ef9/fXn/f315/399ef93dnL/Z2Zk/+/t
+ 6v/v7er/7Orn/8TBvffJyMc9/f39Av///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A/v7+AfLy8g3Ozc00j4l+vdza2P/q6OX/7+3q//Du6//w7uv/8O7r//Du
+ 6//c2tf/lJOQ/2hnZf9jY2D/a2pm/3Rzb/98enb/fXt4/358eP95d3T/cXBs/2ppZv9kY1//aWhm/5CP
+ jv/Y1tP/8O7r//Du6//w7uv/6ujl/6ynoOjW1tYp/v7+Af///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD4+PgH3t7eIZ+alIW2sart5OLe/+zq
+ 5v/w7ur/8e/r//Hv6//x7+v/7uzo/8fGw/+amZb/fHt4/2lnZf9kZGD/ZGNg/2RjYP9lZGH/a2po/4GA
+ ff+enJn/x8bD/+7s6P/x7+v/8e/r//Hv6//v7en/4N7a/5KMgafp6ekW////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A+/v7BOzs
+ 7BPIx8Y9j4l+rLu4sfHi4Nz/6ujl//Du6v/y8Oz/8vDs//Lw7P/y8Oz/8vDs//Lw7P/y8Oz/8vDs//Lw
+ 7P/y8Oz/8vDs//Lw7P/y8Oz/8vDs//Lw7P/y8Oz/8O7q/+ro5f/f3dn/lpCFy9XU1Cz5+fkG////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP7+/gH4+PgH5ubmGcbFxD+YlIyUnpeO18zKxPni4Nz/6Obi/+zq5v/w7ur/8vDs//Px
+ 7f/z8e3/8/Ht//Px7f/z8e3/8/Ht//Lw7P/w7ur/7Orm/+jm4v/i4Nz/z83I+p+aj9qdmJGM2traJff3
+ 9wj///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A/v7+Afn5+Qbt7e0S3NzcI7++vEqhnph/joh9tKKc
+ k97Bvbbz3NnW/ebk4f/o5uP/6efk/+nn5P/o5uP/5uTh/9jV0fy+urTyoJqS3o6Hfbainph/v768S9vb
+ 2yTu7u4R+/v7BP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A/v7+Afn5
+ +Qbx8fEO5OTkG8vKyD2vrahonZiRjJGLgaePiX63kIp/vpCJfr2PiX6zlI6FoZ+blYexrqtly8vJPOTk
+ 5Bvx8fEO+fn5Bv7+/gH///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAA=
+
+
\ No newline at end of file
diff --git a/Aura Debugger/Aura Debugger/NetworkManager.cs b/Aura Debugger/Aura Debugger/NetworkManager.cs
new file mode 100644
index 0000000..cde27bc
--- /dev/null
+++ b/Aura Debugger/Aura Debugger/NetworkManager.cs
@@ -0,0 +1,197 @@
+using System;
+using System.IO;
+using System.ComponentModel;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Net;
+using System.Net.Sockets;
+using System.Drawing;
+
+namespace Aura_Debugger
+{
+ public static class NetworkManager
+ {
+ public static TcpListener Listener;
+ public static TcpClient Client;
+
+ public static string IP;
+ public static int Port;
+ public static int PacketNumber;
+ public static bool Connected;
+ public static bool Waiting;
+
+ public static void Initialize()
+ {
+ // reset values
+ Listener = null;
+ Client = null;
+ PacketNumber = 0;
+ Port = 0;
+ IP = "0.0.0.0";
+
+ // not connected
+ Connected = false;
+ Waiting = false;
+ }
+
+ public static void WriteToLog(string text)
+ {
+ Program.MainForm.WriteTextBox(text);
+ }
+
+ public static void WriteInfo(string text)
+ {
+ Program.MainForm.WriteTextBox("[ ");
+ Program.MainForm.WriteTextBox(">>>", Color.Cyan);
+ Program.MainForm.WriteTextBox(" ] ");
+ Program.MainForm.WriteTextBox(text + Environment.NewLine);
+ }
+
+ public static void WriteError(string text)
+ {
+ Program.MainForm.WriteTextBox("[ ");
+ Program.MainForm.WriteTextBox("ERROR", Color.Red);
+ Program.MainForm.WriteTextBox(" ] ");
+ Program.MainForm.WriteTextBox(text + Environment.NewLine);
+ }
+
+ public static void WaitForConnection()
+ {
+ Listener = null;
+ Waiting = true;
+
+ try
+ {
+ Listener = new TcpListener(IPAddress.Any, Port);
+ Listener.Start();
+
+ int i = 0;
+ byte[] bytes = new byte[256];
+
+ while (true)
+ {
+ WriteInfo("Waiting for a connection...");
+ Program.MainForm.WaitState();
+
+ Client = Listener.AcceptTcpClient();
+ WriteInfo("Connected!");
+
+ Connected = true;
+ Waiting = false;
+ Program.MainForm.ConnectedState();
+
+ NetworkStream stream = Client.GetStream();
+ while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
+ {
+ PacketNumber++;
+ WriteToLog(Encoding.ASCII.GetString(bytes, 0, i));
+ }
+
+ Client.Close();
+ WriteInfo("Connection closed!");
+ Program.MainForm.ResetState();
+ Connected = false;
+ }
+ }
+ // socket exception error
+ catch (SocketException e)
+ {
+ if (e.SocketErrorCode == SocketError.Interrupted) { }
+ else { WriteError("Socket Exception: " + e); }
+ Program.MainForm.ResetState();
+ Waiting = false;
+ Connected = false;
+ }
+ // stop listening and print message
+ finally
+ {
+ Listener.Stop();
+ WriteInfo("Connection closed!");
+ Program.MainForm.ResetState();
+ Waiting = false;
+ Connected = false;
+ }
+ }
+
+ public static void Connect(string addr)
+ {
+ Waiting = true;
+
+ // parse input string
+ string[] parts = addr.Split(':');
+ string ip = string.Empty;
+ string port = string.Empty;
+
+ if (parts.Length >= 1) { ip = parts[0]; }
+ if (parts.Length >= 2) { port = parts[1]; }
+
+ // set ip
+ IP = ip;
+
+ // parse and set port
+ if (!int.TryParse(port, out Port))
+ {
+ WriteError("Invalid port " + port);
+ Program.MainForm.ResetState();
+ return;
+ }
+
+ // validate port
+ if (Port >= 0xFFFF)
+ {
+ WriteError("Invalid port " + Port.ToString());
+ Program.MainForm.ResetState();
+ return;
+ }
+
+ try
+ {
+ int i = 0;
+ byte[] bytes = new byte[256];
+
+ while (true)
+ {
+ WriteInfo("Waiting to connect...");
+ Program.MainForm.ConnectingState();
+
+ Client = new TcpClient();
+ Client.Connect(ip, Port);
+
+ WriteInfo("Connected!");
+ Connected = true;
+ Waiting = false;
+ Program.MainForm.ConnectedState();
+
+ NetworkStream stream = Client.GetStream();
+ while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
+ {
+ PacketNumber++;
+ WriteToLog(Encoding.ASCII.GetString(bytes, 0, i));
+ }
+
+ Client.Close();
+ WriteInfo("Connection closed!");
+ Program.MainForm.ResetState();
+ Connected = false;
+ }
+ }
+ catch (SocketException e)
+ {
+ if (e.SocketErrorCode == SocketError.Interrupted) { }
+ else { WriteError("Socket Exception: " + e); }
+ Program.MainForm.ResetState();
+ Waiting = false;
+ Connected = false;
+ }
+ finally
+ {
+ WriteInfo("Connection closed!");
+ Program.MainForm.ResetState();
+ Waiting = false;
+ Connected = false;
+ }
+ }
+ }
+}
diff --git a/Aura Debugger/Aura Debugger/Program.cs b/Aura Debugger/Aura Debugger/Program.cs
index 9809538..eed9444 100644
--- a/Aura Debugger/Aura Debugger/Program.cs
+++ b/Aura Debugger/Aura Debugger/Program.cs
@@ -8,15 +8,16 @@ namespace Aura_Debugger
{
static class Program
{
- ///
- /// Point d'entrée principal de l'application.
- ///
+ public static Form1 MainForm;
+
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
- Application.Run(new Form1());
+
+ MainForm = new Form1();
+ Application.Run(MainForm);
}
}
}